69db508992
* Add are_tagged_arguments_mp11 and is_argument_pack_mp11 metafunctions when Boost.MP11 is usable. * Predicate requirements can be encoded as Boost.MP11-style quoted metafunctions as well as by MPL binary metafunction classes. * Argument packs qualify as Boost.MP11-style lists as well as MPL sequences. * Internal components and test programs use Boost.MP11 and C++11 type traits vice MPL and Boost.TypeTraits when Boost.MP11 is usable.
338 lines
8.9 KiB
C++
338 lines
8.9 KiB
C++
// 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
|
|
}
|
|
|