xref: /aosp_15_r20/external/leveldb/table/iterator.cc (revision 9507f98c5f32dee4b5f9e4a38cd499f3ff5c4490)
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 Worker Iterator::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 Worker Iterator::~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 Worker void 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 Worker Iterator* NewEmptyIterator() { return new EmptyIterator(Status::OK()); }
71*9507f98cSAndroid Build Coastguard Worker 
NewErrorIterator(const Status & status)72*9507f98cSAndroid Build Coastguard Worker Iterator* 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