// Copyright 2019 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 namespace dtl = boost::histogram::detail; int main() { using boost::histogram::weight_type; BOOST_TEST(dtl::accumulator_traits::weight_support); BOOST_TEST_TRAIT_SAME(dtl::accumulator_traits::args, std::tuple<>); BOOST_TEST(dtl::accumulator_traits::weight_support); BOOST_TEST_TRAIT_SAME(dtl::accumulator_traits::args, std::tuple<>); struct A1 { void operator()(); }; BOOST_TEST_NOT(dtl::accumulator_traits::weight_support); BOOST_TEST_TRAIT_SAME(typename dtl::accumulator_traits::args, std::tuple<>); struct A2 { void operator()(int, double); }; BOOST_TEST_NOT(dtl::accumulator_traits::weight_support); BOOST_TEST_TRAIT_SAME(typename dtl::accumulator_traits::args, std::tuple); struct A3 { void operator()(); void operator()(weight_type); }; BOOST_TEST(dtl::accumulator_traits::weight_support); BOOST_TEST_TRAIT_SAME(typename dtl::accumulator_traits::args, std::tuple<>); struct A4 { void operator()(int, double, char); void operator()(weight_type, int, double, char); }; BOOST_TEST(dtl::accumulator_traits::weight_support); BOOST_TEST_TRAIT_SAME(typename dtl::accumulator_traits::args, std::tuple); struct A5 { void operator()(const weight_type, int); }; BOOST_TEST(dtl::accumulator_traits::weight_support); BOOST_TEST_TRAIT_SAME(typename dtl::accumulator_traits::args, std::tuple); struct A6 { void operator()(const weight_type&, const int); }; BOOST_TEST(dtl::accumulator_traits::weight_support); BOOST_TEST_TRAIT_SAME(typename dtl::accumulator_traits::args, std::tuple); struct A7 { void operator()(weight_type&&, int&&); }; BOOST_TEST(dtl::accumulator_traits::weight_support); BOOST_TEST_TRAIT_SAME(typename dtl::accumulator_traits::args, std::tuple); struct B1 { int operator+=(int); }; BOOST_TEST(dtl::accumulator_traits::weight_support); BOOST_TEST_TRAIT_SAME(typename dtl::accumulator_traits::args, std::tuple<>); struct B2 { int operator+=(weight_type); }; BOOST_TEST(dtl::accumulator_traits::weight_support); BOOST_TEST_TRAIT_SAME(typename dtl::accumulator_traits::args, std::tuple<>); struct B3 { int operator+=(const weight_type&); }; BOOST_TEST(dtl::accumulator_traits::weight_support); BOOST_TEST_TRAIT_SAME(typename dtl::accumulator_traits::args, std::tuple<>); // potentially ambiguous case that mimicks accumulators::weighted_sum struct B4 { B4(int) {} int operator+=(const weight_type&) { return 0; } int operator+=(const B4&) { return 0; } // *this += 0 succeeds as *this += B4(0) }; BOOST_TEST(dtl::accumulator_traits::weight_support); BOOST_TEST_TRAIT_SAME(typename dtl::accumulator_traits::args, std::tuple<>); return boost::report_errors(); }