github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/database/leveldb.chai2010/src/iterator.cc (about)

     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