2
0
mirror of https://github.com/boostorg/leaf.git synced 2026-02-22 03:22:25 +00:00
This commit is contained in:
Emil Dotchevski
2026-02-18 15:25:29 -05:00
parent bd58aa238c
commit e8fe60e0cc
6 changed files with 115 additions and 8 deletions

View File

@@ -9,6 +9,7 @@
# include <boost/leaf/handle_errors.hpp>
#endif
#include "_test_res.hpp"
#include "lightweight_test.hpp"
#ifdef BOOST_LEAF_BOOST_AVAILABLE
# include <boost/config/workaround.hpp>
@@ -83,5 +84,19 @@ int main()
BOOST_TEST_EQ(r, 0);
}
#ifndef BOOST_LEAF_NO_CXX11_REF_QUALIFIERS
{
auto r = []() -> test_res<int, test_error>
{
int v = 0;
BOOST_LEAF_ASSIGN(v, ([]() -> test_res<int, test_error> { return test_error(42); }()));
return v;
}();
BOOST_TEST(!r);
BOOST_TEST(r.error().moved);
BOOST_TEST_EQ(r.error().value, 42);
}
#endif
return boost::report_errors();
}

View File

@@ -9,6 +9,7 @@
# include <boost/leaf/handle_errors.hpp>
#endif
#include "_test_res.hpp"
#include "lightweight_test.hpp"
#ifdef BOOST_LEAF_BOOST_AVAILABLE
# include <boost/config/workaround.hpp>
@@ -95,5 +96,18 @@ int main()
BOOST_TEST_EQ(r, 0);
}
#ifndef BOOST_LEAF_NO_CXX11_REF_QUALIFIERS
{
auto r = []() -> test_res<int, test_error>
{
BOOST_LEAF_AUTO(v, ([]() -> test_res<int, test_error> { return test_error(42); }()));
return v;
}();
BOOST_TEST(!r);
BOOST_TEST(r.error().moved);
BOOST_TEST_EQ(r.error().value, 42);
}
#endif
return boost::report_errors();
}

View File

@@ -15,6 +15,7 @@
# define BOOST_WORKAROUND(a,b) 0
#endif
#include "_test_res.hpp"
#include "lightweight_test.hpp"
namespace leaf = boost::leaf;
@@ -63,6 +64,24 @@ leaf::result<void> f3( bool success )
return { };
}
#ifndef BOOST_LEAF_NO_CXX11_REF_QUALIFIERS
test_res<int, test_error> f_te( bool succeed )
{
if( succeed )
return 42;
else
return test_error(42);
}
test_res<int, test_error> g_check_te()
{
BOOST_LEAF_CHECK(f_te(false));
return 21;
}
#endif
int main()
{
BOOST_TEST_EQ(f2(true).value().x, 42);
@@ -70,5 +89,14 @@ int main()
BOOST_TEST(f3(true));
BOOST_TEST(!f3(false));
#ifndef BOOST_LEAF_NO_CXX11_REF_QUALIFIERS
{
auto r = g_check_te();
BOOST_TEST(!r);
BOOST_TEST(r.error().moved);
BOOST_TEST_EQ(r.error().value, 42);
}
#endif
return boost::report_errors();
}

View File

@@ -6,6 +6,19 @@
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#include "_test_ec.hpp"
#include <utility>
struct test_error
{
int value;
bool moved;
test_error() noexcept: value(0), moved(false) {}
explicit test_error(int v) noexcept: value(v), moved(false) {}
test_error(test_error const & o) noexcept: value(o.value), moved(false) {}
test_error(test_error && o) noexcept: value(o.value), moved(true) {}
test_error & operator=(test_error const &) = default;
test_error & operator=(test_error &&) = default;
};
template <class T, class E>
class test_res
@@ -31,6 +44,12 @@ public:
which_(variant::error)
{
}
test_res( E && error ) noexcept:
value_(),
error_(std::move(error)),
which_(variant::error)
{
}
template <class Enum>
test_res( Enum e, typename std::enable_if<std::is_error_code_enum<Enum>::value, Enum>::type * = nullptr ):
value_(),
@@ -47,11 +66,24 @@ public:
BOOST_LEAF_ASSERT(which_ == variant::value);
return value_;
}
#ifndef BOOST_LEAF_NO_CXX11_REF_QUALIFIERS
E const & error() const &
{
BOOST_LEAF_ASSERT(which_ == variant::error);
return error_;
}
E && error() &&
{
BOOST_LEAF_ASSERT(which_ == variant::error);
return std::move(error_);
}
#else
E const & error() const
{
BOOST_LEAF_ASSERT(which_ == variant::error);
return error_;
}
#endif
};
template <class E>
@@ -75,6 +107,11 @@ public:
which_(variant::error)
{
}
test_res( E && error ) noexcept:
error_(std::move(error)),
which_(variant::error)
{
}
template <class Enum>
test_res( Enum e, typename std::enable_if<std::is_error_code_enum<Enum>::value, Enum>::type * = nullptr ):
error_(make_error_code(e)),
@@ -89,11 +126,24 @@ public:
{
BOOST_LEAF_ASSERT(which_ == variant::value);
}
#ifndef BOOST_LEAF_NO_CXX11_REF_QUALIFIERS
E const & error() const &
{
BOOST_LEAF_ASSERT(which_ == variant::error);
return error_;
}
E && error() &&
{
BOOST_LEAF_ASSERT(which_ == variant::error);
return std::move(error_);
}
#else
E const & error() const
{
BOOST_LEAF_ASSERT(which_ == variant::error);
return error_;
}
#endif
};
namespace boost { namespace leaf {