#include <iostream>
#include <vector>
using namespace std;
template <typename Iterator>
struct IteratorRange{
Iterator begin () const {
return first;
}
Iterator end() const {
return last;
}
size_t size(){
size_t cnt = 0;
while ( first < last ){
cnt++;
first++;
}
return cnt;
}
Iterator first, last;
};
template <typename T>
class Slicer{
public:
Slicer( T begin, T end, size_t page_size ){
this->Begin = begin;
this->End = end;
this->page_size = page_size;
CutOnPage();
}
size_t size() const{
return pages.size();
}
typename vector<IteratorRange<T>>::iterator begin(){
return pages.begin();
}
typename vector<IteratorRange<T>>::iterator end(){
return pages.end();
}
void CutOnPage(){
T current_begin = this->Begin;
while ( current_begin != this->End ){
pages.push_back({ current_begin, current_begin });
while ( pages.back().last != this->End && pages.back().size() <= this->page_size ){
pages.back().last++;
}
current_begin = pages.back().last;
if ( current_begin != this->End ) {
current_begin++;
}
}
}
T Begin, End;
size_t page_size;
vector <IteratorRange<T>> pages;
};
template <typename C>
Slicer <C> Slice(C&c, size_t page_size ){
Slicer <C> main_pag(c.begin(), c.end(), page_size);
return main_pag;
}
int main(){
return 0;
}