mirror of
https://github.com/boostorg/leaf.git
synced 2026-02-22 03:22:25 +00:00
Issue 89
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user