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
11namespace 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.
17class 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