// 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 #include #include #include #include #include #include "utility_meta.hpp" using namespace boost::histogram; using namespace boost::histogram::literals; int main() { BOOST_TEST_EQ(detail::cat("foo", 1, "bar"), "foo1bar"); // literals { BOOST_TEST_TRAIT_SAME(std::integral_constant, decltype(0_c)); BOOST_TEST_TRAIT_SAME(std::integral_constant, decltype(3_c)); BOOST_TEST_EQ(decltype(10_c)::value, 10); BOOST_TEST_EQ(decltype(213_c)::value, 213); } // 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)); } // bincount overflow { auto v = std::vector>( 100, axis::integer<>(0, std::numeric_limits::max() - 2)); BOOST_TEST_THROWS(detail::bincount(v), std::overflow_error); } // common_storage { BOOST_TEST_TRAIT_SAME( detail::common_storage, unlimited_storage<>>, unlimited_storage<>); BOOST_TEST_TRAIT_SAME( detail::common_storage, dense_storage>, dense_storage); BOOST_TEST_TRAIT_SAME( detail::common_storage, dense_storage>, dense_storage); BOOST_TEST_TRAIT_SAME( detail::common_storage, dense_storage>, dense_storage); BOOST_TEST_TRAIT_SAME( detail::common_storage, unlimited_storage<>>, dense_storage); BOOST_TEST_TRAIT_SAME(detail::common_storage, unlimited_storage<>>, unlimited_storage<>); BOOST_TEST_TRAIT_SAME(detail::common_storage, weight_storage>, weight_storage); } return boost::report_errors(); }