// Copyright 2026 Peter Dimov // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #include #include #include #include using namespace boost::system; int f( int x, int y ) { return x + y; } struct X { int x_ = 0; explicit X( int x ): x_( x ) { } int f( int y ) const { return x_ + y; } int g( std::unique_ptr p ) const { return x_ + p->x_; } }; template std::unique_ptr make_unique( A&&... a ) { return std::unique_ptr( new T( std::forward(a)... ) ); } int main() { { result a1( 1 ); auto r = unwrap_and_invoke( f, a1, 2 ); BOOST_TEST( r ) && BOOST_TEST_EQ( *r, 3 ); } { result const a1( 1 ); auto r = unwrap_and_invoke( f, a1, 2 ); BOOST_TEST( r ) && BOOST_TEST_EQ( *r, 3 ); } { result a1( 1 ); auto r = unwrap_and_invoke( f, a1, 2 ); BOOST_TEST( r ) && BOOST_TEST_EQ( *r, 3 ); } { auto r = unwrap_and_invoke( f, result( 1 ), 2 ); BOOST_TEST( r ) && BOOST_TEST_EQ( *r, 3 ); } // { result a2( 2 ); auto r = unwrap_and_invoke( f, 1, a2 ); BOOST_TEST( r ) && BOOST_TEST_EQ( *r, 3 ); } { result const a2( 2 ); auto r = unwrap_and_invoke( f, 1, a2 ); BOOST_TEST( r ) && BOOST_TEST_EQ( *r, 3 ); } { result a2( 2 ); auto r = unwrap_and_invoke( f, 1, a2 ); BOOST_TEST( r ) && BOOST_TEST_EQ( *r, 3 ); } { auto r = unwrap_and_invoke( f, 1, result( 2 ) ); BOOST_TEST( r ) && BOOST_TEST_EQ( *r, 3 ); } // { result a1( 1 ); result const a2( 2 ); auto r = unwrap_and_invoke( f, a1, a2 ); BOOST_TEST( r ) && BOOST_TEST_EQ( *r, 3 ); } { result a1( 1 ); auto r = unwrap_and_invoke( f, a1, result( 2 ) ); BOOST_TEST( r ) && BOOST_TEST_EQ( *r, 3 ); } // { auto ec = make_error_code( errc::invalid_argument ); result a1( ec ); auto r = unwrap_and_invoke( f, a1, 2 ); BOOST_TEST( r.has_error() ) && BOOST_TEST_EQ( r.error(), ec ); } { auto ec = make_error_code( errc::invalid_argument ); result const a1( ec ); auto r = unwrap_and_invoke( f, a1, 2 ); BOOST_TEST( r.has_error() ) && BOOST_TEST_EQ( r.error(), ec ); } { auto ec = make_error_code( errc::invalid_argument ); result a1( ec ); auto r = unwrap_and_invoke( f, a1, 2 ); BOOST_TEST( r.has_error() ) && BOOST_TEST_EQ( r.error(), ec ); } { auto ec = make_error_code( errc::invalid_argument ); auto r = unwrap_and_invoke( f, result( ec ), 2 ); BOOST_TEST( r.has_error() ) && BOOST_TEST_EQ( r.error(), ec ); } // { auto ec = make_error_code( errc::invalid_argument ); result a2( ec ); auto r = unwrap_and_invoke( f, 1, a2 ); BOOST_TEST( r.has_error() ) && BOOST_TEST_EQ( r.error(), ec ); } { auto ec = make_error_code( errc::invalid_argument ); result const a2( ec ); auto r = unwrap_and_invoke( f, 1, a2 ); BOOST_TEST( r.has_error() ) && BOOST_TEST_EQ( r.error(), ec ); } { auto ec = make_error_code( errc::invalid_argument ); result a2( ec ); auto r = unwrap_and_invoke( f, 1, a2 ); BOOST_TEST( r.has_error() ) && BOOST_TEST_EQ( r.error(), ec ); } { auto ec = make_error_code( errc::invalid_argument ); auto r = unwrap_and_invoke( f, 1, result( ec ) ); BOOST_TEST( r.has_error() ) && BOOST_TEST_EQ( r.error(), ec ); } // { auto ec = make_error_code( errc::invalid_argument ); result a1( ec ); result const a2( 2 ); auto r = unwrap_and_invoke( f, a1, a2 ); BOOST_TEST( r.has_error() ) && BOOST_TEST_EQ( r.error(), ec ); } { auto ec = make_error_code( errc::invalid_argument ); result a1( 1 ); result const a2( ec ); auto r = unwrap_and_invoke( f, a1, a2 ); BOOST_TEST( r.has_error() ) && BOOST_TEST_EQ( r.error(), ec ); } { auto ec = make_error_code( errc::invalid_argument ); result a1( ec ); auto r = unwrap_and_invoke( f, a1, result( 2 ) ); BOOST_TEST( r.has_error() ) && BOOST_TEST_EQ( r.error(), ec ); } { auto ec = make_error_code( errc::invalid_argument ); result a1( 1 ); auto r = unwrap_and_invoke( f, a1, result( ec ) ); BOOST_TEST( r.has_error() ) && BOOST_TEST_EQ( r.error(), ec ); } // { result a1( X( 1 ) ); result const a2( 2 ); auto r = unwrap_and_invoke( &X::f, a1, a2 ); BOOST_TEST( r ) && BOOST_TEST_EQ( *r, 3 ); } { result a1( X( 1 ) ); auto r = unwrap_and_invoke( &X::f, a1, result( 2 ) ); BOOST_TEST( r ) && BOOST_TEST_EQ( *r, 3 ); } // { result< std::unique_ptr > a1( ::make_unique( 1 ) ); result< std::unique_ptr > a2( ::make_unique( 2 ) ); auto r = unwrap_and_invoke( &X::g, std::move( a1 ), std::move( a2 ) ); BOOST_TEST( r ) && BOOST_TEST_EQ( *r, 3 ); } return boost::report_errors(); }