From 0e7f5a097eae75fde9b7b63fb11e462540923cd2 Mon Sep 17 00:00:00 2001 From: Emil Dotchevski Date: Sun, 18 Aug 2024 20:23:43 -0700 Subject: [PATCH] Fix for Issue 75 + unit test --- include/boost/leaf/detail/optional.hpp | 8 ++++++++ include/boost/leaf/error.hpp | 1 + include/boost/leaf/handle_errors.hpp | 10 +++++----- test/try_capture_all_test.cpp | 19 +++++++++++++++++++ 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/include/boost/leaf/detail/optional.hpp b/include/boost/leaf/detail/optional.hpp index 8982323e..041d6421 100644 --- a/include/boost/leaf/detail/optional.hpp +++ b/include/boost/leaf/detail/optional.hpp @@ -185,6 +185,14 @@ namespace leaf_detail reset(); return tmp; } + + BOOST_LEAF_CONSTEXPR T & value_or_default(int key) noexcept + { + if( T * v = has_value(key) ) + return *v; + else + return load(key); + } }; } diff --git a/include/boost/leaf/error.hpp b/include/boost/leaf/error.hpp index bbbd824c..3b976736 100644 --- a/include/boost/leaf/error.hpp +++ b/include/boost/leaf/error.hpp @@ -150,6 +150,7 @@ namespace leaf_detail using impl::load; using impl::has_value; using impl::value; + using impl::value_or_default; }; } diff --git a/include/boost/leaf/handle_errors.hpp b/include/boost/leaf/handle_errors.hpp index fbf88483..96eb1787 100644 --- a/include/boost/leaf/handle_errors.hpp +++ b/include/boost/leaf/handle_errors.hpp @@ -977,7 +977,7 @@ namespace leaf_detail { sl.deactivate(); int const err_id = error_id(r.error()).value(); - return leaf_result(sl.value(err_id).template extract_capture_list(err_id)); + return leaf_result(sl.value_or_default(err_id).template extract_capture_list(err_id)); } } #ifndef BOOST_LEAF_NO_EXCEPTIONS @@ -985,13 +985,13 @@ namespace leaf_detail { sl.deactivate(); int const err_id = error_info(&ex).error().value(); - return sl.value(err_id).template extract_capture_list(err_id); + return sl.value_or_default(err_id).template extract_capture_list(err_id); } catch(...) { sl.deactivate(); int const err_id = error_info(nullptr).error().value(); - return sl.value(err_id).template extract_capture_list(err_id); + return sl.value_or_default(err_id).template extract_capture_list(err_id); } #endif } @@ -1037,13 +1037,13 @@ namespace leaf_detail { sl.deactivate(); int const err_id = error_info(&ex).error().value(); - return sl.value(err_id).template extract_capture_list(err_id); + return sl.value_or_default(err_id).template extract_capture_list(err_id); } catch(...) { sl.deactivate(); int const err_id = error_info(nullptr).error().value(); - return sl.value(err_id).template extract_capture_list(err_id); + return sl.value_or_default(err_id).template extract_capture_list(err_id); } #endif } diff --git a/test/try_capture_all_test.cpp b/test/try_capture_all_test.cpp index 00c50a78..34053a5d 100644 --- a/test/try_capture_all_test.cpp +++ b/test/try_capture_all_test.cpp @@ -68,6 +68,25 @@ namespace int main() { + { + leaf::result r = leaf::try_capture_all([]() { throw std::runtime_error("x"); }); + BOOST_TEST(!r); + int r1 = leaf::try_handle_all( + [&]() -> leaf::result + { + BOOST_LEAF_CHECK(r); + return 0; + }, + [](std::runtime_error const &) + { + return 1; + }, + [] + { + return 2; + } ); + BOOST_TEST_EQ(r1, 1); + } { leaf::result r = leaf::try_capture_all( []() -> leaf::result