PageIdIterator(const std::vector<Extent>& extents, PageId target) : extent(0), pageID(kInvalidPageId), extents(&extents) { for(;extent<extents.size(); extent++) if(extents[extent].begin().toInteger() <= target.toInteger() && target.toInteger() < extents[extent].end().toInteger()) { pageID = target; return; } }
void inc(uint64_t count) { assert(pageID != kInvalidPageId); while(count!=0 && pageID!=kInvalidPageId) { // Next extent if(pageID == (*extents)[extent].end()) { extent++; if(extent >= extents->size()) pageID = kInvalidPageId; else pageID = (*extents)[extent].begin(); } // uint64_t leftInThisExtent = (*extents)[extent].end().toInteger() - pageID.toInteger(); if(leftInThisExtent > count) { pageID = PageId(pageID.toInteger() + count); count = 0; } else { count -= leftInThisExtent; pageID = (*extents)[extent].end(); } } }