diff options
Diffstat (limited to 'src/boost/libs/parameter/test/singular.cpp')
-rw-r--r-- | src/boost/libs/parameter/test/singular.cpp | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/src/boost/libs/parameter/test/singular.cpp b/src/boost/libs/parameter/test/singular.cpp new file mode 100644 index 00000000..a8c20e91 --- /dev/null +++ b/src/boost/libs/parameter/test/singular.cpp @@ -0,0 +1,158 @@ +// 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(); +} + |