summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/parameter/test/ntp.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/boost/libs/parameter/test/ntp.cpp337
1 files changed, 337 insertions, 0 deletions
diff --git a/src/boost/libs/parameter/test/ntp.cpp b/src/boost/libs/parameter/test/ntp.cpp
new file mode 100644
index 00000000..c48628f0
--- /dev/null
+++ b/src/boost/libs/parameter/test/ntp.cpp
@@ -0,0 +1,337 @@
+// Copyright Daniel Wallin 2006.
+// 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 <boost/parameter/config.hpp>
+
+#if (BOOST_PARAMETER_MAX_ARITY < 4)
+#error Define BOOST_PARAMETER_MAX_ARITY as 4 or greater.
+#endif
+
+namespace test {
+
+ struct X
+ {
+ };
+
+ struct Y : X
+ {
+ };
+} // namespace test
+
+#if defined(BOOST_PARAMETER_CAN_USE_MP11)
+#include <type_traits>
+#else
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_base_of.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#endif
+
+namespace test {
+
+ struct Z
+ {
+ template <typename T, typename Args>
+#if defined(BOOST_PARAMETER_CAN_USE_MP11)
+ using fn = std::is_base_of<
+ X
+ , typename std::remove_const<
+ typename std::remove_reference<T>::type
+ >::type
+ >;
+#else
+ struct apply
+ : boost::mpl::if_<
+ boost::is_base_of<
+ X
+ , typename boost::remove_const<
+ typename boost::remove_reference<T>::type
+ >::type
+ >
+ , boost::mpl::true_
+ , boost::mpl::false_
+ >::type
+ {
+ };
+#endif // BOOST_PARAMETER_CAN_USE_MP11
+ };
+} // namespace test
+
+#include <boost/parameter/template_keyword.hpp>
+
+namespace test {
+
+ template <typename T = int>
+ struct a0_is : boost::parameter::template_keyword<test::a0_is<>,T>
+ {
+ };
+
+ template <typename T = int>
+ struct a1_is : boost::parameter::template_keyword<test::a1_is<>,T>
+ {
+ };
+
+ template <typename T = int>
+ struct a2_is : boost::parameter::template_keyword<test::a2_is<>,T>
+ {
+ };
+
+ template <typename T = int>
+ struct a3_is : boost::parameter::template_keyword<test::a3_is<>,T>
+ {
+ };
+} // namespace test
+
+#include <boost/parameter/parameters.hpp>
+#include <boost/parameter/optional.hpp>
+#include <boost/parameter/deduced.hpp>
+#include <boost/parameter/binding.hpp>
+
+namespace test {
+
+ template <
+ typename A0 = boost::parameter::void_
+ , typename A1 = boost::parameter::void_
+ , typename A2 = boost::parameter::void_
+ , typename A3 = boost::parameter::void_
+ >
+ struct with_ntp
+ {
+ typedef typename boost::parameter::parameters<
+ test::a0_is<>
+ , test::a1_is<>
+ , test::a2_is<>
+ , boost::parameter::optional<
+ boost::parameter::deduced<test::a3_is<> >
+ , Z
+ >
+ >::BOOST_NESTED_TEMPLATE bind<
+ A0
+ , A1
+ , A2
+ , A3
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+ , boost::parameter::void_
+#endif
+ >::type args;
+ typedef typename boost::parameter::binding<
+ args
+ , test::a0_is<>
+ , void*
+ >::type a0;
+ typedef typename boost::parameter::binding<
+ args
+ , test::a1_is<>
+ , void*
+ >::type a1;
+ typedef typename boost::parameter::binding<
+ args
+ , test::a2_is<>
+ , void*
+ >::type a2;
+ typedef typename boost::parameter::binding<
+ args
+ , test::a3_is<>
+ , void*
+ >::type a3;
+ typedef void(*type)(a0, a1, a2, a3);
+ };
+} // namespace test
+
+#include <boost/mpl/aux_/test.hpp>
+
+#if !defined(BOOST_PARAMETER_CAN_USE_MP11)
+#include <boost/mpl/assert.hpp>
+#include <boost/type_traits/is_same.hpp>
+#endif
+
+MPL_TEST_CASE()
+{
+#if defined(BOOST_PARAMETER_CAN_USE_MP11)
+ static_assert(
+ std::is_same<
+ test::with_ntp<>::type
+ , void(*)(void*, void*, void*, void*)
+ >::value
+ , "type must be void(*)(void*, void*, void*, void*)"
+ );
+ static_assert(
+ std::is_same<
+ test::with_ntp<test::a2_is<int> >::type
+ , void(*)(void*, void*, int, void*)
+ >::value
+ , "type must be void(*)(void*, void*, int, void*)"
+ );
+ static_assert(
+ std::is_same<
+ test::with_ntp<test::a1_is<int> >::type
+ , void(*)(void*, int, void*, void*)
+ >::value
+ , "type must be void(*)(void*, int, void*, void*)"
+ );
+ static_assert(
+ std::is_same<
+ test::with_ntp<test::a2_is<int const>,test::a1_is<float> >::type
+ , void(*)(void*, float, int const, void*)
+ >::value
+ , "type must be void(*)(void*, float, int const, void*)"
+ );
+ static_assert(
+ std::is_same<
+ test::with_ntp<int const>::type
+ , void(*)(int const, void*, void*, void*)
+ >::value
+ , "type must be void(*)(int const, void*, void*, void*)"
+ );
+ static_assert(
+ std::is_same<
+ test::with_ntp<int,float>::type
+ , void(*)(int, float, void*, void*)
+ >::value
+ , "type must be void(*)(int, float, void*, void*)"
+ );
+ static_assert(
+ std::is_same<
+ test::with_ntp<int,float,char>::type
+ , void(*)(int, float, char, void*)
+ >::value
+ , "type must be void(*)(int, float, char, void*)"
+ );
+ static_assert(
+ std::is_same<
+ test::with_ntp<test::a0_is<int>,test::Y>::type
+ , void(*)(int, void*, void*, test::Y)
+ >::value
+ , "type must be must be void(*)(int, void*, void*, test::Y)"
+ );
+ static_assert(
+ std::is_same<
+ test::with_ntp<int&,test::a2_is<char>,test::Y>::type
+ , void(*)(int&, void*, char, test::Y)
+ >::value
+ , "type must be void(*)(int&, void*, char, test::Y)"
+ );
+#else // !defined(BOOST_PARAMETER_CAN_USE_MP11)
+ BOOST_MPL_ASSERT((
+ boost::mpl::if_<
+ boost::is_same<
+ test::with_ntp<>::type
+ , void(*)(void*, void*, void*, void*)
+ >
+ , boost::mpl::true_
+ , boost::mpl::false_
+ >::type
+ ));
+ BOOST_MPL_ASSERT((
+ boost::mpl::if_<
+ boost::is_same<
+ test::with_ntp<test::a2_is<int> >::type
+ , void(*)(void*, void*, int, void*)
+ >
+ , boost::mpl::true_
+ , boost::mpl::false_
+ >::type
+ ));
+ BOOST_MPL_ASSERT((
+ boost::mpl::if_<
+ boost::is_same<
+ test::with_ntp<test::a1_is<int> >::type
+ , void(*)(void*, int, void*, void*)
+ >
+ , boost::mpl::true_
+ , boost::mpl::false_
+ >::type
+ ));
+ BOOST_MPL_ASSERT((
+ boost::mpl::if_<
+ boost::is_same<
+ test::with_ntp<
+ test::a2_is<int const>
+ , test::a1_is<float>
+ >::type
+ , void(*)(void*, float, int const, void*)
+ >
+ , boost::mpl::true_
+ , boost::mpl::false_
+ >::type
+ ));
+ BOOST_MPL_ASSERT((
+ boost::mpl::if_<
+ boost::is_same<
+ test::with_ntp<int const>::type
+ , void(*)(int const, void*, void*, void*)
+ >
+ , boost::mpl::true_
+ , boost::mpl::false_
+ >::type
+ ));
+ BOOST_MPL_ASSERT((
+ boost::mpl::if_<
+ boost::is_same<
+ test::with_ntp<int,float>::type
+ , void(*)(int, float, void*, void*)
+ >
+ , boost::mpl::true_
+ , boost::mpl::false_
+ >::type
+ ));
+ BOOST_MPL_ASSERT((
+ boost::mpl::if_<
+ boost::is_same<
+ test::with_ntp<int,float,char>::type
+ , void(*)(int, float, char, void*)
+ >
+ , boost::mpl::true_
+ , boost::mpl::false_
+ >::type
+ ));
+ BOOST_MPL_ASSERT((
+ boost::mpl::if_<
+ boost::is_same<
+ test::with_ntp<test::a0_is<int>,test::Y>::type
+ , void(*)(int, void*, void*, test::Y)
+ >
+ , boost::mpl::true_
+ , boost::mpl::false_
+ >::type
+ ));
+ BOOST_MPL_ASSERT((
+ boost::mpl::if_<
+ boost::is_same<
+ test::with_ntp<int&,test::a2_is<char>,test::Y>::type
+ , void(*)(int&, void*, char, test::Y)
+ >
+ , boost::mpl::true_
+ , boost::mpl::false_
+ >::type
+ ));
+#endif // BOOST_PARAMETER_CAN_USE_MP11
+
+ typedef int test_array[1];
+ typedef void(*test_function)();
+
+#if defined(BOOST_PARAMETER_CAN_USE_MP11)
+ static_assert(
+ std::is_same<
+ test::with_ntp<test_array,test_function>::type
+ , void(*)(test_array&, test_function, void*, void*)
+ >::value
+ , "type must be void(*)(test_array&, test_function, void*, void*)"
+ );
+#else
+ BOOST_MPL_ASSERT((
+ boost::mpl::if_<
+ boost::is_same<
+ test::with_ntp<test_array,test_function>::type
+ , void(*)(test_array&, test_function, void*, void*)
+ >
+ , boost::mpl::true_
+ , boost::mpl::false_
+ >::type
+ ));
+#endif
+}
+