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