inline void PagedVector::resize(const size_t& new_size) { if (new_size < filled) { // shrink down to the number of pages we would need size_t num_pages = new_size == 0 ? 0 : (new_size - 1) / page_size + 1; anchors.resize(num_pages); pages.resize(num_pages); } else if (new_size > filled) { // make sure we capacity for this many elements reserve(new_size); } filled = new_size; }
inline void PagedVector::resize(size_t new_size) { // how many pages does this require? size_t num_pages = new_size > 0 ? (new_size - 1) / page_size + 1 : 0; anchors.resize(num_pages); // add pages if necessary while (num_pages > pages.size()) { pages.emplace_back(); pages.back().resize(page_size); } // remove pages if necessary pages.resize(num_pages); filled = new_size; }
inline void PagedVector::reserve(const size_t& future_size) { if (future_size > pages.size() * page_size) { // how many pages does this require? size_t num_pages = (future_size - 1) / page_size + 1; // note: we don't need to worry about underflow b/c previous condition // implies future_size > 0 // expand anchor and pages vectors out to the capacity of the number of pages anchors.reserve(num_pages); pages.reserve(num_pages); // add the anchors and fixed-width pages in this anchors.resize(num_pages); while (num_pages > pages.size()) { pages.emplace_back(); pages.back().resize(page_size); } } }