// Copyright Cromwell D. Enage 2017. // 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 #if !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) && \ (BOOST_PARAMETER_MAX_ARITY < 10) #error Define BOOST_PARAMETER_MAX_ARITY as 10 or greater. #endif #include namespace test { BOOST_PARAMETER_NAME((_lrc0, keywords) in(lrc0)) BOOST_PARAMETER_NAME((_lr0, keywords) in_out(lr0)) BOOST_PARAMETER_NAME((_rrc0, keywords) in(rrc0)) #if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) BOOST_PARAMETER_NAME((_rr0, keywords) consume(rr0)) #else BOOST_PARAMETER_NAME((_rr0, keywords) rr0) #endif BOOST_PARAMETER_NAME((_lrc1, keywords) in(lrc1)) BOOST_PARAMETER_NAME((_lr1, keywords) out(lr1)) BOOST_PARAMETER_NAME((_rrc1, keywords) in(rrc1)) BOOST_PARAMETER_NAME((_lrc2, keywords) in(lrc2)) BOOST_PARAMETER_NAME((_lr2, keywords) out(lr2)) BOOST_PARAMETER_NAME((_rr2, keywords) rr2) struct g_parameters : boost::parameter::parameters< boost::parameter::required , boost::parameter::required , boost::parameter::required , boost::parameter::required , boost::parameter::required , boost::parameter::required , boost::parameter::required , boost::parameter::optional , boost::parameter::optional , boost::parameter::optional > { }; } // namespace test #include #include "evaluate_category.hpp" namespace test { struct C { template static void evaluate(Args const& args) { BOOST_TEST_EQ( test::passed_by_lvalue_reference_to_const , U::evaluate_category<0>(args[test::_lrc0]) ); BOOST_TEST_EQ( test::passed_by_lvalue_reference , U::evaluate_category<0>(args[test::_lr0]) ); BOOST_TEST_EQ( test::passed_by_lvalue_reference_to_const , U::evaluate_category<1>(args[test::_lrc1]) ); BOOST_TEST_EQ( test::passed_by_lvalue_reference , U::evaluate_category<1>(args[test::_lr1]) ); BOOST_TEST_EQ( test::passed_by_lvalue_reference_to_const , U::evaluate_category<2>( args[test::_lrc2 | test::lvalue_const_bitset<2>()] ) ); BOOST_TEST_EQ( test::passed_by_lvalue_reference , U::evaluate_category<2>( args[test::_lr2 || test::lvalue_bitset_function<2>()] ) ); #if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) BOOST_TEST_EQ( test::passed_by_rvalue_reference_to_const , U::evaluate_category<0>(args[test::_rrc0]) ); BOOST_TEST_EQ( test::passed_by_rvalue_reference , U::evaluate_category<0>(args[test::_rr0]) ); BOOST_TEST_EQ( test::passed_by_rvalue_reference_to_const , U::evaluate_category<1>(args[test::_rrc1]) ); BOOST_TEST_EQ( test::passed_by_rvalue_reference , U::evaluate_category<2>( args[test::_rr2 || test::rvalue_bitset_function<2>()] ) ); #else // !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) BOOST_TEST_EQ( test::passed_by_lvalue_reference_to_const , U::evaluate_category<0>(args[test::_rrc0]) ); BOOST_TEST_EQ( test::passed_by_lvalue_reference_to_const , U::evaluate_category<0>(args[test::_rr0]) ); BOOST_TEST_EQ( test::passed_by_lvalue_reference_to_const , U::evaluate_category<1>(args[test::_rrc1]) ); BOOST_TEST_EQ( test::passed_by_lvalue_reference_to_const , U::evaluate_category<2>( args[test::_rr2 || test::rvalue_bitset_function<2>()] ) ); #endif // BOOST_PARAMETER_HAS_PERFECT_FORWARDING } }; } // namespace test #if !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) #include #include #endif int main() { #if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) || \ (10 < BOOST_PARAMETER_EXPONENTIAL_OVERLOAD_THRESHOLD_ARITY) test::C::evaluate( test::g_parameters()( test::lvalue_const_bitset<0>() , test::lvalue_bitset<0>() , test::rvalue_const_bitset<0>() , test::rvalue_bitset<0>() , test::lvalue_const_bitset<1>() , test::lvalue_bitset<1>() , test::rvalue_const_bitset<1>() ) ); test::C::evaluate( test::g_parameters()( test::lvalue_const_bitset<0>() , test::lvalue_bitset<0>() , test::rvalue_const_bitset<0>() , test::rvalue_bitset<0>() , test::lvalue_const_bitset<1>() , test::lvalue_bitset<1>() , test::rvalue_const_bitset<1>() , test::lvalue_const_bitset<2>() , test::lvalue_bitset<2>() , test::rvalue_bitset<2>() ) ); #else // no perfect forwarding support and no exponential overloads test::C::evaluate( test::g_parameters()( test::lvalue_const_bitset<0>() , boost::ref(test::lvalue_bitset<0>()) , test::rvalue_const_bitset<0>() , boost::parameter::aux::as_lvalue(test::rvalue_bitset<0>()) , test::lvalue_const_bitset<1>() , boost::ref(test::lvalue_bitset<1>()) , test::rvalue_const_bitset<1>() ) ); test::C::evaluate( test::g_parameters()( test::lvalue_const_bitset<0>() , boost::ref(test::lvalue_bitset<0>()) , test::rvalue_const_bitset<0>() , boost::parameter::aux::as_lvalue(test::rvalue_bitset<0>()) , test::lvalue_const_bitset<1>() , boost::ref(test::lvalue_bitset<1>()) , test::rvalue_const_bitset<1>() , test::lvalue_const_bitset<2>() , boost::ref(test::lvalue_bitset<2>()) , boost::parameter::aux::as_lvalue(test::rvalue_bitset<2>()) ) ); #endif // perfect forwarding support, or exponential overloads return boost::report_errors(); }