• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
Iterator()9 Iterator::Iterator() {
10   cleanup_.function = NULL;
11   cleanup_.next = NULL;
12 }
13 
~Iterator()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 
RegisterCleanup(CleanupFunction func,void * arg1,void * arg2)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:
EmptyIterator(const Status & s)44   EmptyIterator(const Status& s) : status_(s) { }
Valid() const45   virtual bool Valid() const { return false; }
Seek(const Slice & target)46   virtual void Seek(const Slice& target) { }
SeekToFirst()47   virtual void SeekToFirst() { }
SeekToLast()48   virtual void SeekToLast() { }
Next()49   virtual void Next() { assert(false); }
Prev()50   virtual void Prev() { assert(false); }
key() const51   Slice key() const { assert(false); return Slice(); }
value() const52   Slice value() const { assert(false); return Slice(); }
status() const53   virtual Status status() const { return status_; }
54  private:
55   Status status_;
56 };
57 }  // namespace
58 
NewEmptyIterator()59 Iterator* NewEmptyIterator() {
60   return new EmptyIterator(Status::OK());
61 }
62 
NewErrorIterator(const Status & status)63 Iterator* NewErrorIterator(const Status& status) {
64   return new EmptyIterator(status);
65 }
66 
67 }  // namespace leveldb
68