Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
zajo committed Aug 19, 2024
2 parents cf0dcfc + 0e7f5a0 commit 7d17e6f
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 5 deletions.
8 changes: 8 additions & 0 deletions include/boost/leaf/detail/optional.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
};

}
Expand Down
1 change: 1 addition & 0 deletions include/boost/leaf/error.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ namespace leaf_detail
using impl::load;
using impl::has_value;
using impl::value;
using impl::value_or_default;
};
}

Expand Down
10 changes: 5 additions & 5 deletions include/boost/leaf/handle_errors.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -977,21 +977,21 @@ 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<leaf_result>(err_id));
return leaf_result(sl.value_or_default(err_id).template extract_capture_list<leaf_result>(err_id));
}
}
#ifndef BOOST_LEAF_NO_EXCEPTIONS
catch( std::exception & ex )
{
sl.deactivate();
int const err_id = error_info(&ex).error().value();
return sl.value(err_id).template extract_capture_list<leaf_result>(err_id);
return sl.value_or_default(err_id).template extract_capture_list<leaf_result>(err_id);
}
catch(...)
{
sl.deactivate();
int const err_id = error_info(nullptr).error().value();
return sl.value(err_id).template extract_capture_list<leaf_result>(err_id);
return sl.value_or_default(err_id).template extract_capture_list<leaf_result>(err_id);
}
#endif
}
Expand Down Expand Up @@ -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<leaf_result>(err_id);
return sl.value_or_default(err_id).template extract_capture_list<leaf_result>(err_id);
}
catch(...)
{
sl.deactivate();
int const err_id = error_info(nullptr).error().value();
return sl.value(err_id).template extract_capture_list<leaf_result>(err_id);
return sl.value_or_default(err_id).template extract_capture_list<leaf_result>(err_id);
}
#endif
}
Expand Down
19 changes: 19 additions & 0 deletions test/try_capture_all_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,25 @@ namespace

int main()
{
{
leaf::result<void> r = leaf::try_capture_all([]() { throw std::runtime_error("x"); });
BOOST_TEST(!r);
int r1 = leaf::try_handle_all(
[&]() -> leaf::result<int>
{
BOOST_LEAF_CHECK(r);
return 0;
},
[](std::runtime_error const &)
{
return 1;
},
[]
{
return 2;
} );
BOOST_TEST_EQ(r1, 1);
}
{
leaf::result<void> r = leaf::try_capture_all(
[]() -> leaf::result<void>
Expand Down

0 comments on commit 7d17e6f

Please sign in to comment.