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();
       }
    }
 }