From 32938df3182a5dc4a587fd54cf99d46e68d229ea Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Wed, 22 Mar 2017 02:03:39 +0200 Subject: [PATCH] Less clever, much faster, mp_take --- include/boost/mp11/algorithm.hpp | 44 ++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/include/boost/mp11/algorithm.hpp b/include/boost/mp11/algorithm.hpp index 4a6cafe..2f81789 100644 --- a/include/boost/mp11/algorithm.hpp +++ b/include/boost/mp11/algorithm.hpp @@ -290,23 +290,47 @@ template using mp_at = typename detail::mp_at_impl::type namespace detail { +template struct mp_take_c_impl; + +template class L, class... T> struct mp_take_c_impl, 0> +{ + using type = L<>; +}; + +template class L, class T1, class... T> struct mp_take_c_impl, 1> +{ + using type = L; +}; + +template class L, class T1, class T2, class... T> struct mp_take_c_impl, 2> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3, class... T> struct mp_take_c_impl, 3> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3, class T4, class... T> struct mp_take_c_impl, 4> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3, class T4, class T5, class... T, std::size_t N> struct mp_take_c_impl, N, typename std::enable_if= 5>::type> +{ + using type = mp_append, typename mp_take_c_impl, N-5>::type>; +}; + template struct mp_take_impl { static_assert( N::value >= 0, "mp_take: N must not be negative" ); - - using _map = mp_transform>, L>; - - template using _f = mp_second>; - - using _ind = mp_iota_c; - - using type = mp_assign>; + using type = typename mp_take_c_impl::type; }; } // namespace detail -template using mp_take_c = typename detail::mp_take_impl>::type; - +template using mp_take_c = typename detail::mp_take_c_impl::type; template using mp_take = typename detail::mp_take_impl::type; // mp_replace