/root/bitcoin/src/leveldb/table/iterator_wrapper.h
Line | Count | Source (jump to first uncovered line) |
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 | 0 | IteratorWrapper() : iter_(nullptr), valid_(false) {} |
20 | 0 | explicit IteratorWrapper(Iterator* iter) : iter_(nullptr) { Set(iter); } |
21 | 0 | ~IteratorWrapper() { delete iter_; } |
22 | 0 | 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 | 0 | void Set(Iterator* iter) { |
27 | 0 | delete iter_; |
28 | 0 | iter_ = iter; |
29 | 0 | if (iter_ == nullptr) { |
30 | 0 | valid_ = false; |
31 | 0 | } else { |
32 | 0 | Update(); |
33 | 0 | } |
34 | 0 | } |
35 | | |
36 | | // Iterator interface methods |
37 | 0 | bool Valid() const { return valid_; } |
38 | 0 | Slice key() const { |
39 | 0 | assert(Valid()); |
40 | 0 | return key_; |
41 | 0 | } |
42 | 0 | Slice value() const { |
43 | 0 | assert(Valid()); |
44 | 0 | return iter_->value(); |
45 | 0 | } |
46 | | // Methods below require iter() != nullptr |
47 | 0 | Status status() const { |
48 | 0 | assert(iter_); |
49 | 0 | return iter_->status(); |
50 | 0 | } |
51 | 0 | void Next() { |
52 | 0 | assert(iter_); |
53 | 0 | iter_->Next(); |
54 | 0 | Update(); |
55 | 0 | } |
56 | 0 | void Prev() { |
57 | 0 | assert(iter_); |
58 | 0 | iter_->Prev(); |
59 | 0 | Update(); |
60 | 0 | } |
61 | 0 | void Seek(const Slice& k) { |
62 | 0 | assert(iter_); |
63 | 0 | iter_->Seek(k); |
64 | 0 | Update(); |
65 | 0 | } |
66 | 0 | void SeekToFirst() { |
67 | 0 | assert(iter_); |
68 | 0 | iter_->SeekToFirst(); |
69 | 0 | Update(); |
70 | 0 | } |
71 | 0 | void SeekToLast() { |
72 | 0 | assert(iter_); |
73 | 0 | iter_->SeekToLast(); |
74 | 0 | Update(); |
75 | 0 | } |
76 | | |
77 | | private: |
78 | 0 | void Update() { |
79 | 0 | valid_ = iter_->Valid(); |
80 | 0 | if (valid_) { |
81 | 0 | key_ = iter_->key(); |
82 | 0 | } |
83 | 0 | } |
84 | | |
85 | | Iterator* iter_; |
86 | | bool valid_; |
87 | | Slice key_; |
88 | | }; |
89 | | |
90 | | } // namespace leveldb |
91 | | |
92 | | #endif // STORAGE_LEVELDB_TABLE_ITERATOR_WRAPPER_H_ |