text: // 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() {
    /** 依次执行cleanupNode并删除 */
    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;
      }
    }
  }
  
  /** 向链表头部添加cleanup */
  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
  