summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/parameter/test/singular.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/parameter/test/singular.cpp')
-rw-r--r--src/boost/libs/parameter/test/singular.cpp158
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();
+}
+