linear_distribute.cpp 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // Range v3 library
  2. //
  3. // Gonzalo Brito Gadeschi 2017
  4. //
  5. // Use, modification and distribution is subject to the
  6. // Boost Software License, Version 1.0. (See accompanying
  7. // file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. // Project home: https://github.com/ericniebler/range-v3
  11. #include <cmath>
  12. #include <range/v3/algorithm/equal.hpp>
  13. #include <range/v3/functional/arithmetic.hpp>
  14. #include <range/v3/view/linear_distribute.hpp>
  15. #include <range/v3/view/transform.hpp>
  16. #include <range/v3/view/iota.hpp>
  17. #include "../simple_test.hpp"
  18. #include "../test_utils.hpp"
  19. int main()
  20. {
  21. using ranges::views::linear_distribute;
  22. auto float_eq = [](double a, double b) {
  23. return (int)std::floor(std::abs(a - b)) == 0;
  24. };
  25. {
  26. auto irng = linear_distribute(0, 1, 2);
  27. CHECK(ranges::size(irng) == std::size_t{2});
  28. CPP_assert(ranges::forward_range<decltype(irng)>);
  29. CPP_assert(ranges::sized_range<decltype(irng)>);
  30. auto il = {0, 1};
  31. check_equal(irng, il);
  32. }
  33. {
  34. auto irng = linear_distribute(1, 3, 3);
  35. auto il = {1, 2, 3};
  36. check_equal(irng, il);
  37. CHECK(ranges::size(irng) == std::size_t{3});
  38. }
  39. {
  40. auto irng = linear_distribute(0, 21, 22);
  41. auto frng = linear_distribute(0., 21., 22);
  42. check_equal(irng, frng | ranges::views::transform(ranges::convert_to<int>{}));
  43. }
  44. {
  45. auto frng = linear_distribute(0.0, 1.0, 11);
  46. CPP_assert(ranges::forward_range<decltype(frng)>);
  47. CPP_assert(ranges::sized_range<decltype(frng)>);
  48. CHECK(ranges::size(frng) == std::size_t{11});
  49. auto il = {0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0};
  50. CHECK(ranges::size(il) == std::size_t{11});
  51. CHECK(ranges::equal(frng, il, float_eq));
  52. }
  53. {
  54. using ILD = std::initializer_list<double>;
  55. auto frng = linear_distribute(1.0, 3.0, 21);
  56. CHECK(ranges::equal(frng,
  57. ILD{1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9,
  58. 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9,
  59. 3.0},
  60. float_eq));
  61. }
  62. { // empty interval
  63. auto irng = linear_distribute(0, 0, 1);
  64. CHECK(ranges::size(irng) == std::size_t{1});
  65. check_equal(irng, {0});
  66. auto irng1 = linear_distribute(0, 0, 10);
  67. CHECK(ranges::size(irng1) == std::size_t{10});
  68. check_equal(irng1, {0,0,0,0,0,0,0,0,0,0});
  69. auto irng2 = linear_distribute(1, 1, 3);
  70. CHECK(ranges::size(irng2) == std::size_t{3});
  71. check_equal(irng2, {1,1,1});
  72. auto frng = linear_distribute(0., 0., 3);
  73. CHECK(ranges::size(frng) == std::size_t{3});
  74. CHECK(ranges::equal(frng, std::initializer_list<double>{0.,0.,0.}, float_eq));
  75. }
  76. { // regression test for #1088
  77. auto ld = linear_distribute(1, 10, 10);
  78. auto const first = ranges::begin(ld);
  79. auto const i = ranges::next(first, 4);
  80. CHECK(ranges::distance(first, i) == 4);
  81. }
  82. { // integral numbers spacing
  83. auto irng = linear_distribute(0, 10, 22);
  84. auto frng = linear_distribute(0., 10., 22);
  85. check_equal(irng, frng | ranges::views::transform(ranges::convert_to<int>{}));
  86. }
  87. return test_result();
  88. }