Advertisement
Guest User

Untitled

a guest
Aug 17th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.50 KB | None | 0 0
  1. #include "test_runner.h"
  2.  
  3. #include <numeric>
  4. #include <iostream>
  5. #include <vector>
  6. #include <string>
  7. #include <algorithm>
  8. using namespace std;
  9.  
  10. template <typename It>
  11. class IteratorRange {
  12. public:
  13.   IteratorRange(It begin, It end, int page_size)
  14.     : begin_(begin)
  15.     , end_(end)
  16.     , page_size_(page_size) {
  17.     page_start_ = begin;
  18.     size_t offset = min<size_t>(end_ - begin_, page_size_);
  19.     page_end_ = begin + offset;
  20.   }
  21.  
  22.   It begin() {
  23.     return page_start_;
  24.   }
  25.  
  26.   It end() {
  27.     return page_end_;
  28.   }
  29.  
  30.   void operator++() {
  31.     size_t offset = min<size_t>(page_end_ - page_start_, page_size_);
  32.     page_start_ = page_end_;
  33.     page_end_ = page_end_ + offset;
  34.   }
  35.  
  36.   bool operator!=(const IteratorRange other) {
  37.     return page_start_ != other.page_start_ || page_end_ != other.page_end_;
  38.   }
  39.  
  40. private:
  41.   It page_start_;
  42.   It page_end_;
  43.   const It begin_;
  44.   const It end_;
  45.   int page_size_;
  46. };
  47.  
  48. template <typename It>
  49. class Paginator {
  50. public:
  51.   Paginator(It begin, It end, size_t page_size)
  52.     : begin_(begin)
  53.     , end_(end)
  54.     , page_size_(page_size) {}
  55.  
  56.   IteratorRange<It> begin() {
  57.     return IteratorRange<It>(begin_, end_, page_size_);
  58.   }
  59.  
  60.   IteratorRange<It> end() {
  61.     return IteratorRange<It>(end_, end_, page_size_);
  62.   }
  63.  
  64.   size_t size() const {
  65.     size_t size = (end_ - begin_) / page_size_;
  66.     if ((end_ - begin_) % page_size_ != 0) {
  67.       size++;
  68.     }
  69.     return size;
  70.   }
  71.  
  72. private:
  73.   It begin_;
  74.   It end_;
  75.   size_t page_size_;
  76. };
  77.  
  78. template <typename Container>
  79. using Iterator =  decltype(std::declval<Container>().begin());
  80.  
  81. template <typename C>
  82. Paginator<Iterator<C>> Paginate(C& c, size_t page_size) {
  83.     return Paginator<Iterator<C>>(begin(c), end(c), page_size);
  84. }
  85.  
  86. void TestPageCounts() {
  87.   vector<int> v(15);
  88.  
  89.   ASSERT_EQUAL(Paginate(v, 1).size(), v.size());
  90.   ASSERT_EQUAL(Paginate(v, 3).size(), 5u);
  91.   ASSERT_EQUAL(Paginate(v, 5).size(), 3u);
  92.   ASSERT_EQUAL(Paginate(v, 4).size(), 4u);
  93.   ASSERT_EQUAL(Paginate(v, 15).size(), 1u);
  94.   ASSERT_EQUAL(Paginate(v, 150).size(), 1u);
  95.   ASSERT_EQUAL(Paginate(v, 14).size(), 2u);
  96. }
  97.  
  98. void TestLooping() {
  99.   vector<int> v(15);
  100.   iota(begin(v), end(v), 1);
  101.  
  102.   Paginator<vector<int>::iterator> paginate_v(v.begin(), v.end(), 6);
  103.   ostringstream os;
  104.   for (const auto& page : paginate_v) {
  105.     for (int x : page) {
  106.       os << x << ' ';
  107.     }
  108.     os << '\n';
  109.   }
  110.  
  111. }
  112.  
  113. int main() {
  114.   TestRunner tr;
  115.   RUN_TEST(tr, TestPageCounts);
  116.   RUN_TEST(tr, TestLooping);
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement