// Copyright 2020 Hans Dembinski. // // Distributed under the Boost Software License, Version 1.0. // // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt #include #include #include #include #include #include // family of test types with state template struct T { int value; T() : value{N} {}; explicit T(int n) : value{n} {} }; template std::ostream& operator<<( std::ostream& os, T const& t ) { os << t.value; return os; } // test function changes type and value struct F { template T operator()( T a, T b={} ) const { return T{a.value + b.value + 1}; } }; int main() { using boost::mp11::tuple_transform; { std::tuple, T<2>, T<3>> tp; std::tuple, T<5>, T<6>> tp2; { std::tuple, T<3>, T<4>> s = tuple_transform( F{}, tp ); BOOST_TEST_EQ( std::get<0>(s).value, 3 ); BOOST_TEST_EQ( std::get<1>(s).value, 4 ); BOOST_TEST_EQ( std::get<2>(s).value, 5 ); } { std::tuple, T<3>, T<4>> s = tuple_transform( F{}, std::move(tp) ); BOOST_TEST_EQ( std::get<0>(s).value, 3 ); BOOST_TEST_EQ( std::get<1>(s).value, 4 ); BOOST_TEST_EQ( std::get<2>(s).value, 5 ); } { std::tuple, T<7>, T<9>> s = tuple_transform( F{}, tp, tp2 ); BOOST_TEST_EQ( std::get<0>(s).value, 6 ); BOOST_TEST_EQ( std::get<1>(s).value, 8 ); BOOST_TEST_EQ( std::get<2>(s).value, 10 ); } { std::tuple, T<7>, T<9>> s = tuple_transform( F{}, std::move(tp), std::move(tp2) ); BOOST_TEST_EQ( std::get<0>(s).value, 6 ); BOOST_TEST_EQ( std::get<1>(s).value, 8 ); BOOST_TEST_EQ( std::get<2>(s).value, 10 ); } } { std::tuple, T<2>, T<3>> const tp; std::tuple, T<5>, T<6>> const tp2; { std::tuple, T<3>, T<4>> s = tuple_transform( F{}, tp ); BOOST_TEST_EQ( std::get<0>(s).value, 3 ); BOOST_TEST_EQ( std::get<1>(s).value, 4 ); BOOST_TEST_EQ( std::get<2>(s).value, 5 ); } { std::tuple, T<3>, T<4>> s = tuple_transform( F{}, std::move(tp) ); BOOST_TEST_EQ( std::get<0>(s).value, 3 ); BOOST_TEST_EQ( std::get<1>(s).value, 4 ); BOOST_TEST_EQ( std::get<2>(s).value, 5 ); } { std::tuple, T<7>, T<9>> s = tuple_transform( F{}, tp, tp2 ); BOOST_TEST_EQ( std::get<0>(s).value, 6 ); BOOST_TEST_EQ( std::get<1>(s).value, 8 ); BOOST_TEST_EQ( std::get<2>(s).value, 10 ); } { std::tuple, T<7>, T<9>> s = tuple_transform( F{}, std::move(tp), std::move(tp2) ); BOOST_TEST_EQ( std::get<0>(s).value, 6 ); BOOST_TEST_EQ( std::get<1>(s).value, 8 ); BOOST_TEST_EQ( std::get<2>(s).value, 10 ); } } { std::pair, T<2>> tp; std::pair, T<4>> tp2; { std::tuple, T<3>> s = tuple_transform( F{}, tp ); BOOST_TEST_EQ( std::get<0>(s).value, 3 ); BOOST_TEST_EQ( std::get<1>(s).value, 4 ); } { std::tuple, T<3>> s = tuple_transform( F{}, std::move(tp) ); BOOST_TEST_EQ( std::get<0>(s).value, 3 ); BOOST_TEST_EQ( std::get<1>(s).value, 4 ); } { std::tuple, T<6>> s = tuple_transform( F{}, tp, tp2 ); BOOST_TEST_EQ( std::get<0>(s).value, 5 ); BOOST_TEST_EQ( std::get<1>(s).value, 7 ); } { std::tuple, T<6>> s = tuple_transform( F{}, std::move(tp), std::move(tp2) ); BOOST_TEST_EQ( std::get<0>(s).value, 5 ); BOOST_TEST_EQ( std::get<1>(s).value, 7 ); } } { std::pair, T<2>> const tp; std::pair, T<4>> const tp2; { std::tuple, T<3>> s = tuple_transform( F{}, tp ); BOOST_TEST_EQ( std::get<0>(s).value, 3 ); BOOST_TEST_EQ( std::get<1>(s).value, 4 ); } { std::tuple, T<3>> s = tuple_transform( F{}, std::move(tp) ); BOOST_TEST_EQ( std::get<0>(s).value, 3 ); BOOST_TEST_EQ( std::get<1>(s).value, 4 ); } { std::tuple, T<6>> s = tuple_transform( F{}, tp, tp2 ); BOOST_TEST_EQ( std::get<0>(s).value, 5 ); BOOST_TEST_EQ( std::get<1>(s).value, 7 ); } { std::tuple, T<6>> s = tuple_transform( F{}, std::move(tp), std::move(tp2) ); BOOST_TEST_EQ( std::get<0>(s).value, 5 ); BOOST_TEST_EQ( std::get<1>(s).value, 7 ); } } { std::tuple<> tp; { auto s = tuple_transform( F{}, tp ); BOOST_TEST_TRAIT_TRUE((std::is_same>)); } { auto s = tuple_transform( F{}, std::move(tp) ); BOOST_TEST_TRAIT_TRUE((std::is_same>)); } } return boost::report_errors(); }