git / moonbite-core / src/leveldb/table/iterator_wrapper.h · raw

// 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_