/ src / leveldb / table / iterator_wrapper.h
iterator_wrapper.h
 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    IteratorWrapper() : iter_(nullptr), valid_(false) {}
20    explicit IteratorWrapper(Iterator* iter) : iter_(nullptr) { Set(iter); }
21    ~IteratorWrapper() { delete 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.
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
37    bool Valid() const { return valid_; }
38    Slice key() const {
39      assert(Valid());
40      return key_;
41    }
42    Slice value() const {
43      assert(Valid());
44      return iter_->value();
45    }
46    // Methods below require iter() != nullptr
47    Status status() const {
48      assert(iter_);
49      return iter_->status();
50    }
51    void Next() {
52      assert(iter_);
53      iter_->Next();
54      Update();
55    }
56    void Prev() {
57      assert(iter_);
58      iter_->Prev();
59      Update();
60    }
61    void Seek(const Slice& k) {
62      assert(iter_);
63      iter_->Seek(k);
64      Update();
65    }
66    void SeekToFirst() {
67      assert(iter_);
68      iter_->SeekToFirst();
69      Update();
70    }
71    void SeekToLast() {
72      assert(iter_);
73      iter_->SeekToLast();
74      Update();
75    }
76  
77   private:
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_