22#include "util/async/AnyOperation.hpp"
23#include "util/async/AnyStopToken.hpp"
24#include "util/async/AnyStrand.hpp"
25#include "util/async/Concepts.hpp"
26#include "util/async/impl/ErasedOperation.hpp"
51 template <NotSameAs<AnyExecutionContext> CtxType>
65 template <RValueNotSameAs<AnyExecutionContext> CtxType>
67 AnyExecutionContext(CtxType&& ctx) : pimpl_{std::make_shared<Model<CtxType>>(std::forward<CtxType>(ctx))}
88 using RetType = std::decay_t<
decltype(fn())>;
89 static_assert(not std::is_same_v<RetType, std::any>);
92 if constexpr (std::is_void_v<RetType>) {
96 return std::make_any<RetType>(fn());
112 using RetType = std::decay_t<decltype(fn(std::declval<AnyStopToken>()))>;
113 static_assert(not std::is_same_v<RetType, std::any>);
115 return AnyOperation<RetType>(pimpl_->execute([fn = std::forward<
decltype(fn)>(fn)](
auto stopToken) -> std::any {
116 if constexpr (std::is_void_v<RetType>) {
117 fn(std::move(stopToken));
120 return std::make_any<RetType>(fn(std::move(stopToken)));
137 using RetType = std::decay_t<decltype(fn(std::declval<AnyStopToken>()))>;
138 static_assert(not std::is_same_v<RetType, std::any>);
141 [fn = std::forward<
decltype(fn)>(fn)](
auto stopToken) -> std::any {
142 if constexpr (std::is_void_v<RetType>) {
143 fn(std::move(stopToken));
146 return std::make_any<RetType>(fn(std::move(stopToken)));
149 std::chrono::duration_cast<std::chrono::milliseconds>(timeout)
165 using RetType = std::decay_t<decltype(fn(std::declval<AnyStopToken>()))>;
166 static_assert(not std::is_same_v<RetType, std::any>);
168 auto const millis = std::chrono::duration_cast<std::chrono::milliseconds>(delay);
171 [fn = std::forward<
decltype(fn)>(fn)](
auto stopToken) -> std::any {
172 if constexpr (std::is_void_v<RetType>) {
173 fn(std::move(stopToken));
176 return std::make_any<RetType>(fn(std::move(stopToken)));
195 using RetType = std::decay_t<decltype(fn(std::declval<AnyStopToken>(),
true))>;
196 static_assert(not std::is_same_v<RetType, std::any>);
198 auto const millis = std::chrono::duration_cast<std::chrono::milliseconds>(delay);
201 [fn = std::forward<
decltype(fn)>(fn)](
auto stopToken,
auto cancelled) -> std::any {
202 if constexpr (std::is_void_v<RetType>) {
203 fn(std::move(stopToken), cancelled);
206 return std::make_any<RetType>(fn(std::move(stopToken), cancelled));
222 using RetType = std::decay_t<
decltype(fn())>;
223 static_assert(not std::is_same_v<RetType, std::any>);
225 auto const millis = std::chrono::duration_cast<std::chrono::milliseconds>(interval);
227 pimpl_->executeRepeatedly(
229 [fn = std::forward<
decltype(fn)>(fn)] -> std::any {
248 return pimpl_->makeStrand();
271 virtual ~Concept() =
default;
276 std::optional<std::chrono::milliseconds> timeout = std::nullopt
280 scheduleAfter(std::chrono::milliseconds, std::function<std::any(
AnyStopToken)>) = 0;
282 scheduleAfter(std::chrono::milliseconds, std::function<std::any(
AnyStopToken,
bool)>) = 0;
283 virtual impl::ErasedOperation executeRepeatedly(std::chrono::milliseconds, std::function<std::any()>) = 0;
292 template <
typename CtxType>
293 struct Model : Concept {
296 template <
typename Type>
297 Model(Type&& ctx) : ctx(std::forward<Type>(ctx))
301 impl::ErasedOperation
302 execute(std::function<std::any(AnyStopToken)> fn, std::optional<std::chrono::milliseconds> timeout)
override
304 return ctx.execute(std::move(fn), timeout);
307 impl::ErasedOperation
308 execute(std::function<std::any()> fn)
override
310 return ctx.execute(std::move(fn));
313 impl::ErasedOperation
314 scheduleAfter(std::chrono::milliseconds delay, std::function<std::any(AnyStopToken)> fn)
override
316 return ctx.scheduleAfter(delay, std::move(fn));
319 impl::ErasedOperation
320 scheduleAfter(std::chrono::milliseconds delay, std::function<std::any(AnyStopToken,
bool)> fn)
override
322 return ctx.scheduleAfter(delay, std::move(fn));
325 impl::ErasedOperation
326 executeRepeatedly(std::chrono::milliseconds interval, std::function<std::any()> fn)
override
328 return ctx.executeRepeatedly(interval, std::move(fn));
332 makeStrand()
override
334 return ctx.makeStrand();
338 stop()
const override
344 join()
const override
351 std::shared_ptr<Concept> pimpl_;
A type-erased execution context.
Definition AnyExecutionContext.hpp:41
auto execute(SomeHandlerWith< AnyStopToken > auto &&fn)
Execute a function on the execution context.
Definition AnyExecutionContext.hpp:110
auto execute(SomeHandlerWith< AnyStopToken > auto &&fn, SomeStdDuration auto timeout)
Execute a function with a timeout.
Definition AnyExecutionContext.hpp:135
auto scheduleAfter(SomeStdDuration auto delay, SomeHandlerWith< AnyStopToken > auto &&fn)
Schedule a function for execution.
Definition AnyExecutionContext.hpp:163
auto makeStrand()
Make a strand for this execution context.
Definition AnyExecutionContext.hpp:246
void stop() const
Stop the execution context.
Definition AnyExecutionContext.hpp:255
auto execute(SomeHandlerWithoutStopToken auto &&fn)
Execute a function on the execution context.
Definition AnyExecutionContext.hpp:86
auto scheduleAfter(SomeStdDuration auto delay, SomeHandlerWith< AnyStopToken, bool > auto &&fn)
Schedule a function for execution.
Definition AnyExecutionContext.hpp:193
AnyExecutionContext(CtxType &ctx)
Construct a new type-erased Execution Context object.
Definition AnyExecutionContext.hpp:53
AnyExecutionContext(CtxType &&ctx)
Construct a new type-erased Execution Context object.
Definition AnyExecutionContext.hpp:67
void join() const
Join the execution context.
Definition AnyExecutionContext.hpp:264
auto executeRepeatedly(SomeStdDuration auto interval, SomeHandlerWithoutStopToken auto &&fn)
Schedule a repeating operation on the execution context.
Definition AnyExecutionContext.hpp:220
A type-erased operation that can be executed via AnyExecutionContext.
Definition AnyOperation.hpp:45
A type-erased stop token.
Definition AnyStopToken.hpp:37
A type-erased execution context.
Definition AnyStrand.hpp:40
Definition ErasedOperation.hpp:34
Specifies the interface for a handler that can be invoked with the specified args.
Definition Concepts.hpp:154
Specifies the interface for a handler that can be stopped.
Definition Concepts.hpp:146
Specifies that the type must be some std::duration.
Definition Concepts.hpp:162
This namespace implements an async framework built on top of execution contexts.
Definition AnyExecutionContext.hpp:36