diff --git a/include/boost/mp11/algorithm.hpp b/include/boost/mp11/algorithm.hpp index 31d5c4e..45506b1 100644 --- a/include/boost/mp11/algorithm.hpp +++ b/include/boost/mp11/algorithm.hpp @@ -368,42 +368,80 @@ template using mp_at = mp_at_c; namespace detail { -template struct mp_take_c_impl; +template struct mp_take_c_impl +{ +}; -template class L, class... T> struct mp_take_c_impl, 0> +template class L, class... T> +struct mp_take_c_impl<0, L> { using type = L<>; }; -template class L, class T1, class... T> struct mp_take_c_impl, 1> +template class L, class T1, class... T> +struct mp_take_c_impl<1, L> { using type = L; }; -template class L, class T1, class T2, class... T> struct mp_take_c_impl, 2> +template class L, class T1, class T2, class... T> +struct mp_take_c_impl<2, L> { using type = L; }; -template class L, class T1, class T2, class T3, class... T> struct mp_take_c_impl, 3> +template class L, class T1, class T2, class T3, class... T> +struct mp_take_c_impl<3, L> { using type = L; }; -template class L, class T1, class T2, class T3, class T4, class... T> struct mp_take_c_impl, 4> +template class L, class T1, class T2, class T3, class T4, class... T> +struct mp_take_c_impl<4, L> { 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> +template class L, class T1, class T2, class T3, class T4, class T5, class... T> +struct mp_take_c_impl<5, L> { - using type = mp_append, typename mp_take_c_impl, N-5>::type>; + using type = L; +}; + +template class L, class T1, class T2, class T3, class T4, class T5, class T6, class... T> +struct mp_take_c_impl<6, L> +{ + using type = L; +}; + +template 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> +{ + using type = L; +}; + +template 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> +{ + using type = L; +}; + +template 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> +{ + using type = L; +}; + +template 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, typename std::enable_if= 10>::type> +{ + using type = mp_append, typename mp_take_c_impl>::type>; }; } // namespace detail -template using mp_take_c = typename detail::mp_take_c_impl::type; -template using mp_take = typename detail::mp_take_c_impl::type; +template using mp_take_c = typename detail::mp_take_c_impl::type; +template using mp_take = typename detail::mp_take_c_impl::type; // mp_replace namespace detail diff --git a/test/mp_take.cpp b/test/mp_take.cpp index 781531d..c7f0422 100644 --- a/test/mp_take.cpp +++ b/test/mp_take.cpp @@ -52,8 +52,19 @@ int main() using L3 = mp_list; - BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list>)); - BOOST_TEST_TRAIT_TRUE((std::is_same>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, mp_list>)); } {