Advertisement
Petrovi4

Paginator

Aug 26th, 2022
755
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.33 KB | None | 0 0
  1. template <typename Iterator>
  2. class IteratorRange {
  3. public:
  4.     IteratorRange(Iterator begin, Iterator end)
  5.         : first_(begin)
  6.         , last_(end)
  7.         , size_(distance(first_, last_)) {
  8.     }
  9.  
  10.     Iterator begin() const {
  11.         return first_;
  12.     }
  13.  
  14.     Iterator end() const {
  15.         return last_;
  16.     }
  17.  
  18.     size_t size() const {
  19.         return size_;
  20.     }
  21.  
  22. private:
  23.     Iterator first_, last_;
  24.     size_t size_;
  25. };
  26.  
  27.  
  28. template <typename Iterator>
  29. class Paginator {
  30. public:
  31.     Paginator(Iterator begin, Iterator end, size_t page_size) {
  32.         for (size_t left = distance(begin, end); left > 0;) {
  33.             const size_t current_page_size = std::min(page_size, left);
  34.             const Iterator current_page_end = next(begin, current_page_size);
  35.             pages_.push_back({begin, current_page_end});
  36.  
  37.             left -= current_page_size;
  38.             begin = current_page_end;
  39.         }
  40.     }
  41.  
  42.     auto begin() const {
  43.         return pages_.begin();
  44.     }
  45.  
  46.     auto end() const {
  47.         return pages_.end();
  48.     }
  49.  
  50.     size_t size() const {
  51.         return pages_.size();
  52.     }
  53.  
  54. private:
  55.     std::vector<IteratorRange<Iterator>> pages_;
  56. };
  57.  
  58. template <typename Container>
  59. auto Paginate(const Container& c, size_t page_size) {
  60.     return Paginator(begin(c), end(c), page_size);
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement