- // 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.
- //
- // An iterator yields a sequence of key/value pairs from a source.
- // The following class defines the interface. Multiple implementations
- // are provided by this library. In particular, iterators are provided
- // to access the contents of a Table or a DB.
- //
- // Multiple threads can invoke const methods on an Iterator without
- // external synchronization, but if any of the threads may call a
- // non-const method, all threads accessing the same Iterator must use
- // external synchronization.
-
- #ifndef STORAGE_LEVELDB_INCLUDE_ITERATOR_H_
- #define STORAGE_LEVELDB_INCLUDE_ITERATOR_H_
-
- #include "leveldb/export.h"
- #include "leveldb/slice.h"
- #include "leveldb/status.h"
-
- namespace leveldb {
-
- class LEVELDB_EXPORT Iterator {
- public:
- Iterator();
-
- Iterator(const Iterator&) = delete;
- Iterator& operator=(const Iterator&) = delete;
-
- virtual ~Iterator();
-
- // An iterator is either positioned at a key/value pair, or
- // not valid. This method returns true iff the iterator is valid.
- virtual bool Valid() const = 0;
-
- // Position at the first key in the source. The iterator is Valid()
- // after this call iff the source is not empty.
- virtual void SeekToFirst() = 0;
-
- // Position at the last key in the source. The iterator is
- // Valid() after this call iff the source is not empty.
- virtual void SeekToLast() = 0;
-
- // Position at the first key in the source that is at or past target.
- // The iterator is Valid() after this call iff the source contains
- // an entry that comes at or past target.
- virtual void Seek(const Slice& target) = 0;
-
- // Moves to the next entry in the source. After this call, Valid() is
- // true iff the iterator was not positioned at the last entry in the source.
- // REQUIRES: Valid()
- virtual void Next() = 0;
-
- // Moves to the previous entry in the source. After this call, Valid() is
- // true iff the iterator was not positioned at the first entry in source.
- // REQUIRES: Valid()
- virtual void Prev() = 0;
-
- // Return the key for the current entry. The underlying storage for
- // the returned slice is valid only until the next modification of
- // the iterator.
- // REQUIRES: Valid()
- virtual Slice key() const = 0;
-
- // Return the value for the current entry. The underlying storage for
- // the returned slice is valid only until the next modification of
- // the iterator.
- // REQUIRES: Valid()
- virtual Slice value() const = 0;
-
- // If an error has occurred, return it. Else return an ok status.
- virtual Status status() const = 0;
-
- // Clients are allowed to register function/arg1/arg2 triples that
- // will be invoked when this iterator is destroyed.
- //
- // Note that unlike all of the preceding methods, this method is
- // not abstract and therefore clients should not override it.
- using CleanupFunction = void (*)(void* arg1, void* arg2);
- void RegisterCleanup(CleanupFunction function, void* arg1, void* arg2);
-
- private:
- // Cleanup functions are stored in a single-linked list.
- // The list's head node is inlined in the iterator.
- struct CleanupNode {
- // The head node is used if the function pointer is not null.
- CleanupFunction function;
- void* arg1;
- void* arg2;
- CleanupNode* next;
-
- // True if the node is not used. Only head nodes might be unused.
- bool IsEmpty() const { return function == nullptr; }
- // Invokes the cleanup function.
- void Run() {
- assert(function != nullptr);
- (*function)(arg1, arg2);
- }
- };
- CleanupNode cleanup_head_;
- };
-
- // Return an empty iterator (yields nothing).
- LEVELDB_EXPORT Iterator* NewEmptyIterator();
-
- // Return an empty iterator with the specified status.
- LEVELDB_EXPORT Iterator* NewErrorIterator(const Status& status);
-
- } // namespace leveldb
-
- #endif // STORAGE_LEVELDB_INCLUDE_ITERATOR_H_
|