detail_axes_test.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. // Copyright 2015-2017 Hans Dembinski
  2. //
  3. // Distributed under the Boost Software License, Version 1.0.
  4. // (See accompanying file LICENSE_1_0.txt
  5. // or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. #include <array>
  7. #include <boost/core/lightweight_test.hpp>
  8. #include <boost/core/lightweight_test_trait.hpp>
  9. #include <boost/histogram/axis.hpp>
  10. #include <boost/histogram/axis/ostream.hpp>
  11. #include <boost/histogram/detail/axes.hpp>
  12. #include <limits>
  13. #include <tuple>
  14. #include <utility>
  15. #include <vector>
  16. #include "std_ostream.hpp"
  17. #include "throw_exception.hpp"
  18. using namespace boost::histogram;
  19. int main() {
  20. // dynamic axis_get with tuples
  21. {
  22. auto a1 = axis::integer<>(0, 1);
  23. auto a2 = axis::integer<>(1, 2);
  24. auto tup = std::make_tuple(a1, a2);
  25. using E1 = axis::variant<axis::integer<>*>;
  26. BOOST_TEST_TRAIT_SAME(decltype(detail::axis_get(tup, 0)), E1);
  27. BOOST_TEST_EQ(detail::axis_get(tup, 0), a1);
  28. BOOST_TEST_EQ(detail::axis_get(tup, 1), a2);
  29. BOOST_TEST_NE(detail::axis_get(tup, 0), a2);
  30. }
  31. // sequence equality
  32. {
  33. using R = axis::regular<>;
  34. using I = axis::integer<>;
  35. using V = axis::variable<>;
  36. auto r = R(2, -1, 1);
  37. auto i = I(-1, 1);
  38. auto v = V{-1, 0, 1};
  39. std::vector<axis::variant<R, I, V>> v1 = {r, i};
  40. std::vector<axis::variant<R, I>> v2 = {r, i};
  41. std::vector<axis::variant<R, I>> v3 = {i, r};
  42. std::vector<axis::variant<I, R>> v4 = {r, i};
  43. std::vector<axis::variant<R, I>> v5 = {r, r};
  44. std::vector<R> v6 = {r, r};
  45. BOOST_TEST(detail::axes_equal(v1, v2));
  46. BOOST_TEST(detail::axes_equal(v1, v4));
  47. BOOST_TEST(detail::axes_equal(v5, v6));
  48. BOOST_TEST_NOT(detail::axes_equal(v1, v3));
  49. BOOST_TEST_NOT(detail::axes_equal(v2, v3));
  50. BOOST_TEST_NOT(detail::axes_equal(v3, v4));
  51. BOOST_TEST_NOT(detail::axes_equal(v1, v5));
  52. auto t1 = std::make_tuple(r, i);
  53. auto t2 = std::make_tuple(i, r);
  54. auto t3 = std::make_tuple(v, i);
  55. auto t4 = std::make_tuple(r, r);
  56. BOOST_TEST(detail::axes_equal(t1, v1));
  57. BOOST_TEST(detail::axes_equal(t1, v2));
  58. BOOST_TEST(detail::axes_equal(t1, v4));
  59. BOOST_TEST(detail::axes_equal(v1, t1));
  60. BOOST_TEST(detail::axes_equal(v2, t1));
  61. BOOST_TEST(detail::axes_equal(v4, t1));
  62. BOOST_TEST(detail::axes_equal(t2, v3));
  63. BOOST_TEST(detail::axes_equal(v3, t2));
  64. BOOST_TEST(detail::axes_equal(t4, v5));
  65. BOOST_TEST(detail::axes_equal(t4, v6));
  66. BOOST_TEST_NOT(detail::axes_equal(t1, t2));
  67. BOOST_TEST_NOT(detail::axes_equal(t2, t3));
  68. BOOST_TEST_NOT(detail::axes_equal(t1, v3));
  69. BOOST_TEST_NOT(detail::axes_equal(t1, v3));
  70. BOOST_TEST_NOT(detail::axes_equal(t3, v1));
  71. BOOST_TEST_NOT(detail::axes_equal(t3, v2));
  72. BOOST_TEST_NOT(detail::axes_equal(t3, v3));
  73. BOOST_TEST_NOT(detail::axes_equal(t3, v4));
  74. }
  75. // sequence assign
  76. {
  77. using R = axis::regular<>;
  78. using I = axis::integer<>;
  79. using V = axis::variable<>;
  80. auto r = R(2, -1, 1);
  81. auto i = I(-1, 1);
  82. auto v = V{-1, 0, 1};
  83. std::vector<axis::variant<R, V, I>> v1 = {r, i};
  84. std::vector<axis::variant<I, R>> v2;
  85. std::vector<R> v3 = {r, r};
  86. BOOST_TEST_NOT(detail::axes_equal(v2, v1));
  87. detail::axes_assign(v2, v1);
  88. BOOST_TEST(detail::axes_equal(v2, v1));
  89. detail::axes_assign(v2, v3);
  90. BOOST_TEST(detail::axes_equal(v2, v3));
  91. auto t1 = std::make_tuple(r);
  92. detail::axes_assign(v3, t1);
  93. BOOST_TEST(detail::axes_equal(v3, t1));
  94. auto t2 = std::make_tuple(r, i);
  95. detail::axes_assign(v2, t2);
  96. BOOST_TEST(detail::axes_equal(v2, t2));
  97. auto t3 = std::make_tuple(R{3, -1, 1}, i);
  98. BOOST_TEST_NOT(detail::axes_equal(t2, t3));
  99. detail::axes_assign(t2, t3);
  100. BOOST_TEST(detail::axes_equal(t2, t3));
  101. }
  102. // axes_rank
  103. {
  104. std::tuple<int, int> a;
  105. std::vector<int> b(3);
  106. std::array<int, 4> c;
  107. const std::tuple<int> d;
  108. BOOST_TEST_EQ(detail::axes_rank(a), 2);
  109. BOOST_TEST_EQ(detail::axes_rank(b), 3);
  110. BOOST_TEST_EQ(detail::axes_rank(c), 4);
  111. BOOST_TEST_EQ(detail::axes_rank(d), 1);
  112. }
  113. // bincount overflow
  114. {
  115. auto v = std::vector<axis::integer<>>(
  116. 100, axis::integer<>(0, (std::numeric_limits<int>::max)() - 2));
  117. BOOST_TEST_THROWS(detail::bincount(v), std::overflow_error);
  118. }
  119. // has_growing_axis
  120. {
  121. struct growing {
  122. auto update(int) { return std::make_pair(0, 0); }
  123. };
  124. using T = growing;
  125. using I = axis::integer<>;
  126. using A = std::tuple<I, T>;
  127. using B = std::vector<T>;
  128. using C = std::vector<axis::variant<I, T>>;
  129. using D = std::tuple<I>;
  130. using E = std::vector<I>;
  131. using F = std::vector<axis::variant<I>>;
  132. BOOST_TEST_TRAIT_TRUE((detail::has_growing_axis<A>));
  133. BOOST_TEST_TRAIT_TRUE((detail::has_growing_axis<B>));
  134. BOOST_TEST_TRAIT_TRUE((detail::has_growing_axis<C>));
  135. BOOST_TEST_TRAIT_FALSE((detail::has_growing_axis<D>));
  136. BOOST_TEST_TRAIT_FALSE((detail::has_growing_axis<E>));
  137. BOOST_TEST_TRAIT_FALSE((detail::has_growing_axis<F>));
  138. }
  139. // value_types
  140. {
  141. using R = axis::regular<float>;
  142. using I = axis::integer<int>;
  143. using CI = axis::category<int>;
  144. using CS = axis::category<std::string>;
  145. using A = std::vector<axis::variant<R, I, CS>>;
  146. using B = std::vector<axis::variant<CS, I, CI, R>>;
  147. using C = std::tuple<I, R, CS>;
  148. using D = std::tuple<CS, I, CI, R>;
  149. using Expected = boost::mp11::mp_list<int, float, std::string>;
  150. BOOST_TEST_TRAIT_SAME(detail::value_types<A>, Expected);
  151. BOOST_TEST_TRAIT_SAME(detail::value_types<B>, Expected);
  152. BOOST_TEST_TRAIT_SAME(detail::value_types<C>, Expected);
  153. BOOST_TEST_TRAIT_SAME(detail::value_types<D>, Expected);
  154. }
  155. return boost::report_errors();
  156. }