summaryrefslogtreecommitdiff
path: root/lib/leveldb/table/iterator_wrapper.h
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-03-08 11:35:54 +1100
committerjacqueline <me@jacqueline.id.au>2023-03-08 11:35:54 +1100
commit4887f3789817f87bf1272af0b52684e3364270c2 (patch)
tree945eb707ab4a0f6f0a6632dbb732dcc2ee2b39a8 /lib/leveldb/table/iterator_wrapper.h
parentd01f1bee1082840fdf50aa7ddd36dbcbff286d7e (diff)
downloadtangara-fw-4887f3789817f87bf1272af0b52684e3364270c2.tar.gz
add leveldb
Diffstat (limited to 'lib/leveldb/table/iterator_wrapper.h')
-rw-r--r--lib/leveldb/table/iterator_wrapper.h92
1 files changed, 92 insertions, 0 deletions
diff --git a/lib/leveldb/table/iterator_wrapper.h b/lib/leveldb/table/iterator_wrapper.h
new file mode 100644
index 00000000..c2305725
--- /dev/null
+++ b/lib/leveldb/table/iterator_wrapper.h
@@ -0,0 +1,92 @@
+// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file. See the AUTHORS file for names of contributors.
+
+#ifndef STORAGE_LEVELDB_TABLE_ITERATOR_WRAPPER_H_
+#define STORAGE_LEVELDB_TABLE_ITERATOR_WRAPPER_H_
+
+#include "leveldb/iterator.h"
+#include "leveldb/slice.h"
+
+namespace leveldb {
+
+// A internal wrapper class with an interface similar to Iterator that
+// caches the valid() and key() results for an underlying iterator.
+// This can help avoid virtual function calls and also gives better
+// cache locality.
+class IteratorWrapper {
+ public:
+ IteratorWrapper() : iter_(nullptr), valid_(false) {}
+ explicit IteratorWrapper(Iterator* iter) : iter_(nullptr) { Set(iter); }
+ ~IteratorWrapper() { delete iter_; }
+ Iterator* iter() const { return iter_; }
+
+ // Takes ownership of "iter" and will delete it when destroyed, or
+ // when Set() is invoked again.
+ void Set(Iterator* iter) {
+ delete iter_;
+ iter_ = iter;
+ if (iter_ == nullptr) {
+ valid_ = false;
+ } else {
+ Update();
+ }
+ }
+
+ // Iterator interface methods
+ bool Valid() const { return valid_; }
+ Slice key() const {
+ assert(Valid());
+ return key_;
+ }
+ Slice value() const {
+ assert(Valid());
+ return iter_->value();
+ }
+ // Methods below require iter() != nullptr
+ Status status() const {
+ assert(iter_);
+ return iter_->status();
+ }
+ void Next() {
+ assert(iter_);
+ iter_->Next();
+ Update();
+ }
+ void Prev() {
+ assert(iter_);
+ iter_->Prev();
+ Update();
+ }
+ void Seek(const Slice& k) {
+ assert(iter_);
+ iter_->Seek(k);
+ Update();
+ }
+ void SeekToFirst() {
+ assert(iter_);
+ iter_->SeekToFirst();
+ Update();
+ }
+ void SeekToLast() {
+ assert(iter_);
+ iter_->SeekToLast();
+ Update();
+ }
+
+ private:
+ void Update() {
+ valid_ = iter_->Valid();
+ if (valid_) {
+ key_ = iter_->key();
+ }
+ }
+
+ Iterator* iter_;
+ bool valid_;
+ Slice key_;
+};
+
+} // namespace leveldb
+
+#endif // STORAGE_LEVELDB_TABLE_ITERATOR_WRAPPER_H_