forked from boostorg/mp11
Unroll mp_take a bit more
This commit is contained in:
@@ -368,42 +368,80 @@ template<class L, class I> using mp_at = mp_at_c<L, std::size_t{ I::value }>;
|
||||
namespace detail
|
||||
{
|
||||
|
||||
template<class L, std::size_t N, class E = void> struct mp_take_c_impl;
|
||||
template<std::size_t N, class L, class E = void> struct mp_take_c_impl
|
||||
{
|
||||
};
|
||||
|
||||
template<template<class...> class L, class... T> struct mp_take_c_impl<L<T...>, 0>
|
||||
template<template<class...> class L, class... T>
|
||||
struct mp_take_c_impl<0, L<T...>>
|
||||
{
|
||||
using type = L<>;
|
||||
};
|
||||
|
||||
template<template<class...> class L, class T1, class... T> struct mp_take_c_impl<L<T1, T...>, 1>
|
||||
template<template<class...> class L, class T1, class... T>
|
||||
struct mp_take_c_impl<1, L<T1, T...>>
|
||||
{
|
||||
using type = L<T1>;
|
||||
};
|
||||
|
||||
template<template<class...> class L, class T1, class T2, class... T> struct mp_take_c_impl<L<T1, T2, T...>, 2>
|
||||
template<template<class...> class L, class T1, class T2, class... T>
|
||||
struct mp_take_c_impl<2, L<T1, T2, T...>>
|
||||
{
|
||||
using type = L<T1, T2>;
|
||||
};
|
||||
|
||||
template<template<class...> class L, class T1, class T2, class T3, class... T> struct mp_take_c_impl<L<T1, T2, T3, T...>, 3>
|
||||
template<template<class...> class L, class T1, class T2, class T3, class... T>
|
||||
struct mp_take_c_impl<3, L<T1, T2, T3, T...>>
|
||||
{
|
||||
using type = L<T1, T2, T3>;
|
||||
};
|
||||
|
||||
template<template<class...> class L, class T1, class T2, class T3, class T4, class... T> struct mp_take_c_impl<L<T1, T2, T3, T4, T...>, 4>
|
||||
template<template<class...> class L, class T1, class T2, class T3, class T4, class... T>
|
||||
struct mp_take_c_impl<4, L<T1, T2, T3, T4, T...>>
|
||||
{
|
||||
using type = L<T1, T2, T3, T4>;
|
||||
};
|
||||
|
||||
template<template<class...> class L, class T1, class T2, class T3, class T4, class T5, class... T, std::size_t N> struct mp_take_c_impl<L<T1, T2, T3, T4, T5, T...>, N, typename std::enable_if<N >= 5>::type>
|
||||
template<template<class...> class L, class T1, class T2, class T3, class T4, class T5, class... T>
|
||||
struct mp_take_c_impl<5, L<T1, T2, T3, T4, T5, T...>>
|
||||
{
|
||||
using type = mp_append<L<T1, T2, T3, T4, T5>, typename mp_take_c_impl<L<T...>, N-5>::type>;
|
||||
using type = L<T1, T2, T3, T4, T5>;
|
||||
};
|
||||
|
||||
template<template<class...> class L, class T1, class T2, class T3, class T4, class T5, class T6, class... T>
|
||||
struct mp_take_c_impl<6, L<T1, T2, T3, T4, T5, T6, T...>>
|
||||
{
|
||||
using type = L<T1, T2, T3, T4, T5, T6>;
|
||||
};
|
||||
|
||||
template<template<class...> class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class... T>
|
||||
struct mp_take_c_impl<7, L<T1, T2, T3, T4, T5, T6, T7, T...>>
|
||||
{
|
||||
using type = L<T1, T2, T3, T4, T5, T6, T7>;
|
||||
};
|
||||
|
||||
template<template<class...> class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class... T>
|
||||
struct mp_take_c_impl<8, L<T1, T2, T3, T4, T5, T6, T7, T8, T...>>
|
||||
{
|
||||
using type = L<T1, T2, T3, T4, T5, T6, T7, T8>;
|
||||
};
|
||||
|
||||
template<template<class...> class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class... T>
|
||||
struct mp_take_c_impl<9, L<T1, T2, T3, T4, T5, T6, T7, T8, T9, T...>>
|
||||
{
|
||||
using type = L<T1, T2, T3, T4, T5, T6, T7, T8, T9>;
|
||||
};
|
||||
|
||||
template<template<class...> class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class... T, std::size_t N>
|
||||
struct mp_take_c_impl<N, L<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T...>, typename std::enable_if<N >= 10>::type>
|
||||
{
|
||||
using type = mp_append<L<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>, typename mp_take_c_impl<N-10, L<T...>>::type>;
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template<class L, std::size_t N> using mp_take_c = typename detail::mp_take_c_impl<L, N>::type;
|
||||
template<class L, class N> using mp_take = typename detail::mp_take_c_impl<L, std::size_t{ N::value }>::type;
|
||||
template<class L, std::size_t N> using mp_take_c = typename detail::mp_take_c_impl<N, L>::type;
|
||||
template<class L, class N> using mp_take = typename detail::mp_take_c_impl<std::size_t{ N::value }, L>::type;
|
||||
|
||||
// mp_replace<L, V, W>
|
||||
namespace detail
|
||||
|
@@ -52,8 +52,19 @@ int main()
|
||||
|
||||
using L3 = mp_list<X1, X2, X3, X4, X5, X1, X2, X3, X4, X5, X1, X2, X3, X4, X5, X1, X2, X3, X4, X5>;
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_take_c<L3, 8>, mp_list<X1, X2, X3, X4, X5, X1, X2, X3>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_take<L3, mp_size_t<9>>, mp_list<X1, X2, X3, X4, X5, X1, X2, X3, X4>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_take_c<L3, 6>, mp_list<X1, X2, X3, X4, X5, X1>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_take_c<L3, 7>, mp_list<X1, X2, X3, X4, X5, X1, X2>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_take_c<L3, 8>, mp_list<X1, X2, X3, X4, X5, X1, X2, X3>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_take_c<L3, 9>, mp_list<X1, X2, X3, X4, X5, X1, X2, X3, X4>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_take_c<L3, 10>, mp_list<X1, X2, X3, X4, X5, X1, X2, X3, X4, X5>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_take_c<L3, 11>, mp_list<X1, X2, X3, X4, X5, X1, X2, X3, X4, X5, X1>>));
|
||||
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_take<L3, mp_size_t< 6>>, mp_list<X1, X2, X3, X4, X5, X1>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_take<L3, mp_size_t< 7>>, mp_list<X1, X2, X3, X4, X5, X1, X2>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_take<L3, mp_size_t< 8>>, mp_list<X1, X2, X3, X4, X5, X1, X2, X3>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_take<L3, mp_size_t< 9>>, mp_list<X1, X2, X3, X4, X5, X1, X2, X3, X4>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_take<L3, mp_size_t<10>>, mp_list<X1, X2, X3, X4, X5, X1, X2, X3, X4, X5>>));
|
||||
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_take<L3, mp_size_t<11>>, mp_list<X1, X2, X3, X4, X5, X1, X2, X3, X4, X5, X1>>));
|
||||
}
|
||||
|
||||
{
|
||||
|
Reference in New Issue
Block a user