1 // Copyright (c) 2011 The LevelDB Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. See the AUTHORS file for names of contributors. 4 5 #ifndef STORAGE_LEVELDB_TABLE_ITERATOR_WRAPPER_H_ 6 #define STORAGE_LEVELDB_TABLE_ITERATOR_WRAPPER_H_ 7 8 #include "leveldb/iterator.h" 9 #include "leveldb/slice.h" 10 11 namespace leveldb { 12 13 // A internal wrapper class with an interface similar to Iterator that 14 // caches the valid() and key() results for an underlying iterator. 15 // This can help avoid virtual function calls and also gives better 16 // cache locality. 17 class IteratorWrapper { 18 public: IteratorWrapper()19 IteratorWrapper(): iter_(NULL), valid_(false) { } IteratorWrapper(Iterator * iter)20 explicit IteratorWrapper(Iterator* iter): iter_(NULL) { 21 Set(iter); 22 } ~IteratorWrapper()23 ~IteratorWrapper() { delete iter_; } iter()24 Iterator* iter() const { return iter_; } 25 26 // Takes ownership of "iter" and will delete it when destroyed, or 27 // when Set() is invoked again. Set(Iterator * iter)28 void Set(Iterator* iter) { 29 delete iter_; 30 iter_ = iter; 31 if (iter_ == NULL) { 32 valid_ = false; 33 } else { 34 Update(); 35 } 36 } 37 38 39 // Iterator interface methods Valid()40 bool Valid() const { return valid_; } key()41 Slice key() const { assert(Valid()); return key_; } value()42 Slice value() const { assert(Valid()); return iter_->value(); } 43 // Methods below require iter() != NULL status()44 Status status() const { assert(iter_); return iter_->status(); } Next()45 void Next() { assert(iter_); iter_->Next(); Update(); } Prev()46 void Prev() { assert(iter_); iter_->Prev(); Update(); } Seek(const Slice & k)47 void Seek(const Slice& k) { assert(iter_); iter_->Seek(k); Update(); } SeekToFirst()48 void SeekToFirst() { assert(iter_); iter_->SeekToFirst(); Update(); } SeekToLast()49 void SeekToLast() { assert(iter_); iter_->SeekToLast(); Update(); } 50 51 private: Update()52 void Update() { 53 valid_ = iter_->Valid(); 54 if (valid_) { 55 key_ = iter_->key(); 56 } 57 } 58 59 Iterator* iter_; 60 bool valid_; 61 Slice key_; 62 }; 63 64 } // namespace leveldb 65 66 #endif // STORAGE_LEVELDB_TABLE_ITERATOR_WRAPPER_H_ 67