diff --git a/include/boost/system/result.hpp b/include/boost/system/result.hpp index 86fd638..0d5a866 100644 --- a/include/boost/system/result.hpp +++ b/include/boost/system/result.hpp @@ -1067,6 +1067,23 @@ U operator|( result&& r, F&& f ) } } +// operator|= + +// result |= value + +template::value>::type +> +result& operator|=( result& r, U&& u ) +{ + if( !r ) + { + r = std::forward( u ); + } + + return r; +} + // operator& // result & unary-returning-value diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index ecac1a4..0bb84a4 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -174,3 +174,4 @@ boost_test(TYPE run SOURCES result_and_fn1r.cpp) boost_test(TYPE run SOURCES result_and_eq_fn1v.cpp) boost_test(TYPE run SOURCES result_and_eq_fn1r.cpp) boost_test(TYPE run SOURCES result_in_place_use.cpp) +boost_test(TYPE run SOURCES result_or_eq_value.cpp) diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index ea7c78e..f757779 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -204,3 +204,4 @@ run result_and_fn1r.cpp ; run result_and_eq_fn1v.cpp ; run result_and_eq_fn1r.cpp ; run result_in_place_use.cpp ; +run result_or_eq_value.cpp ; diff --git a/test/result_or_eq_value.cpp b/test/result_or_eq_value.cpp new file mode 100644 index 0000000..ac2c751 --- /dev/null +++ b/test/result_or_eq_value.cpp @@ -0,0 +1,102 @@ +// Copyright 2017, 2021-2024 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&& r ) + { + if( &r != this ) + { + v_ = r.v_; + r.v_ = 0; + } + + return *this; + } +}; + +struct E +{ +}; + +int main() +{ + { + result r( 1 ); + + r |= 2; + + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( *r, 1 ); + } + + { + result r( in_place_error ); + + r |= 2; + + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( *r, 2 ); + } + + { + result r( in_place_value, 1 ); + + r |= X{2}; + + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r->v_, 1 ); + } + + { + result r( in_place_error ); + + r |= X{2}; + + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( r->v_, 2 ); + } + + { + int x1 = 1; + int x2 = 2; + + result r( x1 ); + + r |= x2; + + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( &*r, &x1 ); + } + + { + int x2 = 2; + + result r( in_place_error ); + + r |= x2; + + BOOST_TEST( r.has_value() ) && BOOST_TEST_EQ( &*r, &x2 ); + } + + return boost::report_errors(); +}