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