// Copyright 2017, 2021, 2022 Peter Dimov. // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #include #include using namespace boost::system; struct X { int v_; }; struct Y { int v_; explicit Y( int v ): v_( v ) {} Y( X x ): v_( x.v_) {} Y( Y const& ) = delete; Y& operator=( Y const& ) = delete; Y( Y&& r ): v_( r.v_ ) { r.v_ = 0; } Y& operator=( Y&& ) = delete; }; struct E { }; struct E2 { E2() {} E2( E ) {} }; result fi( int x ) { return 2 * x + 1; } result fi2( int ) { return E2(); } result fi3( int ) { return {}; } result fy( Y y ) { return X{ 2 * y.v_ + 1 }; } result fy2( Y ) { return E2(); } result fy3( Y ) { return {}; } result fri( int& x ) { return x * 2 + 1; } result fri2( int& ) { return E2(); } result fri3( int& ) { return {}; } result fk() { return 7; } result fk2() { return E2(); } result fk3() { return {}; } result fk4() { return E2(); } int main() { { result r( 1 ); { result r2 = r & fi; BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 3 ); } { result r2 = r & fi2; BOOST_TEST( r2.has_error() ); } { result r2 = r & fi3; BOOST_TEST( r2.has_value() ); } } { result const r( 1 ); { result r2 = r & fi; BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 3 ); } { result r2 = r & fi2; BOOST_TEST( r2.has_error() ); } { result r2 = r & fi3; BOOST_TEST( r2.has_value() ); } } { result r2 = result( 1 ) & fi; BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 3 ); } { result r2 = result( 1 ) & fi2; BOOST_TEST( r2.has_error() ); } { result r2 = result( 1 ) & fi3; BOOST_TEST( r2.has_value() ); } { result r( in_place_error ); { result r2 = r & fi; BOOST_TEST( r2.has_error() ); } { result r2 = r & fi2; BOOST_TEST( r2.has_error() ); } { result r2 = r & fi3; BOOST_TEST( r2.has_error() ); } } { result const r( in_place_error ); { result r2 = r & fi; BOOST_TEST( r2.has_error() ); } { result r2 = r & fi2; BOOST_TEST( r2.has_error() ); } { result r2 = r & fi3; BOOST_TEST( r2.has_error() ); } } { result r2 = result( in_place_error ) & fi; BOOST_TEST( r2.has_error() ); } { result r2 = result( in_place_error ) & fi2; BOOST_TEST( r2.has_error() ); } { result r2 = result( in_place_error ) & fi3; BOOST_TEST( r2.has_error() ); } { result r2 = result( in_place_value, 1 ) & fy; BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( r2->v_, 3 ); } { result r2 = result( in_place_value, 1 ) & fy2; BOOST_TEST( r2.has_error() ); } { result r2 = result( in_place_value, 1 ) & fy3; BOOST_TEST( r2.has_value() ); } { result r2 = result( in_place_error ) & fy; BOOST_TEST( r2.has_error() ); } { result r2 = result( in_place_error ) & fy2; BOOST_TEST( r2.has_error() ); } { result r2 = result( in_place_error ) & fy3; BOOST_TEST( r2.has_error() ); } { int x1 = 1; result r( x1 ); { result r2 = r & fri; BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 3 ); } { result r2 = r & fri2; BOOST_TEST( r2.has_error() ); } { result r2 = r & fri3; BOOST_TEST( r2.has_value() ); } } { int x1 = 1; result const r( x1 ); { result r2 = r & fri; BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 3 ); } { result r2 = r & fri2; BOOST_TEST( r2.has_error() ); } { result r2 = r & fri3; BOOST_TEST( r2.has_value() ); } } { int x1 = 1; result r2 = result( x1 ) & fri; BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 3 ); } { int x1 = 1; result r2 = result( x1 ) & fri2; BOOST_TEST( r2.has_error() ); } { int x1 = 1; result r2 = result( x1 ) & fri3; BOOST_TEST( r2.has_value() ); } { result r( in_place_error ); { result r2 = r & fri; BOOST_TEST( r2.has_error() ); } { result r2 = r & fri2; BOOST_TEST( r2.has_error() ); } { result r2 = r & fri3; BOOST_TEST( r2.has_error() ); } } { result const r( in_place_error ); { result r2 = r & fri; BOOST_TEST( r2.has_error() ); } { result r2 = r & fri2; BOOST_TEST( r2.has_error() ); } { result r2 = r & fri3; BOOST_TEST( r2.has_error() ); } } { result r2 = result( in_place_error ) & fri; BOOST_TEST( r2.has_error() ); } { result r2 = result( in_place_error ) & fri2; BOOST_TEST( r2.has_error() ); } { result r2 = result( in_place_error ) & fri3; BOOST_TEST( r2.has_error() ); } { result r; { result r2 = r & fk; BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 7 ); } { result r2 = r & fk2; BOOST_TEST( r2.has_error() ); } { result r2 = r & fk3; BOOST_TEST( r2.has_value() ); } { result r2 = r & fk4; BOOST_TEST( r2.has_error() ); } } { result const r; { result r2 = r & fk; BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 7 ); } { result r2 = r & fk2; BOOST_TEST( r2.has_error() ); } { result r2 = r & fk3; BOOST_TEST( r2.has_value() ); } { result r2 = r & fk4; BOOST_TEST( r2.has_error() ); } } { result r2 = result() & fk; BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 7 ); } { result r2 = result() & fk2; BOOST_TEST( r2.has_error() ); } { result r2 = result() & fk3; BOOST_TEST( r2.has_value() ); } { result r2 = result() & fk4; BOOST_TEST( r2.has_error() ); } { result r( in_place_error ); { result r2 = r & fk; BOOST_TEST( r2.has_error() ); } { result r2 = r & fk2; BOOST_TEST( r2.has_error() ); } { result r2 = r & fk3; BOOST_TEST( r2.has_error() ); } { result r2 = r & fk4; BOOST_TEST( r2.has_error() ); } } { result const r( in_place_error ); { result r2 = r & fk; BOOST_TEST( r2.has_error() ); } { result r2 = r & fk2; BOOST_TEST( r2.has_error() ); } { result r2 = r & fk3; BOOST_TEST( r2.has_error() ); } { result r2 = r & fk4; BOOST_TEST( r2.has_error() ); } } { result r2 = result( in_place_error ) & fk; BOOST_TEST( r2.has_error() ); } { result r2 = result( in_place_error ) & fk2; BOOST_TEST( r2.has_error() ); } { result r2 = result( in_place_error ) & fk3; BOOST_TEST( r2.has_error() ); } { result r2 = result( in_place_error ) & fk4; BOOST_TEST( r2.has_error() ); } return boost::report_errors(); }