From 13c36a793c397c1fc75c4e4c5be10e1338680622 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Sat, 9 May 2020 17:32:03 +0300 Subject: [PATCH] Improve compilation performance of mp_with_index for large N --- include/boost/mp11/detail/mp_with_index.hpp | 25 +++++---------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/include/boost/mp11/detail/mp_with_index.hpp b/include/boost/mp11/detail/mp_with_index.hpp index 3eec9b6..b6932f2 100644 --- a/include/boost/mp11/detail/mp_with_index.hpp +++ b/include/boost/mp11/detail/mp_with_index.hpp @@ -40,27 +40,14 @@ template struct mp_with_index_impl_ { template static BOOST_MP11_CONSTEXPR14 decltype(std::declval()(std::declval>())) call( std::size_t i, F && f ) { - switch( i ) + if( i < N / 2 ) { - case 0: return std::forward(f)( mp_size_t() ); - case 1: return std::forward(f)( mp_size_t() ); - case 2: return std::forward(f)( mp_size_t() ); - case 3: return std::forward(f)( mp_size_t() ); - case 4: return std::forward(f)( mp_size_t() ); - case 5: return std::forward(f)( mp_size_t() ); - case 6: return std::forward(f)( mp_size_t() ); - case 7: return std::forward(f)( mp_size_t() ); - case 8: return std::forward(f)( mp_size_t() ); - case 9: return std::forward(f)( mp_size_t() ); - case 10: return std::forward(f)( mp_size_t() ); - case 11: return std::forward(f)( mp_size_t() ); - case 12: return std::forward(f)( mp_size_t() ); - case 13: return std::forward(f)( mp_size_t() ); - case 14: return std::forward(f)( mp_size_t() ); - case 15: return std::forward(f)( mp_size_t() ); + return mp_with_index_impl_::template call( i, std::forward(f) ); + } + else + { + return mp_with_index_impl_::template call( i - N/2, std::forward(f) ); } - - return mp_with_index_impl_::template call( i-16, std::forward(f) ); } };