Coverage Report

Created: 2025-06-10 13:21

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