diff --git a/include/boost/system/result.hpp b/include/boost/system/result.hpp index c492f37..75bec9f 100644 --- a/include/boost/system/result.hpp +++ b/include/boost/system/result.hpp @@ -62,35 +62,10 @@ public: { } - // explicit, value - template::value && - !std::is_convertible::value && - !std::is_constructible::value - >::type> - explicit constexpr result( A&& a ) - noexcept( std::is_nothrow_constructible::value ) - : v_( in_place_value, std::forward(a) ) - { - } - - // explicit, error - template::value && - !std::is_convertible::value && - !std::is_constructible::value - >::type> - explicit constexpr result( A&& a ) - noexcept( std::is_nothrow_constructible::value ) - : v_( in_place_error, std::forward(a) ) - { - } - // implicit, value - template::value && - !std::is_constructible::value - >::type> + !std::is_constructible::value, int>::type = 0> constexpr result( A&& a ) noexcept( std::is_nothrow_constructible::value ) : v_( in_place_value, std::forward(a) ) @@ -98,35 +73,32 @@ public: } // implicit, error - template::value && - !std::is_constructible::value - >::type> + !std::is_constructible::value, int>::type = 0> constexpr result( A&& a ) noexcept( std::is_nothrow_constructible::value ) : v_( in_place_error, std::forward(a) ) { } - // more than one arg, value + // explicit, value template::value && - !std::is_constructible::value && - sizeof...(A) >= 2 + !std::is_constructible::value >::type> - constexpr result( A&&... a ) + explicit constexpr result( A&&... a ) noexcept( std::is_nothrow_constructible::value ) : v_( in_place_value, std::forward(a)... ) { } - // more than one arg, error + // explicit, error template::value && - std::is_constructible::value && - sizeof...(A) >= 2 + std::is_constructible::value >::type> - constexpr result( A&&... a ) + explicit constexpr result( A&&... a ) noexcept( std::is_nothrow_constructible::value ) : v_( in_place_error, std::forward(a)... ) { diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 4798718..6f8e34c 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -126,3 +126,5 @@ boost_test(TYPE run SOURCES result_error_access.cpp) boost_test(TYPE run SOURCES result_swap.cpp) boost_test(TYPE run SOURCES result_eq.cpp) boost_test(TYPE run SOURCES result_range_for.cpp) +boost_test(TYPE run SOURCES result_value_construct2.cpp) +boost_test(TYPE run SOURCES result_error_construct2.cpp) diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index f48340b..77ec80d 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -150,3 +150,5 @@ run result_error_access.cpp : : : $(CPP11) ; run result_swap.cpp : : : $(CPP11) gcc-10:"-Wno-maybe-uninitialized" ; run result_eq.cpp : : : $(CPP11) ; run result_range_for.cpp : : : $(CPP11) ; +run result_value_construct2.cpp : : : $(CPP11) ; +run result_error_construct2.cpp : : : $(CPP11) ; diff --git a/test/result_error_construct2.cpp b/test/result_error_construct2.cpp new file mode 100644 index 0000000..cf1aeff --- /dev/null +++ b/test/result_error_construct2.cpp @@ -0,0 +1,57 @@ +// Copyright 2021 Peter Dimov. +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include + +using namespace boost::system; + +struct X +{ + int a, b; +}; + +result fx1() +{ + return {{ EINVAL, generic_category() }}; +} + +struct Y +{ + std::string v; +}; + +struct E +{ + int v; +}; + +result fy1() +{ + return {{ 42 }}; +} + +int main() +{ + { + result r = fx1(); + + BOOST_TEST( !r.has_value() ); + BOOST_TEST( r.has_error() ); + + BOOST_TEST_EQ( r.error(), std::error_code( EINVAL, generic_category() ) ); + } + + { + result r = fy1(); + + BOOST_TEST( !r.has_value() ); + BOOST_TEST( r.has_error() ); + + BOOST_TEST_EQ( r.error().v, 42 ); + } + + return boost::report_errors(); +} diff --git a/test/result_value_construct2.cpp b/test/result_value_construct2.cpp new file mode 100644 index 0000000..6296a4f --- /dev/null +++ b/test/result_value_construct2.cpp @@ -0,0 +1,152 @@ +// Copyright 2021 Peter Dimov. +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include + +using namespace boost::system; + +struct X +{ + int a; +}; + +struct Y +{ + int a, b; +}; + +struct E +{ + std::string v; +}; + +result fx0() +{ + return {}; +} + +result fx1() +{ + return {{ 1 }}; +} + +result fy0() +{ + return {}; +} + +result fy2() +{ + return {{ 1, 2 }}; +} + +result fxe0() +{ + return {}; +} + +result fxe1() +{ + return {{ 1 }}; +} + +result> fv0() +{ + return {}; +} + +result> fv1() +{ + return {{ 1 }}; +} + +result> fv2() +{ + return {{ 1, 2 }}; +} + +int main() +{ + { + result r = fx0(); + + BOOST_TEST( r.has_value() ); + + BOOST_TEST_EQ( r->a, 0 ); + } + + { + result r = fx1(); + + BOOST_TEST( r.has_value() ); + + BOOST_TEST_EQ( r->a, 1 ); + } + + { + result r = fy0(); + + BOOST_TEST( r.has_value() ); + + BOOST_TEST_EQ( r->a, 0 ); + BOOST_TEST_EQ( r->b, 0 ); + } + + { + result r = fy2(); + + BOOST_TEST( r.has_value() ); + + BOOST_TEST_EQ( r->a, 1 ); + BOOST_TEST_EQ( r->b, 2 ); + } + + { + result r = fxe0(); + + BOOST_TEST( r.has_value() ); + + BOOST_TEST_EQ( r->a, 0 ); + } + + { + result r = fxe1(); + + BOOST_TEST( r.has_value() ); + + BOOST_TEST_EQ( r->a, 1 ); + } + + { + result> r = fv0(); + + BOOST_TEST( r.has_value() ); + + BOOST_TEST_EQ( r->size(), 0 ); + } + + { + result> r = fv1(); + + BOOST_TEST( r.has_value() ); + + BOOST_TEST_EQ( r->size(), 1 ); + BOOST_TEST_EQ( r->at(0), 1 ); + } + + { + result> r = fv2(); + + BOOST_TEST( r.has_value() ); + + BOOST_TEST_EQ( r->size(), 2 ); + BOOST_TEST_EQ( r->at(0), 1 ); + BOOST_TEST_EQ( r->at(1), 2 ); + } + + return boost::report_errors(); +}