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