Fix getbalance() bug
[novacoin.git] / src / leveldb / table / iterator.cc
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