From c360ff1b1c066eb778799d9a0a92492eb9f7e51d Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Tue, 12 Sep 2023 04:48:45 +0300 Subject: [PATCH] Add a converting constructor to result --- include/boost/system/result.hpp | 17 ++++++++ test/result_convert_construct.cpp | 64 +++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/include/boost/system/result.hpp b/include/boost/system/result.hpp index 98fb55b..e6a4339 100644 --- a/include/boost/system/result.hpp +++ b/include/boost/system/result.hpp @@ -538,6 +538,23 @@ public: { } + // converting + template::value + >::type> + BOOST_CXX14_CONSTEXPR result( result const& r2 ) + noexcept( + std::is_nothrow_constructible::value && + std::is_nothrow_default_constructible::value && + std::is_nothrow_copy_constructible::value ) + : v_( in_place_error, r2.error() ) + { + if( r2 ) + { + this->emplace(); + } + } + // queries constexpr bool has_value() const noexcept diff --git a/test/result_convert_construct.cpp b/test/result_convert_construct.cpp index 47c9c78..39bbcb6 100644 --- a/test/result_convert_construct.cpp +++ b/test/result_convert_construct.cpp @@ -183,6 +183,67 @@ int main() // + { + result r; + result r2 = r; + + BOOST_TEST( r2 ); + BOOST_TEST_EQ( X::instances, 0 ); + } + + BOOST_TEST_EQ( X::instances, 0 ); + + { + result const r; + result r2 = r; + + BOOST_TEST( r2 ); + BOOST_TEST_EQ( X::instances, 0 ); + } + + BOOST_TEST_EQ( X::instances, 0 ); + + { + result r2 = result(); + + BOOST_TEST( r2 ); + BOOST_TEST_EQ( X::instances, 0 ); + } + + BOOST_TEST_EQ( X::instances, 0 ); + + { + result r( 5 ); + result r2 = r; + + BOOST_TEST( !r2 ); + BOOST_TEST_EQ( r2.error(), X(5) ); + BOOST_TEST_EQ( X::instances, 1 ); + } + + BOOST_TEST_EQ( X::instances, 0 ); + + { + result const r( 6 ); + result r2 = r; + + BOOST_TEST( !r2 ); + BOOST_TEST_EQ( r2.error(), X(6) ); + BOOST_TEST_EQ( X::instances, 1 ); + } + + { + result r2 = result( 7 ); + + BOOST_TEST( !r2 ); + BOOST_TEST_EQ( r2.error(), X(7) ); + BOOST_TEST_EQ( X::instances, 1 ); + } + + BOOST_TEST_EQ( X::instances, 0 ); + + // + { int x = 5; @@ -225,6 +286,9 @@ int main() BOOST_TEST_TRAIT_FALSE((std::is_constructible, result>)); BOOST_TEST_TRAIT_FALSE((std::is_convertible, result>)); + BOOST_TEST_TRAIT_FALSE((std::is_constructible, result>)); + BOOST_TEST_TRAIT_FALSE((std::is_convertible, result>)); + BOOST_TEST_TRAIT_TRUE((std::is_constructible, result>)); BOOST_TEST_TRAIT_TRUE((std::is_convertible, result>));