123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- // Copyright Daniel Wallin 2005.
- // Copyright Cromwell D. Enage 2019.
- // 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)
- namespace test {
- struct default_src
- {
- typedef int result_type;
- int operator()() const
- {
- return 0;
- }
- };
- } // namespace test
- #include <boost/parameter/name.hpp>
- namespace test {
- BOOST_PARAMETER_NAME(x)
- BOOST_PARAMETER_NAME(y)
- BOOST_PARAMETER_NAME(z)
- } // namespace test
- #include <boost/parameter/is_argument_pack.hpp>
- #include <boost/parameter/config.hpp>
- #include <boost/mpl/has_key.hpp>
- #include <boost/mpl/assert.hpp>
- #include <boost/core/lightweight_test.hpp>
- #if defined(BOOST_PARAMETER_CAN_USE_MP11)
- #include <boost/mp11/map.hpp>
- #include <type_traits>
- #endif
- namespace test {
- template <typename ArgumentPack, typename K, typename T>
- void check0(ArgumentPack const& p, K const& kw, T const& value)
- {
- #if defined(BOOST_PARAMETER_CAN_USE_MP11)
- static_assert(
- !boost::mp11::mp_map_contains<ArgumentPack,test::tag::z>::value
- , "test::tag::z must not be in ArgumentPack"
- );
- static_assert(
- std::is_same<
- boost::mp11::mp_map_find<ArgumentPack,test::tag::z>
- , void
- >::value
- , "test::tag::z must not be found in ArgumentPack"
- );
- #endif // BOOST_PARAMETER_CAN_USE_MP11
- BOOST_MPL_ASSERT((boost::parameter::is_argument_pack<ArgumentPack>));
- BOOST_MPL_ASSERT_NOT((
- boost::mpl::has_key<ArgumentPack,test::tag::z>
- ));
- BOOST_TEST_EQ(p[kw], value);
- }
- } // namespace test
- #include <boost/mpl/void.hpp>
- #include <boost/mpl/bool.hpp>
- #include <boost/mpl/int.hpp>
- #include <boost/mpl/if.hpp>
- #include <boost/mpl/key_type.hpp>
- #include <boost/mpl/order.hpp>
- #include <boost/mpl/count.hpp>
- #include <boost/mpl/equal_to.hpp>
- #include <boost/type_traits/is_same.hpp>
- namespace test {
- template <typename ArgumentPack, typename K, typename T>
- void check1(ArgumentPack const& p, K const& kw, T const& value)
- {
- #if defined(BOOST_PARAMETER_CAN_USE_MP11)
- static_assert(
- boost::mp11::mp_map_contains<ArgumentPack,typename K::tag>::value
- , "typename K::tag must be in ArgumentPack"
- );
- static_assert(
- !boost::mp11::mp_map_contains<ArgumentPack,test::tag::z>::value
- , "test::tag::z must not be in ArgumentPack"
- );
- static_assert(
- !std::is_same<
- boost::mp11::mp_map_find<ArgumentPack,typename K::tag>
- , void
- >::value
- , "typename K::tag must be found in ArgumentPack"
- );
- static_assert(
- std::is_same<
- boost::mp11::mp_map_find<ArgumentPack,test::tag::z>
- , void
- >::value
- , "test::tag::z must not be found in ArgumentPack"
- );
- #endif // BOOST_PARAMETER_CAN_USE_MP11
- BOOST_MPL_ASSERT((boost::parameter::is_argument_pack<ArgumentPack>));
- BOOST_MPL_ASSERT((boost::mpl::has_key<ArgumentPack,typename K::tag>));
- BOOST_MPL_ASSERT_NOT((
- boost::mpl::has_key<ArgumentPack,test::tag::z>
- ));
- BOOST_MPL_ASSERT((
- boost::mpl::equal_to<
- typename boost::mpl::count<ArgumentPack,typename K::tag>::type
- , boost::mpl::int_<1>
- >
- ));
- BOOST_MPL_ASSERT((
- typename boost::mpl::if_<
- boost::is_same<
- typename boost::mpl
- ::key_type<ArgumentPack,typename K::tag>::type
- , typename K::tag
- >
- , boost::mpl::true_
- , boost::mpl::false_
- >::type
- ));
- BOOST_MPL_ASSERT((
- typename boost::mpl::if_<
- boost::is_same<
- typename boost::mpl
- ::order<ArgumentPack,typename K::tag>::type
- , boost::mpl::void_
- >
- , boost::mpl::false_
- , boost::mpl::true_
- >::type
- ));
- BOOST_TEST_EQ(p[kw], value);
- }
- } // namespace test
- int main()
- {
- test::check1(test::_x = 20, test::_x, 20);
- test::check1(test::_y = 20, test::_y, 20);
- test::check0(test::_x = 20, test::_x | 0, 20);
- test::check0(test::_y = 20, test::_y | 0, 20);
- test::check0(test::_x = 20, test::_x || test::default_src(), 20);
- test::check0(test::_y = 20, test::_y || test::default_src(), 20);
- test::check0(test::_y = 20, test::_x | 0, 0);
- test::check0(test::_y = 20, test::_x || test::default_src(), 0);
- return boost::report_errors();
- }
|