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