sleep.hpp 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. //
  2. // Copyright (c) 2025 Klemens Morgenstern (klemens.morgenstern@gmx.net)
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. //
  7. #ifndef BOOST_COBALT_IO_SLEEP_HPP
  8. #define BOOST_COBALT_IO_SLEEP_HPP
  9. #include <boost/cobalt/io/detail/config.hpp>
  10. #include <boost/cobalt/io/ops.hpp>
  11. #include <boost/cobalt/io/steady_timer.hpp>
  12. #include <boost/cobalt/io/system_timer.hpp>
  13. namespace boost::cobalt::detail::io
  14. {
  15. struct BOOST_COBALT_IO_DECL steady_sleep final : op<system::error_code>
  16. {
  17. steady_sleep(const std::chrono::steady_clock::time_point & tp);
  18. steady_sleep(const std::chrono::steady_clock::duration & du);
  19. std::chrono::steady_clock::time_point tp;
  20. void ready(handler<system::error_code> h) final override
  21. {
  22. if (tp < std::chrono::steady_clock::now())
  23. h({});
  24. }
  25. void initiate(completion_handler<system::error_code> h) final override;
  26. ~steady_sleep() = default;
  27. std::optional< asio::basic_waitable_timer<std::chrono::steady_clock, asio::wait_traits<std::chrono::steady_clock>, executor> > timer_;
  28. };
  29. struct BOOST_COBALT_IO_DECL system_sleep final : op<system::error_code>
  30. {
  31. system_sleep(const std::chrono::system_clock::time_point & tp);
  32. system_sleep(const std::chrono::system_clock::duration & du);
  33. std::chrono::system_clock::time_point tp;
  34. void ready(handler<system::error_code> h) final override
  35. {
  36. if (tp < std::chrono::system_clock::now())
  37. h({});
  38. }
  39. void initiate(completion_handler<system::error_code> h) final override;
  40. ~system_sleep() = default;
  41. std::optional<asio::basic_waitable_timer<std::chrono::system_clock, asio::wait_traits<std::chrono::system_clock>, executor> > timer_;
  42. };
  43. }
  44. namespace boost::cobalt::io
  45. {
  46. [[nodiscard]] inline auto sleep(const std::chrono::steady_clock::duration & d) { return ::boost::cobalt::detail::io::steady_sleep{d};}
  47. [[nodiscard]] inline auto sleep(const std::chrono::steady_clock::time_point & tp) { return ::boost::cobalt::detail::io::steady_sleep{tp};}
  48. [[nodiscard]] inline auto sleep(const std::chrono::system_clock::time_point & tp) { return ::boost::cobalt::detail::io::system_sleep{tp};}
  49. template<typename Duration>
  50. [[nodiscard]] inline auto sleep(const std::chrono::time_point<std::chrono::steady_clock, Duration> & tp)
  51. {
  52. return sleep(std::chrono::time_point_cast<std::chrono::steady_clock::duration >(tp));
  53. }
  54. template<typename Duration>
  55. [[nodiscard]] inline auto sleep(const std::chrono::time_point<std::chrono::system_clock, Duration> & tp)
  56. {
  57. return sleep(std::chrono::time_point_cast<std::chrono::system_clock::duration >(tp));
  58. }
  59. template<typename Rep, typename Period>
  60. [[nodiscard]] inline auto sleep(const std::chrono::duration<Rep, Period> & dur)
  61. {
  62. return sleep(std::chrono::duration_cast<std::chrono::steady_clock::duration >(dur));
  63. }
  64. }
  65. #endif //BOOST_COBALT_IO_IO_SLEEP_HPP