Line data Source code
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 30401 : Iterator::Iterator() {
10 30401 : cleanup_.function = NULL;
11 30401 : cleanup_.next = NULL;
12 30401 : }
13 :
14 30401 : Iterator::~Iterator() {
15 30401 : if (cleanup_.function != NULL) {
16 12793 : (*cleanup_.function)(cleanup_.arg1, cleanup_.arg2);
17 25586 : for (Cleanup* c = cleanup_.next; c != NULL; ) {
18 0 : (*c->function)(c->arg1, c->arg2);
19 0 : Cleanup* next = c->next;
20 0 : delete c;
21 0 : c = next;
22 : }
23 : }
24 30401 : }
25 :
26 12793 : void Iterator::RegisterCleanup(CleanupFunction func, void* arg1, void* arg2) {
27 12793 : assert(func != NULL);
28 : Cleanup* c;
29 12793 : if (cleanup_.function == NULL) {
30 12793 : c = &cleanup_;
31 : } else {
32 0 : c = new Cleanup;
33 0 : c->next = cleanup_.next;
34 0 : cleanup_.next = c;
35 : }
36 12793 : c->function = func;
37 12793 : c->arg1 = arg1;
38 12793 : c->arg2 = arg2;
39 12793 : }
40 :
41 : namespace {
42 0 : class EmptyIterator : public Iterator {
43 : public:
44 0 : EmptyIterator(const Status& s) : status_(s) { }
45 0 : virtual bool Valid() const { return false; }
46 0 : virtual void Seek(const Slice& target) { }
47 0 : virtual void SeekToFirst() { }
48 0 : virtual void SeekToLast() { }
49 0 : virtual void Next() { assert(false); }
50 0 : virtual void Prev() { assert(false); }
51 0 : Slice key() const { assert(false); return Slice(); }
52 0 : Slice value() const { assert(false); return Slice(); }
53 0 : virtual Status status() const { return status_; }
54 : private:
55 : Status status_;
56 : };
57 : } // namespace
58 :
59 0 : Iterator* NewEmptyIterator() {
60 0 : return new EmptyIterator(Status::OK());
61 : }
62 :
63 0 : Iterator* NewErrorIterator(const Status& status) {
64 0 : return new EmptyIterator(status);
65 : }
66 :
67 : } // namespace leveldb
|