From 917ac15ee19458f47a4345b640dad85fd54ff553 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Sun, 24 May 2020 00:56:43 +0300 Subject: [PATCH] Restrict msvc-12.0 to one tuple in tuple_transform --- include/boost/mp11/tuple.hpp | 44 +++++++++++++++++++++++++++++++----- test/tuple_transform.cpp | 20 +++++++++++++++- test/tuple_transform_2.cpp | 16 +++++++++++++ 3 files changed, 73 insertions(+), 7 deletions(-) diff --git a/include/boost/mp11/tuple.hpp b/include/boost/mp11/tuple.hpp index 3912839..13c972f 100644 --- a/include/boost/mp11/tuple.hpp +++ b/include/boost/mp11/tuple.hpp @@ -89,6 +89,41 @@ template BOOST_MP11_CONSTEXPR F tuple_for_each( Tp && tp, F & } // tuple_transform + +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 { @@ -99,11 +134,6 @@ 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 )... ); -} - 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)... ) )... ) ) @@ -135,7 +165,9 @@ BOOST_MP11_CONSTEXPR auto tuple_transform( F const& f, Tp&&... tp ) return detail::tuple_transform_impl( Seq(), f, std::forward(tp)... ); } -#endif +#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 22ed0ea..2adcaac 100644 --- a/test/tuple_transform.cpp +++ b/test/tuple_transform.cpp @@ -58,6 +58,8 @@ 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 ); @@ -73,6 +75,8 @@ int main() BOOST_TEST_EQ( std::get<1>(s).value, 8 ); BOOST_TEST_EQ( std::get<2>(s).value, 10 ); } +#endif + } { @@ -93,6 +97,8 @@ 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 ); @@ -108,6 +114,8 @@ int main() BOOST_TEST_EQ( std::get<1>(s).value, 8 ); BOOST_TEST_EQ( std::get<2>(s).value, 10 ); } +#endif + } { @@ -126,6 +134,8 @@ 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 ); @@ -139,6 +149,9 @@ int main() BOOST_TEST_EQ( std::get<0>(s).value, 5 ); BOOST_TEST_EQ( std::get<1>(s).value, 7 ); } + +#endif + } { @@ -157,6 +170,8 @@ 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 ); @@ -170,7 +185,10 @@ 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 a8c04e8..4dd89b3 100644 --- a/test/tuple_transform_2.cpp +++ b/test/tuple_transform_2.cpp @@ -63,6 +63,8 @@ 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 ) ); @@ -75,6 +77,8 @@ int main() BOOST_TEST_EQ( std::get<0>( r ), 6 ); } +#endif + // { @@ -98,6 +102,8 @@ 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 ) ); @@ -112,6 +118,8 @@ int main() BOOST_TEST_EQ( std::get<1>( r ), 12 ); } +#endif + // { @@ -130,6 +138,8 @@ 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 ) ); @@ -146,6 +156,10 @@ int main() BOOST_TEST_EQ( std::get<2>( r ), 18 ); } +#endif + +#if !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1900 ) + { using namespace boost::mp11; @@ -158,5 +172,7 @@ int main() mp_for_each( test_element{ r } ); } +#endif + return boost::report_errors(); }