leaf.hpp 2.2 KB

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