Enable result<void> & fr. Refs #117.

This commit is contained in:
Peter Dimov
2024-01-31 05:36:52 +02:00
parent 5c1d0df893
commit 293174a1d3
2 changed files with 138 additions and 0 deletions

View File

@ -1155,6 +1155,23 @@ U operator&( result<T, E>&& r, F&& f )
}
}
template<class E, class F,
class U = decltype( std::declval<F>()() ),
class En1 = typename std::enable_if<detail::is_result<U>::value>::type,
class En2 = typename std::enable_if<std::is_convertible<E, typename U::error_type>::value>::type
>
U operator&( result<void, E> const& r, F&& f )
{
if( r.has_error() )
{
return r.error();
}
else
{
return std::forward<F>( f )();
}
}
// operator&=
// result &= unary-returning-value

View File

@ -85,6 +85,21 @@ result<void, E2> fri3( int& )
return {};
}
result<int, E2> fk()
{
return 7;
}
result<int, E2> fk2()
{
return E2();
}
result<void, E2> fk3()
{
return {};
}
int main()
{
{
@ -343,5 +358,111 @@ int main()
BOOST_TEST( r2.has_error() );
}
{
result<void, E> r;
{
result<int, E2> r2 = r & fk;
BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 7 );
}
{
result<int, E2> r2 = r & fk2;
BOOST_TEST( r2.has_error() );
}
{
result<void, E2> r2 = r & fk3;
BOOST_TEST( r2.has_value() );
}
}
{
result<void, E> const r;
{
result<int, E2> r2 = r & fk;
BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 7 );
}
{
result<int, E2> r2 = r & fk2;
BOOST_TEST( r2.has_error() );
}
{
result<void, E2> r2 = r & fk3;
BOOST_TEST( r2.has_value() );
}
}
{
result<int, E2> r2 = result<void, E>() & fk;
BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 7 );
}
{
result<int, E2> r2 = result<void, E>() & fk2;
BOOST_TEST( r2.has_error() );
}
{
result<void, E2> r2 = result<void, E>() & fk3;
BOOST_TEST( r2.has_value() );
}
{
result<void, E> r( in_place_error );
{
result<int, E2> r2 = r & fk;
BOOST_TEST( r2.has_error() );
}
{
result<int, E2> r2 = r & fk2;
BOOST_TEST( r2.has_error() );
}
{
result<void, E2> r2 = r & fk3;
BOOST_TEST( r2.has_error() );
}
}
{
result<void, E> const r( in_place_error );
{
result<int, E2> r2 = r & fk;
BOOST_TEST( r2.has_error() );
}
{
result<int, E2> r2 = r & fk2;
BOOST_TEST( r2.has_error() );
}
{
result<void, E2> r2 = r & fk3;
BOOST_TEST( r2.has_error() );
}
}
{
result<int, E2> r2 = result<void, E>( in_place_error ) & fk;
BOOST_TEST( r2.has_error() );
}
{
result<int, E2> r2 = result<void, E>( in_place_error ) & fk2;
BOOST_TEST( r2.has_error() );
}
{
result<void, E2> r2 = result<void, E>( in_place_error ) & fk3;
BOOST_TEST( r2.has_error() );
}
return boost::report_errors();
}