git / moonbite-core / src/leveldb/table/iterator.cc · 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.#include "leveldb/iterator.h"namespace leveldb {Iterator::Iterator() {  cleanup_head_.function = nullptr;  cleanup_head_.next = nullptr;}Iterator::~Iterator() {  if (!cleanup_head_.IsEmpty()) {    cleanup_head_.Run();    for (CleanupNode* node = cleanup_head_.next; node != nullptr;) {      node->Run();      CleanupNode* next_node = node->next;      delete node;      node = next_node;    }  }}void Iterator::RegisterCleanup(CleanupFunction func, void* arg1, void* arg2) {  assert(func != nullptr);  CleanupNode* node;  if (cleanup_head_.IsEmpty()) {    node = &cleanup_head_;  } else {    node = new CleanupNode();    node->next = cleanup_head_.next;    cleanup_head_.next = node;  }  node->function = func;  node->arg1 = arg1;  node->arg2 = arg2;}namespace {class EmptyIterator : public Iterator { public:  EmptyIterator(const Status& s) : status_(s) {}  ~EmptyIterator() override = default;  bool Valid() const override { return false; }  void Seek(const Slice& target) override {}  void SeekToFirst() override {}  void SeekToLast() override {}  void Next() override { assert(false); }  void Prev() override { assert(false); }  Slice key() const override {    assert(false);    return Slice();  }  Slice value() const override {    assert(false);    return Slice();  }  Status status() const override { return status_; } private:  Status status_;};}  // anonymous namespaceIterator* NewEmptyIterator() { return new EmptyIterator(Status::OK()); }Iterator* NewErrorIterator(const Status& status) {  return new EmptyIterator(status);}}  // namespace leveldb