22#include "util/async/AnyOperation.hpp"
23#include "util/async/AnyStopToken.hpp"
24#include "util/async/Concepts.hpp"
25#include "util/async/impl/ErasedOperation.hpp"
48 template <NotSameAs<AnyStrand> StrandType>
50 : pimpl_{std::make_shared<Model<StrandType>>(std::forward<StrandType>(strand))}
67 using RetType = std::decay_t<
decltype(fn())>;
68 static_assert(not std::is_same_v<RetType, std::any>);
71 pimpl_->execute([fn = std::forward<
decltype(fn)>(fn)]() -> std::any {
72 if constexpr (std::is_void_v<RetType>) {
76 return std::make_any<RetType>(fn());
91 using RetType = std::decay_t<decltype(fn(std::declval<AnyStopToken>()))>;
92 static_assert(not std::is_same_v<RetType, std::any>);
95 pimpl_->execute([fn = std::forward<
decltype(fn)>(fn)](
auto stopToken) -> std::any {
96 if constexpr (std::is_void_v<RetType>) {
97 fn(std::move(stopToken));
100 return std::make_any<RetType>(fn(std::move(stopToken)));
116 using RetType = std::decay_t<decltype(fn(std::declval<AnyStopToken>()))>;
117 static_assert(not std::is_same_v<RetType, std::any>);
121 [fn = std::forward<
decltype(fn)>(fn)](
auto stopToken) -> std::any {
122 if constexpr (std::is_void_v<RetType>) {
123 fn(std::move(stopToken));
126 return std::make_any<RetType>(fn(std::move(stopToken)));
129 std::chrono::duration_cast<std::chrono::milliseconds>(timeout)
136 virtual ~Concept() =
default;
138 [[nodiscard]]
virtual impl::ErasedOperation
139 execute(std::function<std::any(AnyStopToken)>, std::optional<std::chrono::milliseconds> timeout = std::nullopt)
141 [[nodiscard]]
virtual impl::ErasedOperation execute(std::function<std::any()>) = 0;
144 template <
typename StrandType>
145 struct Model : Concept {
148 template <
typename SType>
149 requires std::is_same_v<SType, StrandType>
150 Model(SType&& strand) : strand{std::forward<SType>(strand)}
154 [[nodiscard]] impl::ErasedOperation
155 execute(std::function<std::any(AnyStopToken)> fn, std::optional<std::chrono::milliseconds> timeout)
158 return strand.execute(std::move(fn), timeout);
161 [[nodiscard]] impl::ErasedOperation
162 execute(std::function<std::any()> fn)
override
164 return strand.execute(std::move(fn));
169 std::shared_ptr<Concept> pimpl_;
A type-erased operation that can be executed via AnyExecutionContext.
Definition AnyOperation.hpp:45
A type-erased execution context.
Definition AnyStrand.hpp:40
AnyStrand(StrandType &&strand)
Construct a new Any Strand object.
Definition AnyStrand.hpp:49
auto execute(SomeHandlerWithoutStopToken auto &&fn)
Execute a function without a stop token on the strand.
Definition AnyStrand.hpp:65
auto execute(SomeHandlerWith< AnyStopToken > auto &&fn)
Execute a function taking a stop token on the strand.
Definition AnyStrand.hpp:89
auto execute(SomeHandlerWith< AnyStopToken > auto &&fn, SomeStdDuration auto timeout)
Execute a function taking a stop token on the strand with a timeout.
Definition AnyStrand.hpp:114
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