#pragma once #include template class IteratorRange { public: IteratorRange(It b, It e) : begin_(b), end_(e), size_(std::distance(b, e)) {} It begin() const { return begin_; } It end() const { return end_; } size_t size() const { return size_; } private: It begin_, end_; size_t size_; }; template class Slicer { public: Slicer(It bgn, It end, const size_t p_sz) { const size_t sz = std::distance(bgn, end); for (size_t i = sz; i > 0;) { size_t temp = std::min(p_sz, i); auto last = std::next(bgn, temp); pages_.push_back(IteratorRange(bgn, last)); i -= temp; bgn = last; } } auto begin() const { return pages_.begin(); } auto end() const { return pages_.end(); } size_t size() const { return pages_.size(); } private: std::vector> pages_; }; template auto Slice(C& c, size_t p_sz) { return Slicer(c.begin(), c.end(), p_sz); }