iterator_wrapper.h raw

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