// Copyright 2015-2017 Hans Dembinski // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt // or copy at http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include #include #include #include #include #include #include #include "std_ostream.hpp" #include "throw_exception.hpp" using namespace boost::histogram; int main() { // dynamic axis_get with tuples { auto a1 = axis::integer<>(0, 1); auto a2 = axis::integer<>(1, 2); auto tup = std::make_tuple(a1, a2); using E1 = axis::variant*>; BOOST_TEST_TRAIT_SAME(decltype(detail::axis_get(tup, 0)), E1); BOOST_TEST_EQ(detail::axis_get(tup, 0), a1); BOOST_TEST_EQ(detail::axis_get(tup, 1), a2); BOOST_TEST_NE(detail::axis_get(tup, 0), a2); } // sequence equality { using R = axis::regular<>; using I = axis::integer<>; using V = axis::variable<>; auto r = R(2, -1, 1); auto i = I(-1, 1); auto v = V{-1, 0, 1}; std::vector> v1 = {r, i}; std::vector> v2 = {r, i}; std::vector> v3 = {i, r}; std::vector> v4 = {r, i}; std::vector> v5 = {r, r}; std::vector v6 = {r, r}; BOOST_TEST(detail::axes_equal(v1, v2)); BOOST_TEST(detail::axes_equal(v1, v4)); BOOST_TEST(detail::axes_equal(v5, v6)); BOOST_TEST_NOT(detail::axes_equal(v1, v3)); BOOST_TEST_NOT(detail::axes_equal(v2, v3)); BOOST_TEST_NOT(detail::axes_equal(v3, v4)); BOOST_TEST_NOT(detail::axes_equal(v1, v5)); auto t1 = std::make_tuple(r, i); auto t2 = std::make_tuple(i, r); auto t3 = std::make_tuple(v, i); auto t4 = std::make_tuple(r, r); BOOST_TEST(detail::axes_equal(t1, v1)); BOOST_TEST(detail::axes_equal(t1, v2)); BOOST_TEST(detail::axes_equal(t1, v4)); BOOST_TEST(detail::axes_equal(v1, t1)); BOOST_TEST(detail::axes_equal(v2, t1)); BOOST_TEST(detail::axes_equal(v4, t1)); BOOST_TEST(detail::axes_equal(t2, v3)); BOOST_TEST(detail::axes_equal(v3, t2)); BOOST_TEST(detail::axes_equal(t4, v5)); BOOST_TEST(detail::axes_equal(t4, v6)); BOOST_TEST_NOT(detail::axes_equal(t1, t2)); BOOST_TEST_NOT(detail::axes_equal(t2, t3)); BOOST_TEST_NOT(detail::axes_equal(t1, v3)); BOOST_TEST_NOT(detail::axes_equal(t1, v3)); BOOST_TEST_NOT(detail::axes_equal(t3, v1)); BOOST_TEST_NOT(detail::axes_equal(t3, v2)); BOOST_TEST_NOT(detail::axes_equal(t3, v3)); BOOST_TEST_NOT(detail::axes_equal(t3, v4)); } // sequence assign { using R = axis::regular<>; using I = axis::integer<>; using V = axis::variable<>; auto r = R(2, -1, 1); auto i = I(-1, 1); auto v = V{-1, 0, 1}; std::vector> v1 = {r, i}; std::vector> v2; std::vector v3 = {r, r}; BOOST_TEST_NOT(detail::axes_equal(v2, v1)); detail::axes_assign(v2, v1); BOOST_TEST(detail::axes_equal(v2, v1)); detail::axes_assign(v2, v3); BOOST_TEST(detail::axes_equal(v2, v3)); auto t1 = std::make_tuple(r); detail::axes_assign(v3, t1); BOOST_TEST(detail::axes_equal(v3, t1)); auto t2 = std::make_tuple(r, i); detail::axes_assign(v2, t2); BOOST_TEST(detail::axes_equal(v2, t2)); auto t3 = std::make_tuple(R{3, -1, 1}, i); BOOST_TEST_NOT(detail::axes_equal(t2, t3)); detail::axes_assign(t2, t3); BOOST_TEST(detail::axes_equal(t2, t3)); } // axes_rank { std::tuple a; std::vector b(3); std::array c; const std::tuple d; BOOST_TEST_EQ(detail::axes_rank(a), 2); BOOST_TEST_EQ(detail::axes_rank(b), 3); BOOST_TEST_EQ(detail::axes_rank(c), 4); BOOST_TEST_EQ(detail::axes_rank(d), 1); } // bincount overflow { auto v = std::vector>( 100, axis::integer<>(0, (std::numeric_limits::max)() - 2)); BOOST_TEST_THROWS(detail::bincount(v), std::overflow_error); } // has_growing_axis { struct growing { auto update(int) { return std::make_pair(0, 0); } }; using T = growing; using I = axis::integer<>; using A = std::tuple; using B = std::vector; using C = std::vector>; using D = std::tuple; using E = std::vector; using F = std::vector>; BOOST_TEST_TRAIT_TRUE((detail::has_growing_axis)); BOOST_TEST_TRAIT_TRUE((detail::has_growing_axis)); BOOST_TEST_TRAIT_TRUE((detail::has_growing_axis)); BOOST_TEST_TRAIT_FALSE((detail::has_growing_axis)); BOOST_TEST_TRAIT_FALSE((detail::has_growing_axis)); BOOST_TEST_TRAIT_FALSE((detail::has_growing_axis)); } // value_types { using R = axis::regular; using I = axis::integer; using CI = axis::category; using CS = axis::category; using A = std::vector>; using B = std::vector>; using C = std::tuple; using D = std::tuple; using Expected = boost::mp11::mp_list; BOOST_TEST_TRAIT_SAME(detail::value_types, Expected); BOOST_TEST_TRAIT_SAME(detail::value_types, Expected); BOOST_TEST_TRAIT_SAME(detail::value_types, Expected); BOOST_TEST_TRAIT_SAME(detail::value_types, Expected); } return boost::report_errors(); }