1 // Copyright 2015-2017 Hans Dembinski
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)
8 #include <boost/core/lightweight_test.hpp>
9 #include <boost/core/lightweight_test_trait.hpp>
10 #include <boost/histogram/axis.hpp>
11 #include <boost/histogram/axis/ostream.hpp>
12 #include <boost/histogram/detail/axes.hpp>
17 #include "std_ostream.hpp"
18 #include "throw_exception.hpp"
20 using namespace boost::histogram;
23 // dynamic axis_get with tuples
25 auto a1 = axis::integer<>(0, 1);
26 auto a2 = axis::integer<>(1, 2);
27 auto tup = std::make_tuple(a1, a2);
28 using E1 = axis::variant<axis::integer<>*>;
29 BOOST_TEST_TRAIT_SAME(decltype(detail::axis_get(tup, 0)), E1);
30 BOOST_TEST_EQ(detail::axis_get(tup, 0), a1);
31 BOOST_TEST_EQ(detail::axis_get(tup, 1), a2);
32 BOOST_TEST_NE(detail::axis_get(tup, 0), a2);
37 using R = axis::regular<>;
38 using I = axis::integer<>;
39 using V = axis::variable<>;
44 std::vector<axis::variant<R, I, V>> v1 = {r, i};
45 std::vector<axis::variant<R, I>> v2 = {r, i};
46 std::vector<axis::variant<R, I>> v3 = {i, r};
47 std::vector<axis::variant<I, R>> v4 = {r, i};
48 std::vector<axis::variant<R, I>> v5 = {r, r};
49 std::vector<R> v6 = {r, r};
51 BOOST_TEST(detail::axes_equal(v1, v2));
52 BOOST_TEST(detail::axes_equal(v1, v4));
53 BOOST_TEST(detail::axes_equal(v5, v6));
54 BOOST_TEST_NOT(detail::axes_equal(v1, v3));
55 BOOST_TEST_NOT(detail::axes_equal(v2, v3));
56 BOOST_TEST_NOT(detail::axes_equal(v3, v4));
57 BOOST_TEST_NOT(detail::axes_equal(v1, v5));
59 auto t1 = std::make_tuple(r, i);
60 auto t2 = std::make_tuple(i, r);
61 auto t3 = std::make_tuple(v, i);
62 auto t4 = std::make_tuple(r, r);
64 BOOST_TEST(detail::axes_equal(t1, v1));
65 BOOST_TEST(detail::axes_equal(t1, v2));
66 BOOST_TEST(detail::axes_equal(t1, v4));
67 BOOST_TEST(detail::axes_equal(v1, t1));
68 BOOST_TEST(detail::axes_equal(v2, t1));
69 BOOST_TEST(detail::axes_equal(v4, t1));
70 BOOST_TEST(detail::axes_equal(t2, v3));
71 BOOST_TEST(detail::axes_equal(v3, t2));
72 BOOST_TEST(detail::axes_equal(t4, v5));
73 BOOST_TEST(detail::axes_equal(t4, v6));
74 BOOST_TEST_NOT(detail::axes_equal(t1, t2));
75 BOOST_TEST_NOT(detail::axes_equal(t2, t3));
76 BOOST_TEST_NOT(detail::axes_equal(t1, v3));
77 BOOST_TEST_NOT(detail::axes_equal(t1, v3));
78 BOOST_TEST_NOT(detail::axes_equal(t3, v1));
79 BOOST_TEST_NOT(detail::axes_equal(t3, v2));
80 BOOST_TEST_NOT(detail::axes_equal(t3, v3));
81 BOOST_TEST_NOT(detail::axes_equal(t3, v4));
86 using R = axis::regular<>;
87 using I = axis::integer<>;
88 using V = axis::variable<>;
93 std::vector<axis::variant<R, V, I>> v1 = {r, i};
94 std::vector<axis::variant<I, R>> v2;
95 std::vector<R> v3 = {r, r};
97 BOOST_TEST_NOT(detail::axes_equal(v2, v1));
98 detail::axes_assign(v2, v1);
99 BOOST_TEST(detail::axes_equal(v2, v1));
100 detail::axes_assign(v2, v3);
101 BOOST_TEST(detail::axes_equal(v2, v3));
103 auto t1 = std::make_tuple(r);
104 detail::axes_assign(v3, t1);
105 BOOST_TEST(detail::axes_equal(v3, t1));
107 auto t2 = std::make_tuple(r, i);
108 detail::axes_assign(v2, t2);
109 BOOST_TEST(detail::axes_equal(v2, t2));
111 auto t3 = std::make_tuple(R{3, -1, 1}, i);
112 BOOST_TEST_NOT(detail::axes_equal(t2, t3));
113 detail::axes_assign(t2, t3);
114 BOOST_TEST(detail::axes_equal(t2, t3));
119 std::tuple<int, int> a;
120 std::vector<int> b(3);
121 std::array<int, 4> c;
122 const std::tuple<int> d;
123 BOOST_TEST_EQ(detail::axes_rank(a), 2);
124 BOOST_TEST_EQ(detail::axes_rank(b), 3);
125 BOOST_TEST_EQ(detail::axes_rank(c), 4);
126 BOOST_TEST_EQ(detail::axes_rank(d), 1);
131 auto v = std::vector<axis::integer<>>(
132 100, axis::integer<>(0, (std::numeric_limits<int>::max)() - 2));
133 BOOST_TEST_THROWS(detail::bincount(v), std::overflow_error);
139 auto update(int) { return std::make_pair(0, 0); }
142 using I = axis::integer<>;
144 using A = std::tuple<I, T>;
145 using B = std::vector<T>;
146 using C = std::vector<axis::variant<I, T>>;
147 using D = std::tuple<I>;
148 using E = std::vector<I>;
149 using F = std::vector<axis::variant<I>>;
151 BOOST_TEST_TRAIT_TRUE((detail::has_growing_axis<A>));
152 BOOST_TEST_TRAIT_TRUE((detail::has_growing_axis<B>));
153 BOOST_TEST_TRAIT_TRUE((detail::has_growing_axis<C>));
154 BOOST_TEST_TRAIT_FALSE((detail::has_growing_axis<D>));
155 BOOST_TEST_TRAIT_FALSE((detail::has_growing_axis<E>));
156 BOOST_TEST_TRAIT_FALSE((detail::has_growing_axis<F>));
161 using R = axis::regular<float>;
162 using I = axis::integer<int>;
163 using CI = axis::category<int>;
164 using CS = axis::category<std::string>;
165 using A = std::vector<axis::variant<R, I, CS>>;
166 using B = std::vector<axis::variant<CS, I, CI, R>>;
167 using C = std::tuple<I, R, CS>;
168 using D = std::tuple<CS, I, CI, R>;
169 using Expected = boost::mp11::mp_list<int, float, std::string>;
170 BOOST_TEST_TRAIT_SAME(detail::value_types<A>, Expected);
171 BOOST_TEST_TRAIT_SAME(detail::value_types<B>, Expected);
172 BOOST_TEST_TRAIT_SAME(detail::value_types<C>, Expected);
173 BOOST_TEST_TRAIT_SAME(detail::value_types<D>, Expected);
176 return boost::report_errors();