iterator.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #include "simple/geom/iterator.hpp"
  2. #include "simple/geom/algorithm.hpp"
  3. #include <cassert>
  4. #include <memory>
  5. using namespace simple::geom;
  6. template <unsigned width, unsigned height, unsigned step>
  7. void BasicReadWrite()
  8. {
  9. constexpr vector size{width,height};
  10. constexpr unsigned pitch = size.x() + step;
  11. auto image_ptr = std::make_unique<std::array<unsigned, pitch * size.y()>>();
  12. auto& image = *image_ptr;
  13. loop(size, [&, pitch, position = unsigned()] (auto i) mutable
  14. {
  15. image[i.y() * pitch + i.x()] = position;
  16. ++position;
  17. });
  18. {
  19. iterator begin{image.begin(), 0u};
  20. iterator end{image.end()-step, size.x()};
  21. unsigned i = 0;
  22. while(true)
  23. {
  24. auto done = begin == end;
  25. if(done) break;
  26. if(done.first_false != 0)
  27. begin.next(step,done);
  28. assert(*begin == i);
  29. ++begin;
  30. ++i;
  31. }
  32. assert(i == size.x() * size.y());
  33. }
  34. {
  35. vectirator begin{image.begin(), {0u, 0u}};
  36. vectirator end{image.begin(), {size.x(), size.y()*pitch - step}};
  37. unsigned i = 0;
  38. while(true)
  39. {
  40. auto done = begin == end;
  41. if(done) break;
  42. if(to_disjunction(done))
  43. begin.next({1u,step}, done);
  44. assert(*begin == i);
  45. ++begin;
  46. ++i;
  47. }
  48. assert(i == size.x() * size.y());
  49. }
  50. {
  51. vectirator begin{image.begin(), {0u, 0u}};
  52. vectirator end{image.begin(), {size.x(), size.y()*pitch - step}};
  53. unsigned i = 0;
  54. while(true)
  55. {
  56. auto done = begin == end;
  57. if(done) break;
  58. if(to_disjunction(done))
  59. begin.next({1u,step}, done);
  60. while(begin != end)
  61. {
  62. assert(*begin == i);
  63. ++begin;
  64. ++i;
  65. }
  66. }
  67. assert(i == size.x() * size.y());
  68. }
  69. {
  70. iterator begin{image.begin(), 0u};
  71. iterator end{image.end()-step, size.x()};
  72. unsigned i = 0;
  73. while(true)
  74. {
  75. auto done = begin == end;
  76. if(done) break;
  77. if(done.first_false != 0)
  78. begin.next(step,done);
  79. while(begin != end)
  80. {
  81. assert(*begin == i);
  82. ++begin;
  83. ++i;
  84. };
  85. }
  86. assert(i == size.x() * size.y());
  87. }
  88. }
  89. int main()
  90. {
  91. BasicReadWrite<1,2,3>();
  92. BasicReadWrite<1,1,1>();
  93. BasicReadWrite<1,2,0>();
  94. BasicReadWrite<1,1,0>();
  95. // TODO: figure out what's wrong with these and if needs fixing
  96. // BasicReadWrite<1,0,3>();
  97. // BasicReadWrite<1,0,0>();
  98. BasicReadWrite<0,0,0>();
  99. BasicReadWrite<1000,1000,200>();
  100. BasicReadWrite<2000,2000,4000>();
  101. BasicReadWrite<1000,1000,0>();
  102. BasicReadWrite<2000,2000,0>();
  103. return 0;
  104. }