/*============================================================================= Copyright (c) 2017 Paul Fultz II tuple_for_each.cpp 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 "test.hpp" struct tuple_for_each_f { template constexpr auto operator()(Sequence&& s, F && f) const BOOST_HOF_RETURNS ( boost::hof::unpack(boost::hof::proj(boost::hof::forward(f)))(boost::hof::forward(s)), boost::hof::forward(f) ); }; BOOST_HOF_STATIC_FUNCTION(tuple_for_each) = tuple_for_each_f{}; BOOST_HOF_TEST_CASE() { std::tuple tp{ 1, 2, 3 }; { int s = 0; tuple_for_each( tp, [&]( int x ){ s = s * 10 + x; } ); BOOST_HOF_TEST_CHECK( s == 123 ); } { int s = 0; tuple_for_each( std::move(tp), [&]( int x ){ s = s * 10 + x; } ); BOOST_HOF_TEST_CHECK( s == 123 ); } } BOOST_HOF_TEST_CASE() { std::tuple const tp{ 1, 2, 3 }; { int s = 0; tuple_for_each( tp, [&]( int x ){ s = s * 10 + x; } ); BOOST_HOF_TEST_CHECK( s == 123 ); } { int s = 0; tuple_for_each( std::move(tp), [&]( int x ){ s = s * 10 + x; } ); BOOST_HOF_TEST_CHECK( s == 123 ); } } // #if defined( __clang_major__ ) && __clang_major__ == 3 && __clang_minor__ < 8 // #else BOOST_HOF_TEST_CASE() { std::tuple, std::unique_ptr, std::unique_ptr> tp{ std::unique_ptr(new int(1)), std::unique_ptr(new int(2)), std::unique_ptr(new int(3)) }; int s = 0; tuple_for_each( std::move(tp), [&]( std::unique_ptr p ){ s = s * 10 + *p; } ); BOOST_HOF_TEST_CHECK( s == 123 ); } BOOST_HOF_TEST_CASE() { auto tp = boost::hof::pack(1, 2, 3); { int s = 0; tuple_for_each( tp, [&]( int x ){ s = s * 10 + x; } ); BOOST_HOF_TEST_CHECK( s == 123 ); } { int s = 0; tuple_for_each( std::move(tp), [&]( int x ){ s = s * 10 + x; } ); BOOST_HOF_TEST_CHECK( s == 123 ); } } BOOST_HOF_TEST_CASE() { const auto tp = boost::hof::pack(1, 2, 3); { int s = 0; tuple_for_each( tp, [&]( int x ){ s = s * 10 + x; } ); BOOST_HOF_TEST_CHECK( s == 123 ); } { int s = 0; tuple_for_each( std::move(tp), [&]( int x ){ s = s * 10 + x; } ); BOOST_HOF_TEST_CHECK( s == 123 ); } } // #endif BOOST_HOF_TEST_CASE() { std::pair tp{ 1, 2 }; { int s = 0; tuple_for_each( tp, [&]( int x ){ s = s * 10 + x; } ); BOOST_HOF_TEST_CHECK( s == 12 ); } { int s = 0; tuple_for_each( std::move(tp), [&]( int x ){ s = s * 10 + x; } ); BOOST_HOF_TEST_CHECK( s == 12 ); } } BOOST_HOF_TEST_CASE() { std::pair const tp{ 1, 2 }; { int s = 0; tuple_for_each( tp, [&]( int x ){ s = s * 10 + x; } ); BOOST_HOF_TEST_CHECK( s == 12 ); } { int s = 0; tuple_for_each( std::move(tp), [&]( int x ){ s = s * 10 + x; } ); BOOST_HOF_TEST_CHECK( s == 12 ); } } BOOST_HOF_TEST_CASE() { std::array tp{{ 1, 2, 3 }}; { int s = 0; tuple_for_each( tp, [&]( int x ){ s = s * 10 + x; } ); BOOST_HOF_TEST_CHECK( s == 123 ); } { int s = 0; tuple_for_each( std::move(tp), [&]( int x ){ s = s * 10 + x; } ); BOOST_HOF_TEST_CHECK( s == 123 ); } } BOOST_HOF_TEST_CASE() { std::array const tp{{ 1, 2, 3 }}; { int s = 0; tuple_for_each( tp, [&]( int x ){ s = s * 10 + x; } ); BOOST_HOF_TEST_CHECK( s == 123 ); } { int s = 0; tuple_for_each( std::move(tp), [&]( int x ){ s = s * 10 + x; } ); BOOST_HOF_TEST_CHECK( s == 123 ); } } BOOST_HOF_TEST_CASE() { std::tuple<> tp; BOOST_HOF_TEST_CHECK( tuple_for_each( tp, 11 ) == 11 ); BOOST_HOF_TEST_CHECK( tuple_for_each( std::move( tp ), 12 ) == 12 ); } BOOST_HOF_TEST_CASE() { BOOST_HOF_TEST_CHECK( tuple_for_each( boost::hof::pack(), 11 ) == 11 ); BOOST_HOF_STATIC_TEST_CHECK( tuple_for_each( boost::hof::pack(), 11 ) == 11 ); } BOOST_HOF_TEST_CASE() { std::array tp; BOOST_HOF_TEST_CHECK( tuple_for_each( tp, 11 ) == 11 ); BOOST_HOF_TEST_CHECK( tuple_for_each( std::move( tp ), 12 ) == 12 ); } struct assert_is_integral { template constexpr bool operator()( T ) const { BOOST_HOF_STATIC_TEST_CHECK( std::is_integral::value ); return true; } }; BOOST_HOF_TEST_CASE() { #if !BOOST_HOF_HAS_CONSTEXPR_TUPLE auto r = tuple_for_each( std::tuple{1, 2, 3}, assert_is_integral() ); #else constexpr auto r = tuple_for_each( std::tuple{1, 2, 3}, assert_is_integral() ); #endif (void)r; } BOOST_HOF_TEST_CASE() { #if !BOOST_HOF_HAS_CONSTEXPR_TUPLE auto r = tuple_for_each( boost::hof::pack(1, 2, 3), assert_is_integral() ); #else constexpr auto r = tuple_for_each( boost::hof::pack(1, 2, 3), assert_is_integral() ); #endif (void)r; }