contractsdk/cpp/xchain/basic_iterator.cc

(开头部分) 2KB

这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。

#include "xchain/xchain.h"
#include "xchain/basic_iterator.h"
#include "xchain/syscall.h"
#include "xchain/contract.pb.h"

namespace pb = xchain::contract::sdk;

namespace xchain {

Iterator::Iterator(const std::string& start, const std::string& limit, size_t cap) {
    _cap = cap;
    _start = start;
    _limit = limit;

    if (!load()) {
        _it = -1;
    } else {
        _it = 0;
    }
}

bool Iterator::load() {
    _buf.clear();
    if (_start == _limit) {
        return false;
    }
    //每次多取一个作为下一次的主键
    bool ok = range_query(_start, _limit, _cap + 1, &_buf);
    if (!ok) {
        error = Error(xchain::ErrorType::kErrIteratorLoad);
        return false;
    }
    if (_buf.size() != 0) {
        if (_buf.size() == _cap + 1) {
            _start = (*(_buf.rbegin())).first;
            _buf.pop_back();
        } else {
            _start = _limit;
            //这个时候就已经结束了. 但是留到下次取的时候返回false
        }
    }
    return true;
}

bool Iterator::next() {
    bool ret = end();
    if (ret) {
        //只有最后一批结束的时候,才会走到这里
        return false;
    }
    _cur_elem = &_buf[_it];
    ++_it;
    if (end()) {
        _last_one = *_cur_elem;
        _cur_elem = &_last_one;
        if (!load()) {
            _it = -1;
        } else {
            _it = 0;
        }
后面还有 31 行代码,解锁后查看完整代码

24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明

AI 解读

登录后可用,每次 10 积分,解读结果公开显示在下面。

还没有人解读过这个文件。