// 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 using namespace boost::histogram::detail; namespace mp11 = boost::mp11; using i0 = mp11::mp_int<0>; using i1 = mp11::mp_int<1>; using i2 = mp11::mp_int<2>; using i3 = mp11::mp_int<3>; namespace boost { namespace detail { template std::ostream& operator<<(std::ostream& os, const std::vector& v) { os << "["; for (const auto& x : v) os << x << " "; os << "]"; return os; } struct ostreamer { std::ostream& os; template void operator()(const T& t) const { os << t << " "; } }; template std::ostream& operator<<(std::ostream& os, const std::tuple& t) { os << "["; mp11::tuple_for_each(t, ostreamer{os}); os << "]"; return os; } }} int main() { // escape0 { std::ostringstream os; escape(os, std::string("abc")); BOOST_TEST_EQ(os.str(), std::string("'abc'")); } // escape1 { std::ostringstream os; escape(os, std::string("abc\n")); BOOST_TEST_EQ(os.str(), std::string("'abc\n'")); } // escape2 { std::ostringstream os; escape(os, std::string("'abc'")); BOOST_TEST_EQ(os.str(), std::string("'\\\'abc\\\''")); } // // assign_axis unreachable branch // { // using V1 = boost::variant; // using V2 = boost::variant; // V1 v1(1.0); // V2 v2(2); // boost::apply_visitor(assign_axis(v1), v2); // BOOST_TEST_EQ(v1, V1(1.0)); // BOOST_TEST_EQ(v2, V2(2)); // } // index_mapper 1 { std::vector n{{2, 2}}; std::vector b{{true, false}}; index_mapper m(std::move(n), std::move(b)); BOOST_TEST_EQ(m.first, 0); BOOST_TEST_EQ(m.second, 0); BOOST_TEST_EQ(m.next(), true); BOOST_TEST_EQ(m.first, 1); BOOST_TEST_EQ(m.second, 1); BOOST_TEST_EQ(m.next(), true); BOOST_TEST_EQ(m.first, 2); BOOST_TEST_EQ(m.second, 0); BOOST_TEST_EQ(m.next(), true); BOOST_TEST_EQ(m.first, 3); BOOST_TEST_EQ(m.second, 1); BOOST_TEST_EQ(m.next(), false); } // index_mapper 2 { std::vector n{{2, 2}}; std::vector b{{false, true}}; index_mapper m(std::move(n), std::move(b)); BOOST_TEST_EQ(m.first, 0); BOOST_TEST_EQ(m.second, 0); BOOST_TEST_EQ(m.next(), true); BOOST_TEST_EQ(m.first, 1); BOOST_TEST_EQ(m.second, 0); BOOST_TEST_EQ(m.next(), true); BOOST_TEST_EQ(m.first, 2); BOOST_TEST_EQ(m.second, 1); BOOST_TEST_EQ(m.next(), true); BOOST_TEST_EQ(m.first, 3); BOOST_TEST_EQ(m.second, 1); BOOST_TEST_EQ(m.next(), false); } // cat { BOOST_TEST_EQ(cat("foo", 1, "bar"), std::string("foo1bar")); } // has_variance_support { struct no_methods {}; struct value_method { const double &value() const; }; struct variance_method { const double &variance() const; }; struct value_and_variance_methods { const double &value() const; const double &variance() const; }; BOOST_TEST_EQ(has_variance_support_t(), false); BOOST_TEST_EQ(has_variance_support_t(), false); BOOST_TEST_EQ(has_variance_support_t(), false); BOOST_TEST_EQ(has_variance_support_t(), true); } // classify_container { using result1 = classify_container_t; BOOST_TEST_TRAIT_TRUE(( std::is_same )); using result1a = classify_container_t; BOOST_TEST_TRAIT_TRUE(( std::is_same )); using result2 = classify_container_t>; BOOST_TEST_TRAIT_TRUE(( std::is_same )); using result2a = classify_container_t&>; BOOST_TEST_TRAIT_TRUE(( std::is_same )); using result3 = classify_container_t>; BOOST_TEST_TRAIT_TRUE(( std::is_same )); using result3a = classify_container_t&>; BOOST_TEST_TRAIT_TRUE(( std::is_same )); using result4 = classify_container_t; BOOST_TEST_TRAIT_TRUE(( std::is_same )); } // bool mask { auto v1 = bool_mask(4, false); BOOST_TEST_EQ(v1, std::vector({true, false, false, true})); auto v2 = bool_mask(4, true); BOOST_TEST_EQ(v2, std::vector({false, true, false, true})); } // // literals // { // using c0 = 0_c; // BOOST_TEST_TRAIT_TRUE((std::is_same>)); // } // selection { struct A {}; struct B {}; struct C {}; using input = mp11::mp_list; using result = selection; using expected = mp11::mp_list; BOOST_TEST_TRAIT_TRUE((std::is_same)); } // unique_sorted { using input = mp11::mp_list_c; using result = unique_sorted; using expected = mp11::mp_list_c; BOOST_TEST_TRAIT_TRUE((std::is_same)); } // make_sub_tuple { std::tuple t(1, 2, 3); auto result = make_sub_tuple(t); auto expected = std::tuple(2, 3); BOOST_TEST_EQ(result, expected); } return boost::report_errors(); }