mirror of
https://github.com/boostorg/mp11.git
synced 2025-08-01 13:34:28 +02:00
Add support for mp_product<F>
This commit is contained in:
@@ -262,7 +262,8 @@ Same as `mp_repeat_c` but with a type argument `N`. The number of copies is `N::
|
|||||||
|
|
||||||
`mp_product<F, L1<T1...>, L2<T2...>, ..., Ln<Tn...>>` evaluates `F<U1, U2, ..., Un>` for values `Ui` taken from
|
`mp_product<F, L1<T1...>, L2<T2...>, ..., Ln<Tn...>>` evaluates `F<U1, U2, ..., Un>` for values `Ui` taken from
|
||||||
the Cartesian product of the lists, as if the elements `Ui` are formed by `n` nested loops, each traversing `Li`.
|
the Cartesian product of the lists, as if the elements `Ui` are formed by `n` nested loops, each traversing `Li`.
|
||||||
It returns a list of the form `L1<V...>` containing the results of the application of `F`.
|
It returns a list of the form `L1<V...>` containing the results of the application of `F`. The degenerate case
|
||||||
|
of zero lists, `mp_product<F>`, returns `mp_list<F<>>`.
|
||||||
|
|
||||||
.mp_product on two lists
|
.mp_product on two lists
|
||||||
[cols="<.^4m,4*^.^1m",width=85%]
|
[cols="<.^4m,4*^.^1m",width=85%]
|
||||||
|
@@ -254,7 +254,9 @@ template<class L, class N> using mp_repeat = typename detail::mp_repeat_c_impl<L
|
|||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
template<template<class...> class F, class P, class... L> struct mp_product_impl_2;
|
template<template<class...> class F, class P, class... L> struct mp_product_impl_2
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
template<template<class...> class F, class P> struct mp_product_impl_2<F, P>
|
template<template<class...> class F, class P> struct mp_product_impl_2<F, P>
|
||||||
{
|
{
|
||||||
@@ -266,7 +268,14 @@ template<template<class...> class F, class P, template<class...> class L1, class
|
|||||||
using type = mp_append<typename mp_product_impl_2<F, mp_push_back<P, T1>, L...>::type...>;
|
using type = mp_append<typename mp_product_impl_2<F, mp_push_back<P, T1>, L...>::type...>;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<template<class...> class F, class... L> struct mp_product_impl;
|
template<template<class...> class F, class... L> struct mp_product_impl
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template<template<class...> class F> struct mp_product_impl<F>
|
||||||
|
{
|
||||||
|
using type = mp_list< F<> >;
|
||||||
|
};
|
||||||
|
|
||||||
template<template<class...> class F, class L1, class... L> struct mp_product_impl<F, L1, L...>
|
template<template<class...> class F, class L1, class... L> struct mp_product_impl<F, L1, L...>
|
||||||
{
|
{
|
||||||
|
@@ -24,9 +24,10 @@ struct Y1 {};
|
|||||||
struct Z1 {};
|
struct Z1 {};
|
||||||
struct Z2 {};
|
struct Z2 {};
|
||||||
|
|
||||||
template<class T1, class T2, class T3> struct F {};
|
|
||||||
|
|
||||||
template<class T> struct F1 {};
|
template<class T> struct F1 {};
|
||||||
|
template<class T1, class T2, class T3> struct F3 {};
|
||||||
|
|
||||||
|
template<class...> struct F {};
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
@@ -40,8 +41,8 @@ int main()
|
|||||||
using L2 = mp_list<Y1>;
|
using L2 = mp_list<Y1>;
|
||||||
using L3 = std::pair<Z1, Z2>;
|
using L3 = std::pair<Z1, Z2>;
|
||||||
|
|
||||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_product<F, L1, L2, L3>, std::tuple<F<X1, Y1, Z1>, F<X1, Y1, Z2>, F<X2, Y1, Z1>, F<X2, Y1, Z2>, F<X3, Y1, Z1>, F<X3, Y1, Z2>>>));
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_product<F3, L1, L2, L3>, std::tuple<F3<X1, Y1, Z1>, F3<X1, Y1, Z2>, F3<X2, Y1, Z1>, F3<X2, Y1, Z2>, F3<X3, Y1, Z1>, F3<X3, Y1, Z2>>>));
|
||||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_product_q<mp_quote<F>, L1, L2, L3>, std::tuple<F<X1, Y1, Z1>, F<X1, Y1, Z2>, F<X2, Y1, Z1>, F<X2, Y1, Z2>, F<X3, Y1, Z1>, F<X3, Y1, Z2>>>));
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_product_q<mp_quote<F3>, L1, L2, L3>, std::tuple<F3<X1, Y1, Z1>, F3<X1, Y1, Z2>, F3<X2, Y1, Z1>, F3<X2, Y1, Z2>, F3<X3, Y1, Z1>, F3<X3, Y1, Z2>>>));
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -49,8 +50,8 @@ int main()
|
|||||||
using L2 = mp_list<>;
|
using L2 = mp_list<>;
|
||||||
using L3 = std::pair<Z1, Z2>;
|
using L3 = std::pair<Z1, Z2>;
|
||||||
|
|
||||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_product<F, L1, L2, L3>, std::tuple<>>));
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_product<F3, L1, L2, L3>, std::tuple<>>));
|
||||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_product_q<mp_quote<F>, L1, L2, L3>, std::tuple<>>));
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_product_q<mp_quote<F3>, L1, L2, L3>, std::tuple<>>));
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -64,5 +65,10 @@ int main()
|
|||||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_product_q<mp_quote<F1>, L2>, mp_list<F1<X1>, F1<X2>, F1<X3>>>));
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_product_q<mp_quote<F1>, L2>, mp_list<F1<X1>, F1<X2>, F1<X3>>>));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_product<F>, mp_list<F<>>>));
|
||||||
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_product_q<mp_quote<F>>, mp_list<F<>>>));
|
||||||
|
}
|
||||||
|
|
||||||
return boost::report_errors();
|
return boost::report_errors();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user