// 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 namespace Iterator* NewEmptyIterator() { return new EmptyIterator(Status::OK()); } Iterator* NewErrorIterator(const Status& status) { return new EmptyIterator(status); } } // namespace leveldb