diff options
author | costan <costan@google.com> | 2018-06-04 12:29:13 -0700 |
---|---|---|
committer | Victor Costan <pwnall@chromium.org> | 2018-06-04 17:24:44 -0700 |
commit | 6caf73ad9dae0ee91873bcb39554537b85163770 (patch) | |
tree | 6cb793172f082230ea0e23c972e63935cdd8de81 /table | |
parent | 6a6bdafcf10f5d4bef1ca52697c38d10c28b1a8b (diff) | |
download | leveldb-6caf73ad9dae0ee91873bcb39554537b85163770.tar.gz |
Clean up Iterator.
This CL renames the private struct Iterator::Cleanup ->
Iterator::CleanupNode, to better reflect that it's a linked list node,
and extracts duplicated code from its user in IsEmpty() and Run()
methods.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=199175058
Diffstat (limited to 'table')
-rw-r--r-- | table/iterator.cc | 61 |
1 files changed, 33 insertions, 28 deletions
diff --git a/table/iterator.cc b/table/iterator.cc index aff0e59..41ec1aa 100644 --- a/table/iterator.cc +++ b/table/iterator.cc @@ -7,54 +7,59 @@ namespace leveldb { Iterator::Iterator() { - cleanup_.function = nullptr; - cleanup_.next = nullptr; + cleanup_head_.function = nullptr; + cleanup_head_.next = nullptr; } Iterator::~Iterator() { - if (cleanup_.function != nullptr) { - (*cleanup_.function)(cleanup_.arg1, cleanup_.arg2); - for (Cleanup* c = cleanup_.next; c != nullptr; ) { - (*c->function)(c->arg1, c->arg2); - Cleanup* next = c->next; - delete c; - c = next; + if (!cleanup_head_.IsEmpty()) { + cleanup_head_.Run(); + for (CleanupNode* node = cleanup_head_.next; node != nullptr; ) { + node->Run(); + CleanupNode* next_node = node->next; + delete node; + node = next_node; } } } void Iterator::RegisterCleanup(CleanupFunction func, void* arg1, void* arg2) { assert(func != nullptr); - Cleanup* c; - if (cleanup_.function == nullptr) { - c = &cleanup_; + CleanupNode* node; + if (cleanup_head_.IsEmpty()) { + node = &cleanup_head_; } else { - c = new Cleanup; - c->next = cleanup_.next; - cleanup_.next = c; + node = new CleanupNode(); + node->next = cleanup_head_.next; + cleanup_head_.next = node; } - c->function = func; - c->arg1 = arg1; - c->arg2 = arg2; + node->function = func; + node->arg1 = arg1; + node->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_; } + ~EmptyIterator() override = default; + + bool Valid() const override { return false; } + void Seek(const Slice& target) override { } + void SeekToFirst() override { } + void SeekToLast() override { } + void Next() override { assert(false); } + void Prev() override { assert(false); } + Slice key() const override { assert(false); return Slice(); } + Slice value() const override { assert(false); return Slice(); } + Status status() const override { return status_; } + private: Status status_; }; -} // namespace + +} // anonymous namespace Iterator* NewEmptyIterator() { return new EmptyIterator(Status::OK()); |