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_ |
93 | |