Level DB --- Iterator

Iterator是Level DB中的一个基类,它定义了迭代器的基础的操作,同时对内存资源进行了维护。

虚函数

Iterator类中的虚函数操作如下:

cpp 复制代码
  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中声明了:

cpp 复制代码
  // 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

cpp 复制代码
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函数。

相关推荐
为什么不问问神奇的海螺呢丶5 分钟前
Oracle 数据库对象导出脚本-含创建语句
数据库·oracle
码农阿豪14 分钟前
告别兼容焦虑:电科金仓 KES 如何把 Oracle 的 PL/SQL 和 JSON 业务“接住”
数据库·sql·oracle·json·金仓数据库
曹牧20 分钟前
Oracle SQL 中,& 字符
数据库·sql·oracle
wdfk_prog34 分钟前
[Linux]学习笔记系列 -- [fs]dcache
linux·数据库·笔记·学习·ubuntu
明洞日记44 分钟前
【VTK手册027】VTK 颜色连续映射:vtkColorTransferFunction 深度解析与实战指南
c++·图像处理·算法·vtk·图形渲染
Bruce_kaizy1 小时前
c++单调数据结构————单调栈,单调队列
开发语言·数据结构·c++
xrl20121 小时前
ruoyi-vue2集成flowable6.7.2后端篇
数据库·ruoyi·flowable·工作流集成
阿坤带你走近大数据1 小时前
Python基础知识-数据结构篇
开发语言·数据结构·python
B_lack0261 小时前
西门子PLC结构化编程_线性插值算法功能块
算法·pid·西门子plc·博途·线性插值·开环控制
fufu03111 小时前
Linux环境下的C语言编程(四十三)
linux·c语言·算法