Iterator是Level DB中的一个基类,它定义了迭代器的基础的操作,同时对内存资源进行了维护。
虚函数
Iterator类中的虚函数操作如下:
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;
注释给了详细的虚函数操作介绍,继承类需要实现这些虚函数。
RegisterCleanup
include/leveldb/iterator.h中声明了:
// 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);
/table/iterator.cc中实现了RegisterCleanup
void Iterator::RegisterCleanup(CleanupFunction func, void* arg1, void* arg2) {assert(func != nullptr);CleanupNode* node;if (cleanup_head_.IsEmpty()) {node = &cleanup_head_;} else {node = new CleanupNode();node->next = cleanup_head_.next;cleanup_head_.next = node;}node->function = func;node->arg1 = arg1;node->arg2 = arg2;
}
Iterator中不光实现了迭代器的功能,同时它维护了一个资源的list(即cleanup_head_),在迭代器析构的时候,资源会被释放,而释放的方式是注册的clean up函数。