leaf.hpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. #include <boost/cobalt/detail/await_result_helper.hpp>
  8. #include <boost/leaf/config.hpp>
  9. #include <boost/leaf/handle_errors.hpp>
  10. namespace boost::cobalt::detail
  11. {
  12. template<typename Awaitable, typename ... H>
  13. struct [[nodiscard]] try_catch_awaitable
  14. {
  15. Awaitable aw;
  16. std::tuple<H...> handler;
  17. bool await_ready() {return aw.await_ready(); }
  18. template<typename Promise>
  19. auto await_suspend(std::coroutine_handle<Promise> h) {return aw.await_suspend(h);}
  20. auto await_resume()
  21. {
  22. return std::apply(
  23. [this](auto && ... h)
  24. {
  25. return leaf::try_catch(
  26. [this]{return std::move(aw).await_resume();},
  27. std::move(h)...);
  28. }, std::move(handler));
  29. }
  30. };
  31. template<typename Awaitable, typename ... H>
  32. struct [[nodiscard]] try_handle_all_awaitable
  33. {
  34. Awaitable aw;
  35. std::tuple<H...> handler;
  36. bool await_ready() {return aw.await_ready(); }
  37. template<typename Promise>
  38. auto await_suspend(std::coroutine_handle<Promise> h) {return aw.await_suspend(h);}
  39. auto await_resume()
  40. {
  41. return std::apply(
  42. [this](auto && ... h)
  43. {
  44. return leaf::try_handle_all(
  45. [this]{return std::move(aw).await_resume();},
  46. std::move(h)...);
  47. }, std::move(handler));
  48. }
  49. };
  50. template<typename Awaitable, typename ... H>
  51. struct [[nodiscard]] try_handle_some_awaitable
  52. {
  53. Awaitable aw;
  54. std::tuple<H...> handler;
  55. bool await_ready() {return aw.await_ready(); }
  56. template<typename Promise>
  57. auto await_suspend(std::coroutine_handle<Promise> h) {return aw.await_suspend(h);}
  58. auto await_resume()
  59. {
  60. return std::apply(
  61. [this](auto && ... h)
  62. {
  63. return leaf::try_handle_some(
  64. [this]{return std::move(aw).await_resume();},
  65. std::move(h)...);
  66. }, std::move(handler));
  67. }
  68. };
  69. }
  70. #endif //BOOST_COBALT_DETAIL_LEAF_HPP