Branch data Line data Source code
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 : 5848 : IteratorWrapper() : iter_(nullptr), valid_(false) {}
20 [ + - + - ]: 17165 : explicit IteratorWrapper(Iterator* iter) : iter_(nullptr) { Set(iter); }
21 [ + + ]: 40178 : ~IteratorWrapper() { delete iter_; }
22 [ + + + + : 13145330 : 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 : 162714 : void Set(Iterator* iter) {
27 [ + + ]: 162714 : delete iter_;
28 : 162714 : iter_ = iter;
29 [ + + ]: 162714 : if (iter_ == nullptr) {
30 : 27477 : valid_ = false;
31 : : } else {
32 : 135237 : Update();
33 : : }
34 : 162714 : }
35 : :
36 : : // Iterator interface methods
37 [ + + - - : 54533433 : bool Valid() const { return valid_; }
- - + + +
+ ][ - - +
+ - - -
- ]
38 : 64123576 : Slice key() const {
39 [ - + ]: 64123576 : assert(Valid());
40 : 64123576 : return key_;
41 : : }
42 : 6187141 : Slice value() const {
43 [ - + ]: 6187141 : assert(Valid());
44 : 6187141 : return iter_->value();
45 : : }
46 : : // Methods below require iter() != nullptr
47 : 126979 : Status status() const {
48 [ - + ]: 126979 : assert(iter_);
49 : 126979 : return iter_->status();
50 : : }
51 : 23695946 : void Next() {
52 [ - + ]: 23695946 : assert(iter_);
53 : 23695946 : iter_->Next();
54 : 23695946 : Update();
55 : 23695946 : }
56 : 0 : void Prev() {
57 [ # # ]: 0 : assert(iter_);
58 : 0 : iter_->Prev();
59 : 0 : Update();
60 : 0 : }
61 : 8508 : void Seek(const Slice& k) {
62 [ - + ]: 8508 : assert(iter_);
63 : 8508 : iter_->Seek(k);
64 : 8508 : Update();
65 : 8508 : }
66 : 116161 : void SeekToFirst() {
67 [ - + ]: 116161 : assert(iter_);
68 : 116161 : iter_->SeekToFirst();
69 : 116161 : Update();
70 : 116161 : }
71 : 0 : void SeekToLast() {
72 [ # # ]: 0 : assert(iter_);
73 : 0 : iter_->SeekToLast();
74 : 0 : Update();
75 : 0 : }
76 : :
77 : : private:
78 : 23955852 : void Update() {
79 : 23955852 : valid_ = iter_->Valid();
80 [ + + ]: 23955852 : if (valid_) {
81 : 23700259 : key_ = iter_->key();
82 : : }
83 : 23955852 : }
84 : :
85 : : Iterator* iter_;
86 : : bool valid_;
87 : : Slice key_;
88 : : };
89 : :
90 : : } // namespace leveldb
91 : :
92 : : #endif // STORAGE_LEVELDB_TABLE_ITERATOR_WRAPPER_H_
|