// Copyright 2020 Peter Dimov // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #include #include #include #include #include #include #include int f( int x ) { return x + 1; } int g( int x, int y ) { return x + y; } int h( int x, int y, int z ) { return x + y + z; } int q( int x, int y, int z, int v ) { return x + y + z + v; } template std::array make_array( T1 t1, T... t ) { return { { t1, t... } }; } template struct test_element { Tp& tp; template void operator()( boost::mp11::mp_int ) const { BOOST_TEST_EQ( std::get( tp ), q( I, I, I, I ) ); } }; int main() { using boost::mp11::tuple_transform; // { std::tuple r = tuple_transform( f, std::make_tuple( 1 ) ); BOOST_TEST_EQ( std::get<0>( r ), 2 ); } { std::tuple r = tuple_transform( f, ::make_array( 1 ) ); BOOST_TEST_EQ( std::get<0>( r ), 2 ); } { std::tuple r = tuple_transform( g, ::make_array( 1 ), std::make_tuple( 2 ) ); BOOST_TEST_EQ( std::get<0>( r ), 3 ); } { std::tuple r = tuple_transform( h, ::make_array( 1 ), std::make_tuple( 2 ), ::make_array( 3 ) ); BOOST_TEST_EQ( std::get<0>( r ), 6 ); } // { std::tuple r = tuple_transform( f, std::make_tuple( 1, 2 ) ); BOOST_TEST_EQ( std::get<0>( r ), 2 ); BOOST_TEST_EQ( std::get<1>( r ), 3 ); } { std::tuple r = tuple_transform( f, std::make_pair( 1, 2 ) ); BOOST_TEST_EQ( std::get<0>( r ), 2 ); BOOST_TEST_EQ( std::get<1>( r ), 3 ); } { std::tuple r = tuple_transform( f, ::make_array( 1, 2 ) ); BOOST_TEST_EQ( std::get<0>( r ), 2 ); BOOST_TEST_EQ( std::get<1>( r ), 3 ); } { std::tuple r = tuple_transform( g, ::make_array( 1, 2 ), std::make_pair( 3, 4 ) ); BOOST_TEST_EQ( std::get<0>( r ), 4 ); BOOST_TEST_EQ( std::get<1>( r ), 6 ); } { std::tuple r = tuple_transform( h, ::make_array( 1, 2 ), std::make_pair( 3, 4 ), std::make_tuple( 5, 6 ) ); BOOST_TEST_EQ( std::get<0>( r ), 9 ); BOOST_TEST_EQ( std::get<1>( r ), 12 ); } // { std::tuple r = tuple_transform( f, std::make_tuple( 1, 2, 3 ) ); BOOST_TEST_EQ( std::get<0>( r ), 2 ); BOOST_TEST_EQ( std::get<1>( r ), 3 ); BOOST_TEST_EQ( std::get<2>( r ), 4 ); } { std::tuple r = tuple_transform( f, ::make_array( 1, 2, 3 ) ); BOOST_TEST_EQ( std::get<0>( r ), 2 ); BOOST_TEST_EQ( std::get<1>( r ), 3 ); BOOST_TEST_EQ( std::get<2>( r ), 4 ); } { std::tuple r = tuple_transform( g, ::make_array( 1, 2, 3 ), std::make_tuple( 4, 5, 6 ) ); BOOST_TEST_EQ( std::get<0>( r ), 5 ); BOOST_TEST_EQ( std::get<1>( r ), 7 ); BOOST_TEST_EQ( std::get<2>( r ), 9 ); } { std::tuple r = tuple_transform( h, ::make_array( 1, 2, 3 ), std::make_tuple( 4, 5, 6 ), ::make_array( 7, 8, 9 ) ); BOOST_TEST_EQ( std::get<0>( r ), 12 ); BOOST_TEST_EQ( std::get<1>( r ), 15 ); BOOST_TEST_EQ( std::get<2>( r ), 18 ); } #if !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1900 ) { using namespace boost::mp11; int const N = 12; using Tp = mp_rename >, std::tuple>; auto const r = tuple_transform( q, Tp(), Tp(), Tp(), Tp() ); mp_for_each( test_element{ r } ); } #endif return boost::report_errors(); }