Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.25 KB | None | 0 0
  1. #include "test_runner.h"
  2.  
  3. #include <utility>
  4. #include <vector>
  5. #include <iostream>
  6. #include <future>
  7. #include <cstdint>
  8.  
  9. using namespace std;
  10.  
  11. template <typename Iterator>
  12. class IteratorRange {
  13. public:
  14.  
  15. IteratorRange(Iterator begin, Iterator end) : Begin(begin), End(end), Size(distance(begin, end)) {}
  16.  
  17. Iterator begin() const {
  18. return Begin;
  19. }
  20.  
  21. Iterator end() const {
  22. return End;
  23. }
  24.  
  25. size_t size() const {
  26. return distance(begin(), end());
  27. }
  28.  
  29. private:
  30. Iterator Begin;
  31. Iterator End;
  32. size_t Size;
  33. };
  34.  
  35. template <typename Iterator>
  36. class Paginator {
  37. public:
  38. Paginator(Iterator begin, Iterator end, size_t page_size) {
  39. for (size_t left = distance(begin, end); left > 0; ) {
  40. size_t current_page_size = min(left, page_size);
  41. Iterator current_end = next(begin, current_page_size);
  42. pages.push_back({begin, current_end});
  43.  
  44. left -= current_page_size;
  45. begin = current_end;
  46. }
  47. }
  48.  
  49. auto begin() const {
  50. return pages.begin();
  51. }
  52.  
  53. auto end() const {
  54. return pages.end();
  55. }
  56.  
  57. size_t size() const {
  58. return pages.size();
  59. }
  60.  
  61. private:
  62. vector<IteratorRange<Iterator>> pages;
  63. };
  64.  
  65. template <typename C>
  66. auto Paginate(C& c, size_t page_size) {
  67. return Paginator(c.begin(), c.end(), page_size);
  68. }
  69.  
  70.  
  71. int64_t SumSingleThread(const vector<vector<int>>& matrix) {
  72. int64_t sum = 0;
  73. for (const auto& row : matrix) {
  74. for (auto item : row) {
  75. sum += item;
  76. }
  77. }
  78. return sum;
  79. }
  80.  
  81.  
  82. int64_t CalculateMatrixSum(const vector<vector<int>>& matrix) {
  83. vector<future<int64_t>> futures;
  84. for (auto page : Paginate(matrix, 2000)) {
  85. futures.push_back(async([=] { return SumSingleThread(page); }));
  86. }
  87. int64_t result = 0;
  88. for (auto& f : futures) {
  89. result += f.get();
  90. }
  91. return result;
  92. }
  93.  
  94.  
  95. void TestCalculateMatrixSum() {
  96. const vector<vector<int>> matrix = {
  97. {1, 2, 3, 4},
  98. {5, 6, 7, 8},
  99. {9, 10, 11, 12},
  100. {13, 14, 15, 16}
  101. };
  102. ASSERT_EQUAL(CalculateMatrixSum(matrix), 136);
  103. }
  104.  
  105. int main() {
  106. TestRunner tr;
  107. RUN_TEST(tr, TestCalculateMatrixSum);
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement