From e488469e9a2241c42ac1ac50bf5dbfe10ac8bdad Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Fri, 24 Mar 2017 17:21:38 +0200 Subject: [PATCH] Unroll mp_fold. --- include/boost/mp11/algorithm.hpp | 5 +++++ test/mp_fold.cpp | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/include/boost/mp11/algorithm.hpp b/include/boost/mp11/algorithm.hpp index 8769e3e..8a83e36 100644 --- a/include/boost/mp11/algorithm.hpp +++ b/include/boost/mp11/algorithm.hpp @@ -758,6 +758,11 @@ template class L, class T1, class... T, class V, template, F, F>::type; }; +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, class V, template class F> struct mp_fold_impl, V, F> +{ + using type = typename mp_fold_impl, F, T2>, T3>, T4>, T5>, T6>, T7>, T8>, T9>, T10>, F>::type; +}; + } // namespace detail template class F> using mp_fold = typename detail::mp_fold_impl::type; diff --git a/test/mp_fold.cpp b/test/mp_fold.cpp index 4a0fa73..96dd7ba 100644 --- a/test/mp_fold.cpp +++ b/test/mp_fold.cpp @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -53,5 +54,25 @@ int main() BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list<>, mp_push_front>, mp_list>)); } + using boost::mp11::mp_iota_c; + using boost::mp11::mp_reverse; + using boost::mp11::mp_size_t; + using boost::mp11::mp_plus; + + { + int const N = 37; + + using L = mp_iota_c; + + using R1 = mp_fold, mp_push_back>; + BOOST_TEST_TRAIT_TRUE((std::is_same)); + + using R2 = mp_fold, mp_push_front>; + BOOST_TEST_TRAIT_TRUE((std::is_same>)); + + using R3 = mp_fold, mp_plus>; + BOOST_TEST_TRAIT_TRUE((std::is_same>)); + } + return boost::report_errors(); }