// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
-// This source code is licensed under the BSD-style license found in the
-// LICENSE file in the root directory of this source tree. An additional grant
-// of patent rights can be found in the PATENTS file in the same directory.
+// This source code is licensed under both the GPLv2 (found in the
+// COPYING file in the root directory) and Apache 2.0 License
+// (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// the valid() and key() results for an underlying iterator.
// This can help avoid virtual function calls and also gives better
// cache locality.
-class IteratorWrapper {
+template <class TValue = Slice>
+class IteratorWrapperBase {
public:
- IteratorWrapper() : iter_(nullptr), valid_(false) {}
- explicit IteratorWrapper(InternalIterator* _iter) : iter_(nullptr) {
+ IteratorWrapperBase() : iter_(nullptr), valid_(false) {}
+ explicit IteratorWrapperBase(InternalIteratorBase<TValue>* _iter)
+ : iter_(nullptr) {
Set(_iter);
}
- ~IteratorWrapper() {}
- InternalIterator* iter() const { return iter_; }
+ ~IteratorWrapperBase() {}
+ InternalIteratorBase<TValue>* iter() const { return iter_; }
// Set the underlying Iterator to _iter and return
// previous underlying Iterator.
- InternalIterator* Set(InternalIterator* _iter) {
- InternalIterator* old_iter = iter_;
+ InternalIteratorBase<TValue>* Set(InternalIteratorBase<TValue>* _iter) {
+ InternalIteratorBase<TValue>* old_iter = iter_;
iter_ = _iter;
if (iter_ == nullptr) {
if (!is_arena_mode) {
delete iter_;
} else {
- iter_->~InternalIterator();
+ iter_->~InternalIteratorBase<TValue>();
}
}
}
// Iterator interface methods
bool Valid() const { return valid_; }
Slice key() const { assert(Valid()); return key_; }
- Slice value() const { assert(Valid()); return iter_->value(); }
+ TValue value() const {
+ assert(Valid());
+ return iter_->value();
+ }
// Methods below require iter() != nullptr
Status status() const { assert(iter_); return iter_->status(); }
void Next() { assert(iter_); iter_->Next(); Update(); }
valid_ = iter_->Valid();
if (valid_) {
key_ = iter_->key();
+ assert(iter_->status().ok());
}
}
- InternalIterator* iter_;
+ InternalIteratorBase<TValue>* iter_;
bool valid_;
Slice key_;
};
+using IteratorWrapper = IteratorWrapperBase<Slice>;
+
class Arena;
// Return an empty iterator (yields nothing) allocated from arena.
-extern InternalIterator* NewEmptyInternalIterator(Arena* arena);
-
-// Return an empty iterator with the specified status, allocated arena.
-extern InternalIterator* NewErrorInternalIterator(const Status& status,
- Arena* arena);
+template <class TValue = Slice>
+extern InternalIteratorBase<TValue>* NewEmptyInternalIterator(Arena* arena);
} // namespace rocksdb