#pragma once #include namespace std { template class IteratorRange { public: IteratorRange(It b, It e) : begin_(b), end_(e), size_(std::distance(b, e)) {} typedef It iterator; 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 begin, It end, size_t page_size) { auto lastPtr = begin; while (true) { if (lastPtr + page_size >= end) { pages_.push_back(IteratorRange(lastPtr, end)); break; } else { pages_.push_back(IteratorRange(lastPtr, lastPtr + page_size)); } lastPtr += page_size; } } typename vector>::iterator begin() { return pages_.begin(); } typename vector>::iterator end() { return pages_.end(); } size_t size() const { return pages_.size(); } private: std::vector> pages_; }; template Slicer Slice(C& c, std::size_t page_size) { return Slicer(c.begin(), c.end(), page_size); } template Slicer Slice(const C& c, std::size_t page_size) { return Slicer(c.begin(), c.end(), page_size); } }