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"
  #include "util/logging.h"
  
  namespace leveldb {
  
  Iterator::Iterator() {
    cleanup_.function = NULL;
    cleanup_.next = NULL;
  }
  
  Iterator::~Iterator() {
    if (cleanup_.function != NULL) {
      (*cleanup_.function)(cleanup_.arg1, cleanup_.arg2);
      for (Cleanup* c = cleanup_.next; c != NULL; ) {
        (*c->function)(c->arg1, c->arg2);
        Cleanup* next = c->next;
        delete c;
        c = next;
      }
    }
  }
  
  void Iterator::RegisterCleanup(CleanupFunction func, void* arg1, void* arg2) {
    assert(func != NULL);
    Cleanup* c;
    if (cleanup_.function == NULL) {
      c = &cleanup_;
    } else {
      c = new Cleanup;
      c->next = cleanup_.next;
      cleanup_.next = c;
    }
    c->function = func;
    c->arg1 = arg1;
    c->arg2 = arg2;
  }
  
  namespace {
  class EmptyIterator : public Iterator {
   public:
    EmptyIterator(const Status& s) : status_(s) { }
    virtual bool Valid() const { return false; }
    virtual void Seek(const Slice& target) { }
    virtual void SeekToFirst() { }
    virtual void SeekToLast() { }
    virtual void Next() { assert(false); }
    virtual void Prev() { assert(false); }
    Slice key() const { assert(false); return Slice(); }
    Slice value() const { assert(false); return Slice(); }
    virtual Status status() const { return status_; }
   private:
    Status status_;
  };
  }
  
  Iterator* NewEmptyIterator() {
    return new EmptyIterator(Status::OK());
  }
  
  Iterator* NewErrorIterator(const Status& status) {
    return new EmptyIterator(status);
  }
  
  }
  