xref: /aosp_15_r20/external/leveldb/table/iterator_wrapper.h (revision 9507f98c5f32dee4b5f9e4a38cd499f3ff5c4490)
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