1
0
forked from boostorg/mp11

Improve compilation performance of mp_with_index<N> for large N

This commit is contained in:
Peter Dimov
2020-05-09 17:32:03 +03:00
parent 0198b6e5a7
commit 13c36a793c

View File

@@ -40,27 +40,14 @@ template<std::size_t N> struct mp_with_index_impl_
{ {
template<std::size_t K, class F> static BOOST_MP11_CONSTEXPR14 decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f ) template<std::size_t K, class F> static BOOST_MP11_CONSTEXPR14 decltype(std::declval<F>()(std::declval<mp_size_t<0>>())) call( std::size_t i, F && f )
{ {
switch( i ) if( i < N / 2 )
{ {
case 0: return std::forward<F>(f)( mp_size_t<K+0>() ); return mp_with_index_impl_<N/2>::template call<K>( i, std::forward<F>(f) );
case 1: return std::forward<F>(f)( mp_size_t<K+1>() ); }
case 2: return std::forward<F>(f)( mp_size_t<K+2>() ); else
case 3: return std::forward<F>(f)( mp_size_t<K+3>() ); {
case 4: return std::forward<F>(f)( mp_size_t<K+4>() ); return mp_with_index_impl_<N-N/2>::template call<K+N/2>( i - N/2, std::forward<F>(f) );
case 5: return std::forward<F>(f)( mp_size_t<K+5>() );
case 6: return std::forward<F>(f)( mp_size_t<K+6>() );
case 7: return std::forward<F>(f)( mp_size_t<K+7>() );
case 8: return std::forward<F>(f)( mp_size_t<K+8>() );
case 9: return std::forward<F>(f)( mp_size_t<K+9>() );
case 10: return std::forward<F>(f)( mp_size_t<K+10>() );
case 11: return std::forward<F>(f)( mp_size_t<K+11>() );
case 12: return std::forward<F>(f)( mp_size_t<K+12>() );
case 13: return std::forward<F>(f)( mp_size_t<K+13>() );
case 14: return std::forward<F>(f)( mp_size_t<K+14>() );
case 15: return std::forward<F>(f)( mp_size_t<K+15>() );
} }
return mp_with_index_impl_<N-16>::template call<K+16>( i-16, std::forward<F>(f) );
} }
}; };