You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.7 KiB
67 lines
1.7 KiB
// Copyright (c) 2011 The LevelDB Authors. All rights reserved. |
|
// Use of this source code is governed by a BSD-style license that can be |
|
// found in the LICENSE file. See the AUTHORS file for names of contributors. |
|
|
|
#include "leveldb/iterator.h" |
|
|
|
namespace leveldb { |
|
|
|
Iterator::Iterator() { |
|
cleanup_.function = NULL; |
|
cleanup_.next = NULL; |
|
} |
|
|
|
Iterator::~Iterator() { |
|
if (cleanup_.function != NULL) { |
|
(*cleanup_.function)(cleanup_.arg1, cleanup_.arg2); |
|
for (Cleanup* c = cleanup_.next; c != NULL; ) { |
|
(*c->function)(c->arg1, c->arg2); |
|
Cleanup* next = c->next; |
|
delete c; |
|
c = next; |
|
} |
|
} |
|
} |
|
|
|
void Iterator::RegisterCleanup(CleanupFunction func, void* arg1, void* arg2) { |
|
assert(func != NULL); |
|
Cleanup* c; |
|
if (cleanup_.function == NULL) { |
|
c = &cleanup_; |
|
} else { |
|
c = new Cleanup; |
|
c->next = cleanup_.next; |
|
cleanup_.next = c; |
|
} |
|
c->function = func; |
|
c->arg1 = arg1; |
|
c->arg2 = arg2; |
|
} |
|
|
|
namespace { |
|
class EmptyIterator : public Iterator { |
|
public: |
|
EmptyIterator(const Status& s) : status_(s) { } |
|
virtual bool Valid() const { return false; } |
|
virtual void Seek(const Slice& target) { } |
|
virtual void SeekToFirst() { } |
|
virtual void SeekToLast() { } |
|
virtual void Next() { assert(false); } |
|
virtual void Prev() { assert(false); } |
|
Slice key() const { assert(false); return Slice(); } |
|
Slice value() const { assert(false); return Slice(); } |
|
virtual Status status() const { return status_; } |
|
private: |
|
Status status_; |
|
}; |
|
} // namespace |
|
|
|
Iterator* NewEmptyIterator() { |
|
return new EmptyIterator(Status::OK()); |
|
} |
|
|
|
Iterator* NewErrorIterator(const Status& status) { |
|
return new EmptyIterator(status); |
|
} |
|
|
|
} // namespace leveldb
|
|
|