From 75ab18c9fd9ee37a0f616dadf257b8f5dd19f30d Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Mon, 8 Apr 2024 17:55:50 +0300 Subject: [PATCH] Support result & fv, where fv returns void. Refs #119. --- include/boost/system/result.hpp | 40 ++++++++++++++++++++++++++++-- test/result_and_fn1v.cpp | 44 +++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 2 deletions(-) diff --git a/include/boost/system/result.hpp b/include/boost/system/result.hpp index f6a41c4..d0c8d4e 100644 --- a/include/boost/system/result.hpp +++ b/include/boost/system/result.hpp @@ -1124,7 +1124,8 @@ result& operator|=( result& r, F&& f ) template()( std::declval() ) ), - class En = typename std::enable_if::value>::type + class En1 = typename std::enable_if::value>::type, + class En2 = typename std::enable_if::value>::type > result operator&( result const& r, F&& f ) { @@ -1140,7 +1141,8 @@ result operator&( result const& r, F&& f ) template()( std::declval() ) ), - class En = typename std::enable_if::value>::type + class En1 = typename std::enable_if::value>::type, + class En2 = typename std::enable_if::value>::type > result operator&( result&& r, F&& f ) { @@ -1154,6 +1156,40 @@ result operator&( result&& r, F&& f ) } } +template()( std::declval() ) ), + class En = typename std::enable_if::value>::type +> +result operator&( result const& r, F&& f ) +{ + if( r.has_error() ) + { + return r.error(); + } + else + { + std::forward( f )( *r ); + return {}; + } +} + +template()( std::declval() ) ), + class En = typename std::enable_if::value>::type +> +result operator&( result&& r, F&& f ) +{ + if( r.has_error() ) + { + return r.error(); + } + else + { + std::forward( f )( *std::move( r ) ); + return {}; + } +} + template()() ), class En = typename std::enable_if::value>::type diff --git a/test/result_and_fn1v.cpp b/test/result_and_fn1v.cpp index 929bef5..6fb27d0 100644 --- a/test/result_and_fn1v.cpp +++ b/test/result_and_fn1v.cpp @@ -55,6 +55,10 @@ int k() return 7; } +void fv1( int /*x*/ ) +{ +} + int main() { { @@ -199,5 +203,45 @@ int main() BOOST_TEST( r2.has_error() ); } + { + result r( 1 ); + result r2 = r & fv1; + + BOOST_TEST( r2.has_value() ); + } + + { + result const r( 1 ); + result r2 = r & fv1; + + BOOST_TEST( r2.has_value() ); + } + + { + result r2 = result( 1 ) & fv1; + + BOOST_TEST( r2.has_value() ); + } + + { + result r( in_place_error ); + result r2 = r & fv1; + + BOOST_TEST( r2.has_error() ); + } + + { + result const r( in_place_error ); + result r2 = r & fv1; + + BOOST_TEST( r2.has_error() ); + } + + { + result r2 = result( in_place_error ) & fv1; + + BOOST_TEST( r2.has_error() ); + } + return boost::report_errors(); }