File indexing completed on 2025-06-30 08:09:04
0001
0002
0003
0004
0005 #ifndef BOOST_COBALT_DETAIL_LEAF_HPP
0006 #define BOOST_COBALT_DETAIL_LEAF_HPP
0007
0008 #include <boost/cobalt/detail/await_result_helper.hpp>
0009 #include <boost/leaf/config.hpp>
0010 #include <boost/leaf/handle_errors.hpp>
0011
0012 namespace boost::cobalt::detail
0013 {
0014
0015 template<typename Awaitable, typename ... H>
0016 struct [[nodiscard]] try_catch_awaitable
0017 {
0018 Awaitable aw;
0019 std::tuple<H...> handler;
0020
0021 bool await_ready() {return aw.await_ready(); }
0022 template<typename Promise>
0023 auto await_suspend(std::coroutine_handle<Promise> h) {return aw.await_suspend(h);}
0024
0025 auto await_resume()
0026 {
0027 return std::apply(
0028 [this](auto && ... h)
0029 {
0030 return leaf::try_catch(
0031 [this]{return std::move(aw).await_resume();},
0032 std::move(h)...);
0033 }, std::move(handler));
0034 }
0035 };
0036
0037 template<typename Awaitable, typename ... H>
0038 struct [[nodiscard]] try_handle_all_awaitable
0039 {
0040 Awaitable aw;
0041 std::tuple<H...> handler;
0042
0043 bool await_ready() {return aw.await_ready(); }
0044 template<typename Promise>
0045 auto await_suspend(std::coroutine_handle<Promise> h) {return aw.await_suspend(h);}
0046
0047 auto await_resume()
0048 {
0049 return std::apply(
0050 [this](auto && ... h)
0051 {
0052 return leaf::try_handle_all(
0053 [this]{return std::move(aw).await_resume();},
0054 std::move(h)...);
0055 }, std::move(handler));
0056 }
0057 };
0058
0059
0060
0061 template<typename Awaitable, typename ... H>
0062 struct [[nodiscard]] try_handle_some_awaitable
0063 {
0064 Awaitable aw;
0065 std::tuple<H...> handler;
0066
0067 bool await_ready() {return aw.await_ready(); }
0068 template<typename Promise>
0069 auto await_suspend(std::coroutine_handle<Promise> h) {return aw.await_suspend(h);}
0070
0071 auto await_resume()
0072 {
0073 return std::apply(
0074 [this](auto && ... h)
0075 {
0076 return leaf::try_handle_some(
0077 [this]{return std::move(aw).await_resume();},
0078 std::move(h)...);
0079 }, std::move(handler));
0080 }
0081 };
0082
0083 }
0084
0085 #endif