43 boost::asio::steady_timer timer;
44 std::atomic_bool stopping{
true};
45 std::binary_semaphore semaphore{0};
47 Control(
auto& ctx) : timer(ctx)
52 std::shared_ptr<Control> control_;
61 Repeat(
auto& ctx) : control_(std::make_unique<Control>(ctx))
67 operator=(
Repeat const&) =
delete;
70 operator=(
Repeat&&) =
default;
87 template <std::invocable Action>
89 start(std::chrono::steady_clock::duration interval, Action&& action)
91 ASSERT(control_->stopping,
"Should be stopped before starting");
92 control_->stopping =
false;
93 startImpl(control_, interval, std::forward<Action>(action));
97 template <std::invocable Action>
99 startImpl(std::shared_ptr<Control> control, std::chrono::steady_clock::duration interval, Action&& action)
101 control->timer.expires_after(interval);
102 control->timer.async_wait([control, interval, action = std::forward<Action>(action)](
auto const& ec)
mutable {
103 if (ec or control->stopping) {
104 control->semaphore.release();
109 startImpl(std::move(control), interval, std::forward<Action>(action));