From fa1de1103fe5d97ddddc9e45286e32751151f859 Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Tue, 9 Dec 2025 08:40:31 +0100 Subject: [PATCH] util: Add Unexpected::error() This is not needed, but a bit closer to the std lib. --- src/test/util_expected_tests.cpp | 18 ++++++++++++++++++ src/util/expected.h | 12 +++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/test/util_expected_tests.cpp b/src/test/util_expected_tests.cpp index 67a1a5fb52..f02ea3fdd7 100644 --- a/src/test/util_expected_tests.cpp +++ b/src/test/util_expected_tests.cpp @@ -7,6 +7,11 @@ #include +#include +#include +#include + + using namespace util; BOOST_AUTO_TEST_SUITE(util_expected_tests) @@ -65,4 +70,17 @@ BOOST_AUTO_TEST_CASE(expected_error) BOOST_CHECK_EQUAL(read.error(), "fail1"); } +BOOST_AUTO_TEST_CASE(unexpected_error_accessors) +{ + Unexpected u{std::make_unique(-1)}; + BOOST_CHECK_EQUAL(*u.error(), -1); + + *u.error() -= 1; + const auto& read{u}; + BOOST_CHECK_EQUAL(*read.error(), -2); + + const auto moved{std::move(u).error()}; + BOOST_CHECK_EQUAL(*moved, -2); +} + BOOST_AUTO_TEST_SUITE_END() diff --git a/src/util/expected.h b/src/util/expected.h index 0e7256f867..71cd0f941c 100644 --- a/src/util/expected.h +++ b/src/util/expected.h @@ -20,8 +20,14 @@ template class Unexpected { public: - constexpr explicit Unexpected(E e) : err(std::move(e)) {} - E err; + constexpr explicit Unexpected(E e) : m_error(std::move(e)) {} + + constexpr const E& error() const& noexcept LIFETIMEBOUND { return m_error; } + constexpr E& error() & noexcept LIFETIMEBOUND { return m_error; } + constexpr E&& error() && noexcept LIFETIMEBOUND { return std::move(m_error); } + +private: + E m_error; }; /// The util::Expected class provides a standard way for low-level functions to @@ -40,7 +46,7 @@ public: constexpr Expected() : m_data{std::in_place_index_t<0>{}, ValueType{}} {} constexpr Expected(ValueType v) : m_data{std::in_place_index_t<0>{}, std::move(v)} {} template - constexpr Expected(Unexpected u) : m_data{std::in_place_index_t<1>{}, std::move(u.err)} + constexpr Expected(Unexpected u) : m_data{std::in_place_index_t<1>{}, std::move(u).error()} { }