forked from boostorg/mp11
Add a variadic mp_transform implementation
This commit is contained in:
@@ -44,6 +44,16 @@ template<class L1, class L2> using mp_assign = typename detail::mp_assign_impl<L
|
||||
// mp_clear<L>
|
||||
template<class L> using mp_clear = mp_assign<L, mp_list<>>;
|
||||
|
||||
// mp_fold<L, V, F> forward declaration
|
||||
namespace detail
|
||||
{
|
||||
|
||||
template<class L, class V, template<class...> class F> struct mp_fold_impl;
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template<class L, class V, template<class...> class F> using mp_fold = typename detail::mp_fold_impl<L, V, F>::type;
|
||||
|
||||
// mp_transform<F, L...>
|
||||
namespace detail
|
||||
{
|
||||
@@ -71,6 +81,26 @@ template<template<class...> class F, template<class...> class L1, class... T1, t
|
||||
|
||||
template<template<class...> class F, class... L> using mp_transform = typename detail::mp_transform_impl<F, L...>::type;
|
||||
|
||||
namespace detail
|
||||
{
|
||||
|
||||
template<template<class...> class F, template<class...> class L1, class... T1, template<class...> class L2, class... T2, template<class...> class L3, class... T3, template<class...> class L4, class... T4, class... L> struct mp_transform_impl<F, L1<T1...>, L2<T2...>, L3<T3...>, L4<T4...>, L...>
|
||||
{
|
||||
static_assert( sizeof...(T1) == sizeof...(T2) && sizeof...(T1) == sizeof...(T3) && sizeof...(T1) == sizeof...(T4), "The arguments of mp_transform should be of the same size" );
|
||||
|
||||
using A1 = L1<mp_list<T1, T2, T3, T4>...>;
|
||||
|
||||
template<class V, class T> using _f = mp_transform<mp_push_back, V, T>;
|
||||
|
||||
using A2 = mp_fold<mp_list<L...>, A1, _f>;
|
||||
|
||||
template<class T> using _g = mp_apply<F, T>;
|
||||
|
||||
using type = mp_transform<_g, A2>;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
// mp_transform_if<P, F, L...>
|
||||
namespace detail
|
||||
{
|
||||
@@ -753,8 +783,6 @@ template<template<class...> class L, class T1, class T2, class T3, class T4, cla
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template<class L, class V, template<class...> class F> using mp_fold = typename detail::mp_fold_impl<L, V, F>::type;
|
||||
|
||||
// mp_reverse_fold<L, V, F>
|
||||
namespace detail
|
||||
{
|
||||
|
@@ -29,6 +29,15 @@ struct Z2 {};
|
||||
struct Z3 {};
|
||||
struct Z4 {};
|
||||
|
||||
struct U1 {};
|
||||
struct U2 {};
|
||||
|
||||
struct V1 {};
|
||||
struct V2 {};
|
||||
|
||||
struct W1 {};
|
||||
struct W2 {};
|
||||
|
||||
template<class T> using add_pointer = typename std::add_pointer<T>::type;
|
||||
template<class T, class U> using is_same = typename std::is_same<T, U>::type;
|
||||
|
||||
@@ -81,5 +90,16 @@ int main()
|
||||
|
||||
//
|
||||
|
||||
using L8 = std::pair<Z1, Z2>;
|
||||
using L9 = std::pair<U1, U2>;
|
||||
using L10 = std::pair<V1, V2>;
|
||||
using L11 = std::pair<W1, W2>;
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_transform<std::tuple, L5, L6, L8, L9>, std::pair<std::tuple<X1, Y1, Z1, U1>, std::tuple<X2, Y2, Z2, U2>>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_transform<std::tuple, L5, L6, L8, L9, L10>, std::pair<std::tuple<X1, Y1, Z1, U1, V1>, std::tuple<X2, Y2, Z2, U2, V2>>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_transform<std::tuple, L5, L6, L8, L9, L10, L11>, std::pair<std::tuple<X1, Y1, Z1, U1, V1, W1>, std::tuple<X2, Y2, Z2, U2, V2, W2>>>));
|
||||
|
||||
//
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
Reference in New Issue
Block a user