Home | History | Annotate | Download | only in table
      1 // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file. See the AUTHORS file for names of contributors.
      4 
      5 #include "leveldb/iterator.h"
      6 
      7 namespace leveldb {
      8 
      9 Iterator::Iterator() {
     10   cleanup_.function = NULL;
     11   cleanup_.next = NULL;
     12 }
     13 
     14 Iterator::~Iterator() {
     15   if (cleanup_.function != NULL) {
     16     (*cleanup_.function)(cleanup_.arg1, cleanup_.arg2);
     17     for (Cleanup* c = cleanup_.next; c != NULL; ) {
     18       (*c->function)(c->arg1, c->arg2);
     19       Cleanup* next = c->next;
     20       delete c;
     21       c = next;
     22     }
     23   }
     24 }
     25 
     26 void Iterator::RegisterCleanup(CleanupFunction func, void* arg1, void* arg2) {
     27   assert(func != NULL);
     28   Cleanup* c;
     29   if (cleanup_.function == NULL) {
     30     c = &cleanup_;
     31   } else {
     32     c = new Cleanup;
     33     c->next = cleanup_.next;
     34     cleanup_.next = c;
     35   }
     36   c->function = func;
     37   c->arg1 = arg1;
     38   c->arg2 = arg2;
     39 }
     40 
     41 namespace {
     42 class EmptyIterator : public Iterator {
     43  public:
     44   EmptyIterator(const Status& s) : status_(s) { }
     45   virtual bool Valid() const { return false; }
     46   virtual void Seek(const Slice& target) { }
     47   virtual void SeekToFirst() { }
     48   virtual void SeekToLast() { }
     49   virtual void Next() { assert(false); }
     50   virtual void Prev() { assert(false); }
     51   Slice key() const { assert(false); return Slice(); }
     52   Slice value() const { assert(false); return Slice(); }
     53   virtual Status status() const { return status_; }
     54  private:
     55   Status status_;
     56 };
     57 }  // namespace
     58 
     59 Iterator* NewEmptyIterator() {
     60   return new EmptyIterator(Status::OK());
     61 }
     62 
     63 Iterator* NewErrorIterator(const Status& status) {
     64   return new EmptyIterator(status);
     65 }
     66 
     67 }  // namespace leveldb
     68