From a0ea1055d29b1b3f54333d28133b9aaff1643bc9 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Sun, 24 May 2020 01:14:46 +0300 Subject: [PATCH] Support up to three tuples in tuple_transform under msvc-12.0 --- include/boost/mp11/tuple.hpp | 68 +++++++++++++++++------------------- test/tuple_transform.cpp | 20 +---------- test/tuple_transform_2.cpp | 12 ------- 3 files changed, 33 insertions(+), 67 deletions(-) diff --git a/include/boost/mp11/tuple.hpp b/include/boost/mp11/tuple.hpp index 13c972f..5475211 100644 --- a/include/boost/mp11/tuple.hpp +++ b/include/boost/mp11/tuple.hpp @@ -93,40 +93,6 @@ template BOOST_MP11_CONSTEXPR F tuple_for_each( Tp && tp, F & namespace detail { -template BOOST_MP11_CONSTEXPR auto tp_forward( T&&... t ) -> std::tuple -{ - return std::tuple( std::forward( t )... ); -} - -} // namespace detail - -#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1900 ) - -namespace detail -{ - -template -BOOST_MP11_CONSTEXPR auto tuple_transform_impl( integer_sequence, F const& f, Tp&& tp ) - -> decltype( tp_forward( f( std::get( std::forward(tp) ) )... ) ) -{ - return tp_forward( f( std::get( std::forward(tp) ) )... ); -} - -} // namespace detail - -template::type>::value>> -BOOST_MP11_CONSTEXPR auto tuple_transform( F const& f, Tp&& tp ) - -> decltype( detail::tuple_transform_impl( Seq(), f, std::forward(tp) ) ) -{ - return detail::tuple_transform_impl( Seq(), f, std::forward(tp) ); -} - -#else - -namespace detail -{ - template BOOST_MP11_CONSTEXPR auto tp_extract( Tp&&... tp ) -> decltype( std::forward_as_tuple( std::get( std::forward( tp ) )... ) ) @@ -134,6 +100,13 @@ BOOST_MP11_CONSTEXPR auto tp_extract( Tp&&... tp ) return std::forward_as_tuple( std::get( std::forward( tp ) )... ); } +template BOOST_MP11_CONSTEXPR auto tp_forward( T&&... t ) -> std::tuple +{ + return std::tuple( std::forward( t )... ); +} + +#if !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1900 ) + template BOOST_MP11_CONSTEXPR auto tuple_transform_impl( integer_sequence, F const& f, Tp&&... tp ) -> decltype( tp_forward( tuple_apply( f, tp_extract( std::forward(tp)... ) )... ) ) @@ -141,6 +114,31 @@ BOOST_MP11_CONSTEXPR auto tuple_transform_impl( integer_sequence( std::forward(tp)... ) )... ); } +#else + +template +BOOST_MP11_CONSTEXPR auto tuple_transform_impl( integer_sequence, F const& f, Tp1&& tp1 ) + -> decltype( tp_forward( f( std::get( std::forward(tp1) ) )... ) ) +{ + return tp_forward( f( std::get( std::forward(tp1) ) )... ); +} + +template +BOOST_MP11_CONSTEXPR auto tuple_transform_impl( integer_sequence, F const& f, Tp1&& tp1, Tp2&& tp2 ) + -> decltype( tp_forward( f( std::get( std::forward(tp1) ), std::get( std::forward(tp2) ) )... ) ) +{ + return tp_forward( f( std::get( std::forward(tp1) ), std::get( std::forward(tp2) ) )... ); +} + +template +BOOST_MP11_CONSTEXPR auto tuple_transform_impl( integer_sequence, F const& f, Tp1&& tp1, Tp2&& tp2, Tp3&& tp3 ) + -> decltype( tp_forward( f( std::get( std::forward(tp1) ), std::get( std::forward(tp2) ), std::get( std::forward(tp3) ) )... ) ) +{ + return tp_forward( f( std::get( std::forward(tp1) ), std::get( std::forward(tp2) ), std::get( std::forward(tp3) ) )... ); +} + +#endif // !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1900 ) + } // namespace detail #if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1910 ) @@ -167,8 +165,6 @@ BOOST_MP11_CONSTEXPR auto tuple_transform( F const& f, Tp&&... tp ) #endif // BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1910 ) -#endif // BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1900 ) - } // namespace mp11 } // namespace boost diff --git a/test/tuple_transform.cpp b/test/tuple_transform.cpp index 2adcaac..22ed0ea 100644 --- a/test/tuple_transform.cpp +++ b/test/tuple_transform.cpp @@ -58,8 +58,6 @@ int main() BOOST_TEST_EQ( std::get<2>(s).value, 5 ); } -#if !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1900 ) - { std::tuple, T<7>, T<9>> s = tuple_transform( F{}, tp, tp2 ); BOOST_TEST_EQ( std::get<0>(s).value, 6 ); @@ -75,8 +73,6 @@ int main() BOOST_TEST_EQ( std::get<1>(s).value, 8 ); BOOST_TEST_EQ( std::get<2>(s).value, 10 ); } -#endif - } { @@ -97,8 +93,6 @@ int main() BOOST_TEST_EQ( std::get<2>(s).value, 5 ); } -#if !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1900 ) - { std::tuple, T<7>, T<9>> s = tuple_transform( F{}, tp, tp2 ); BOOST_TEST_EQ( std::get<0>(s).value, 6 ); @@ -114,8 +108,6 @@ int main() BOOST_TEST_EQ( std::get<1>(s).value, 8 ); BOOST_TEST_EQ( std::get<2>(s).value, 10 ); } -#endif - } { @@ -134,8 +126,6 @@ int main() BOOST_TEST_EQ( std::get<1>(s).value, 4 ); } -#if !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1900 ) - { std::tuple, T<6>> s = tuple_transform( F{}, tp, tp2 ); BOOST_TEST_EQ( std::get<0>(s).value, 5 ); @@ -149,9 +139,6 @@ int main() BOOST_TEST_EQ( std::get<0>(s).value, 5 ); BOOST_TEST_EQ( std::get<1>(s).value, 7 ); } - -#endif - } { @@ -170,8 +157,6 @@ int main() BOOST_TEST_EQ( std::get<1>(s).value, 4 ); } -#if !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1900 ) - { std::tuple, T<6>> s = tuple_transform( F{}, tp, tp2 ); BOOST_TEST_EQ( std::get<0>(s).value, 5 ); @@ -185,10 +170,7 @@ int main() BOOST_TEST_EQ( std::get<0>(s).value, 5 ); BOOST_TEST_EQ( std::get<1>(s).value, 7 ); } - -#endif - - } + } { std::tuple<> tp; diff --git a/test/tuple_transform_2.cpp b/test/tuple_transform_2.cpp index 4dd89b3..a8c10a9 100644 --- a/test/tuple_transform_2.cpp +++ b/test/tuple_transform_2.cpp @@ -63,8 +63,6 @@ int main() BOOST_TEST_EQ( std::get<0>( r ), 2 ); } -#if !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1900 ) - { std::tuple r = tuple_transform( g, ::make_array( 1 ), std::make_tuple( 2 ) ); @@ -77,8 +75,6 @@ int main() BOOST_TEST_EQ( std::get<0>( r ), 6 ); } -#endif - // { @@ -102,8 +98,6 @@ int main() BOOST_TEST_EQ( std::get<1>( r ), 3 ); } -#if !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1900 ) - { std::tuple r = tuple_transform( g, ::make_array( 1, 2 ), std::make_pair( 3, 4 ) ); @@ -118,8 +112,6 @@ int main() BOOST_TEST_EQ( std::get<1>( r ), 12 ); } -#endif - // { @@ -138,8 +130,6 @@ int main() BOOST_TEST_EQ( std::get<2>( r ), 4 ); } -#if !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1900 ) - { std::tuple r = tuple_transform( g, ::make_array( 1, 2, 3 ), std::make_tuple( 4, 5, 6 ) ); @@ -156,8 +146,6 @@ int main() BOOST_TEST_EQ( std::get<2>( r ), 18 ); } -#endif - #if !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1900 ) {