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