// 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; using namespace boost::histogram::literals; 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 std { // never do this, we only do it to get ADL working template ostream &operator<<(ostream &os, const vector &v) { os << "["; for (const auto &x : v) os << x << " "; os << "]"; return os; } struct ostreamer { ostream &os; template void operator()(const T &t) const { os << t << " "; } }; template ostream &operator<<(ostream &os, const tuple &t) { os << "["; ::boost::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\\\''")); } // 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(), false); BOOST_TEST_EQ(has_variance_support(), false); BOOST_TEST_EQ(has_variance_support(), false); BOOST_TEST_EQ(has_variance_support(), true); } // classify_container { using result1 = classify_container; BOOST_TEST_TRAIT_TRUE((std::is_same)); using result1a = classify_container; BOOST_TEST_TRAIT_TRUE((std::is_same)); using result2 = classify_container>; BOOST_TEST_TRAIT_TRUE((std::is_same)); using result2a = classify_container &>; BOOST_TEST_TRAIT_TRUE((std::is_same)); using result3 = classify_container>; BOOST_TEST_TRAIT_TRUE((std::is_same)); using result3a = classify_container &>; BOOST_TEST_TRAIT_TRUE((std::is_same)); using result4 = classify_container; 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})); } // rm_cv_ref { using T1 = int; using T2 = const int; using T3 = const int &; using T4 = volatile int; using T5 = volatile const int; using T6 = volatile const int &; BOOST_TEST_TRAIT_TRUE((std::is_same, int>)); BOOST_TEST_TRAIT_TRUE((std::is_same, int>)); BOOST_TEST_TRAIT_TRUE((std::is_same, int>)); BOOST_TEST_TRAIT_TRUE((std::is_same, int>)); BOOST_TEST_TRAIT_TRUE((std::is_same, int>)); BOOST_TEST_TRAIT_TRUE((std::is_same, int>)); } // mp_union { using L1 = mp11::mp_list; using L2 = mp11::mp_list; using result = mp_union; using expected = mp11::mp_list; BOOST_TEST_TRAIT_TRUE((std::is_same)); } // literals { auto j0 = 0_c; auto j3 = 3_c; auto j10 = 10_c; auto j213 = 213_c; BOOST_TEST_TRAIT_TRUE((std::is_same)); BOOST_TEST_TRAIT_TRUE((std::is_same)); BOOST_TEST_EQ(decltype(j10)::value, 10); BOOST_TEST_EQ(decltype(j213)::value, 213); } // 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(); }