#pragma once #include template class IteratorRange { public: IteratorRange(It x, It y) : begin_(x), end_(y), size_(std::distance(x, y)) {} 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: explicit Slicer(It begin, It end, size_t page_size) : begin_(begin), end_(end), page_size_(page_size) { auto allElements = std::distance(begin_, end_); unsigned int count = allElements / page_size_; for (unsigned int n = 0; n < count; n++) { IteratorRange tmp(begin_, begin_ + page_size_); begin_ += page_size_; pages_.push_back(tmp); } count = allElements % page_size_; if (count > 0) { IteratorRange tmp(begin_, end_); pages_.push_back(tmp); } } size_t size() const { return pages_.size(); } auto begin() { return pages_.begin(); } auto end() { return pages_.end(); } }; template auto Slice(S& s, size_t page_size) { return Slicer(s.begin(), s.end(), page_size); }