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
7namespace leveldb {
8
9Iterator::Iterator() {
10  cleanup_.function = NULL;
11  cleanup_.next = NULL;
12}
13
14Iterator::~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
26void 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
41namespace {
42class 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
59Iterator* NewEmptyIterator() {
60  return new EmptyIterator(Status::OK());
61}
62
63Iterator* NewErrorIterator(const Status& status) {
64  return new EmptyIterator(status);
65}
66
67}  // namespace leveldb
68