1// Copyright (c) 2023 Klemens D. Morgenstern
2//
3// Distributed under the Boost Software License, Version 1.0. (See accompanying
4// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5#ifndef BOOST_COBALT_DETAIL_LEAF_HPP
6#define BOOST_COBALT_DETAIL_LEAF_HPP
7
8#include <boost/cobalt/detail/await_result_helper.hpp>
9#include <boost/leaf/config.hpp>
10#include <boost/leaf/handle_errors.hpp>
11
12namespace boost::cobalt::detail
13{
14
15template<typename Awaitable, typename ... H>
16struct [[nodiscard]] try_catch_awaitable
17{
18 Awaitable aw;
19 std::tuple<H...> handler;
20
21 bool await_ready() {return aw.await_ready(); }
22 template<typename Promise>
23 auto await_suspend(std::coroutine_handle<Promise> h) {return aw.await_suspend(h);}
24
25 auto await_resume()
26 {
27 return std::apply(
28 [this](auto && ... h)
29 {
30 return leaf::try_catch(
31 [this]{return std::move(aw).await_resume();},
32 std::move(h)...);
33 }, std::move(handler));
34 }
35};
36
37template<typename Awaitable, typename ... H>
38struct [[nodiscard]] try_handle_all_awaitable
39{
40 Awaitable aw;
41 std::tuple<H...> handler;
42
43 bool await_ready() {return aw.await_ready(); }
44 template<typename Promise>
45 auto await_suspend(std::coroutine_handle<Promise> h) {return aw.await_suspend(h);}
46
47 auto await_resume()
48 {
49 return std::apply(
50 [this](auto && ... h)
51 {
52 return leaf::try_handle_all(
53 [this]{return std::move(aw).await_resume();},
54 std::move(h)...);
55 }, std::move(handler));
56 }
57};
58
59
60
61template<typename Awaitable, typename ... H>
62struct [[nodiscard]] try_handle_some_awaitable
63{
64 Awaitable aw;
65 std::tuple<H...> handler;
66
67 bool await_ready() {return aw.await_ready(); }
68 template<typename Promise>
69 auto await_suspend(std::coroutine_handle<Promise> h) {return aw.await_suspend(h);}
70
71 auto await_resume()
72 {
73 return std::apply(
74 [this](auto && ... h)
75 {
76 return leaf::try_handle_some(
77 [this]{return std::move(aw).await_resume();},
78 std::move(h)...);
79 }, std::move(handler));
80 }
81};
82
83}
84
85#endif //BOOST_COBALT_DETAIL_LEAF_HPP
86

source code of boost/libs/cobalt/include/boost/cobalt/detail/leaf.hpp