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