// // Copyright (c) 2025 Klemens Morgenstern (klemens.morgenstern@gmx.net) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef BOOST_COBALT_IO_SLEEP_HPP #define BOOST_COBALT_IO_SLEEP_HPP #include #include #include #include namespace boost::cobalt::detail::io { struct BOOST_COBALT_IO_DECL steady_sleep final : op { steady_sleep(const std::chrono::steady_clock::time_point & tp); steady_sleep(const std::chrono::steady_clock::duration & du); std::chrono::steady_clock::time_point tp; void ready(handler h) final override { if (tp < std::chrono::steady_clock::now()) h({}); } void initiate(completion_handler h) final override; ~steady_sleep() = default; std::optional< asio::basic_waitable_timer, executor> > timer_; }; struct BOOST_COBALT_IO_DECL system_sleep final : op { system_sleep(const std::chrono::system_clock::time_point & tp); system_sleep(const std::chrono::system_clock::duration & du); std::chrono::system_clock::time_point tp; void ready(handler h) final override { if (tp < std::chrono::system_clock::now()) h({}); } void initiate(completion_handler h) final override; ~system_sleep() = default; std::optional, executor> > timer_; }; } namespace boost::cobalt::io { [[nodiscard]] inline auto sleep(const std::chrono::steady_clock::duration & d) { return ::boost::cobalt::detail::io::steady_sleep{d};} [[nodiscard]] inline auto sleep(const std::chrono::steady_clock::time_point & tp) { return ::boost::cobalt::detail::io::steady_sleep{tp};} [[nodiscard]] inline auto sleep(const std::chrono::system_clock::time_point & tp) { return ::boost::cobalt::detail::io::system_sleep{tp};} template [[nodiscard]] inline auto sleep(const std::chrono::time_point & tp) { return sleep(std::chrono::time_point_cast(tp)); } template [[nodiscard]] inline auto sleep(const std::chrono::time_point & tp) { return sleep(std::chrono::time_point_cast(tp)); } template [[nodiscard]] inline auto sleep(const std::chrono::duration & dur) { return sleep(std::chrono::duration_cast(dur)); } } #endif //BOOST_COBALT_IO_IO_SLEEP_HPP