From 96fef94580cb809cd8b91ac40fa140cf576a890b Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Mon, 8 Apr 2024 18:01:41 +0300 Subject: [PATCH] Support result & fv, where fv returns void. Refs #119. --- include/boost/system/result.hpp | 20 ++++++++++++++- test/result_and_fn1v.cpp | 44 +++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/include/boost/system/result.hpp b/include/boost/system/result.hpp index d0c8d4e..5cd6802 100644 --- a/include/boost/system/result.hpp +++ b/include/boost/system/result.hpp @@ -1192,7 +1192,8 @@ result operator&( result&& r, F&& f ) template()() ), - 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 ) { @@ -1206,6 +1207,23 @@ result operator&( result const& r, F&& f ) } } +template()() ), + 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 )(); + return {}; + } +} + // result & unary-returning-result template r; + result r2 = r & fv2; + + BOOST_TEST( r2.has_value() ); + } + + { + result const r; + result r2 = r & fv2; + + BOOST_TEST( r2.has_value() ); + } + + { + result r2 = result() & fv2; + + BOOST_TEST( r2.has_value() ); + } + + { + result r( in_place_error ); + result r2 = r & fv2; + + BOOST_TEST( r2.has_error() ); + } + + { + result const r( in_place_error ); + result r2 = r & fv2; + + BOOST_TEST( r2.has_error() ); + } + + { + result r2 = result( in_place_error ) & fv2; + + BOOST_TEST( r2.has_error() ); + } + return boost::report_errors(); }