1*9507f98cSAndroid Build Coastguard Worker // Copyright (c) 2011 The LevelDB Authors. All rights reserved. 2*9507f98cSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*9507f98cSAndroid Build Coastguard Worker // found in the LICENSE file. See the AUTHORS file for names of contributors. 4*9507f98cSAndroid Build Coastguard Worker 5*9507f98cSAndroid Build Coastguard Worker #include "leveldb/iterator.h" 6*9507f98cSAndroid Build Coastguard Worker 7*9507f98cSAndroid Build Coastguard Worker namespace leveldb { 8*9507f98cSAndroid Build Coastguard Worker Iterator()9*9507f98cSAndroid Build Coastguard WorkerIterator::Iterator() { 10*9507f98cSAndroid Build Coastguard Worker cleanup_head_.function = nullptr; 11*9507f98cSAndroid Build Coastguard Worker cleanup_head_.next = nullptr; 12*9507f98cSAndroid Build Coastguard Worker } 13*9507f98cSAndroid Build Coastguard Worker ~Iterator()14*9507f98cSAndroid Build Coastguard WorkerIterator::~Iterator() { 15*9507f98cSAndroid Build Coastguard Worker if (!cleanup_head_.IsEmpty()) { 16*9507f98cSAndroid Build Coastguard Worker cleanup_head_.Run(); 17*9507f98cSAndroid Build Coastguard Worker for (CleanupNode* node = cleanup_head_.next; node != nullptr;) { 18*9507f98cSAndroid Build Coastguard Worker node->Run(); 19*9507f98cSAndroid Build Coastguard Worker CleanupNode* next_node = node->next; 20*9507f98cSAndroid Build Coastguard Worker delete node; 21*9507f98cSAndroid Build Coastguard Worker node = next_node; 22*9507f98cSAndroid Build Coastguard Worker } 23*9507f98cSAndroid Build Coastguard Worker } 24*9507f98cSAndroid Build Coastguard Worker } 25*9507f98cSAndroid Build Coastguard Worker RegisterCleanup(CleanupFunction func,void * arg1,void * arg2)26*9507f98cSAndroid Build Coastguard Workervoid Iterator::RegisterCleanup(CleanupFunction func, void* arg1, void* arg2) { 27*9507f98cSAndroid Build Coastguard Worker assert(func != nullptr); 28*9507f98cSAndroid Build Coastguard Worker CleanupNode* node; 29*9507f98cSAndroid Build Coastguard Worker if (cleanup_head_.IsEmpty()) { 30*9507f98cSAndroid Build Coastguard Worker node = &cleanup_head_; 31*9507f98cSAndroid Build Coastguard Worker } else { 32*9507f98cSAndroid Build Coastguard Worker node = new CleanupNode(); 33*9507f98cSAndroid Build Coastguard Worker node->next = cleanup_head_.next; 34*9507f98cSAndroid Build Coastguard Worker cleanup_head_.next = node; 35*9507f98cSAndroid Build Coastguard Worker } 36*9507f98cSAndroid Build Coastguard Worker node->function = func; 37*9507f98cSAndroid Build Coastguard Worker node->arg1 = arg1; 38*9507f98cSAndroid Build Coastguard Worker node->arg2 = arg2; 39*9507f98cSAndroid Build Coastguard Worker } 40*9507f98cSAndroid Build Coastguard Worker 41*9507f98cSAndroid Build Coastguard Worker namespace { 42*9507f98cSAndroid Build Coastguard Worker 43*9507f98cSAndroid Build Coastguard Worker class EmptyIterator : public Iterator { 44*9507f98cSAndroid Build Coastguard Worker public: EmptyIterator(const Status & s)45*9507f98cSAndroid Build Coastguard Worker EmptyIterator(const Status& s) : status_(s) {} 46*9507f98cSAndroid Build Coastguard Worker ~EmptyIterator() override = default; 47*9507f98cSAndroid Build Coastguard Worker Valid() const48*9507f98cSAndroid Build Coastguard Worker bool Valid() const override { return false; } Seek(const Slice & target)49*9507f98cSAndroid Build Coastguard Worker void Seek(const Slice& target) override {} SeekToFirst()50*9507f98cSAndroid Build Coastguard Worker void SeekToFirst() override {} SeekToLast()51*9507f98cSAndroid Build Coastguard Worker void SeekToLast() override {} Next()52*9507f98cSAndroid Build Coastguard Worker void Next() override { assert(false); } Prev()53*9507f98cSAndroid Build Coastguard Worker void Prev() override { assert(false); } key() const54*9507f98cSAndroid Build Coastguard Worker Slice key() const override { 55*9507f98cSAndroid Build Coastguard Worker assert(false); 56*9507f98cSAndroid Build Coastguard Worker return Slice(); 57*9507f98cSAndroid Build Coastguard Worker } value() const58*9507f98cSAndroid Build Coastguard Worker Slice value() const override { 59*9507f98cSAndroid Build Coastguard Worker assert(false); 60*9507f98cSAndroid Build Coastguard Worker return Slice(); 61*9507f98cSAndroid Build Coastguard Worker } status() const62*9507f98cSAndroid Build Coastguard Worker Status status() const override { return status_; } 63*9507f98cSAndroid Build Coastguard Worker 64*9507f98cSAndroid Build Coastguard Worker private: 65*9507f98cSAndroid Build Coastguard Worker Status status_; 66*9507f98cSAndroid Build Coastguard Worker }; 67*9507f98cSAndroid Build Coastguard Worker 68*9507f98cSAndroid Build Coastguard Worker } // anonymous namespace 69*9507f98cSAndroid Build Coastguard Worker NewEmptyIterator()70*9507f98cSAndroid Build Coastguard WorkerIterator* NewEmptyIterator() { return new EmptyIterator(Status::OK()); } 71*9507f98cSAndroid Build Coastguard Worker NewErrorIterator(const Status & status)72*9507f98cSAndroid Build Coastguard WorkerIterator* NewErrorIterator(const Status& status) { 73*9507f98cSAndroid Build Coastguard Worker return new EmptyIterator(status); 74*9507f98cSAndroid Build Coastguard Worker } 75*9507f98cSAndroid Build Coastguard Worker 76*9507f98cSAndroid Build Coastguard Worker } // namespace leveldb 77