Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-06-30 08:09:04

0001 // Copyright (c) 2023 Klemens D. Morgenstern
0002 //
0003 // Distributed under the Boost Software License, Version 1.0. (See accompanying
0004 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
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 //BOOST_COBALT_DETAIL_LEAF_HPP