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_(nullptr), valid_(false) {} IteratorWrapper(Iterator * iter)20 explicit IteratorWrapper(Iterator* iter) : iter_(nullptr) { Set(iter); } ~IteratorWrapper()21 ~IteratorWrapper() { delete iter_; } iter()22 Iterator* iter() const { return iter_; } 23 24 // Takes ownership of "iter" and will delete it when destroyed, or 25 // when Set() is invoked again. Set(Iterator * iter)26 void Set(Iterator* iter) { 27 delete iter_; 28 iter_ = iter; 29 if (iter_ == nullptr) { 30 valid_ = false; 31 } else { 32 Update(); 33 } 34 } 35 36 // Iterator interface methods Valid()37 bool Valid() const { return valid_; } key()38 Slice key() const { 39 assert(Valid()); 40 return key_; 41 } value()42 Slice value() const { 43 assert(Valid()); 44 return iter_->value(); 45 } 46 // Methods below require iter() != nullptr status()47 Status status() const { 48 assert(iter_); 49 return iter_->status(); 50 } Next()51 void Next() { 52 assert(iter_); 53 iter_->Next(); 54 Update(); 55 } Prev()56 void Prev() { 57 assert(iter_); 58 iter_->Prev(); 59 Update(); 60 } Seek(const Slice & k)61 void Seek(const Slice& k) { 62 assert(iter_); 63 iter_->Seek(k); 64 Update(); 65 } SeekToFirst()66 void SeekToFirst() { 67 assert(iter_); 68 iter_->SeekToFirst(); 69 Update(); 70 } SeekToLast()71 void SeekToLast() { 72 assert(iter_); 73 iter_->SeekToLast(); 74 Update(); 75 } 76 77 private: Update()78 void Update() { 79 valid_ = iter_->Valid(); 80 if (valid_) { 81 key_ = iter_->key(); 82 } 83 } 84 85 Iterator* iter_; 86 bool valid_; 87 Slice key_; 88 }; 89 90 } // namespace leveldb 91 92 #endif // STORAGE_LEVELDB_TABLE_ITERATOR_WRAPPER_H_ 93