27 using type = std::monostate;
36template <
typename... ResultTypes>
39 std::variant<detail::wrap_void_t<ResultTypes>...>
result{};
44template <
size_t Index,
typename TaskType,
typename ResultVariant>
45bool checkTaskDone(TaskType& task,
size_t& winnerIndex, ResultVariant& resultVariant)
49 if constexpr (!std::is_void_v<typename TaskType::ValueType>) {
50 resultVariant.template emplace<Index>(task.await_resume());
53 resultVariant.template emplace<Index>(std::monostate{});
60template <
size_t Index,
typename TaskType>
68template <
typename... Tasks,
size_t... Is>
75 (resumeTask<Is>(tasks), ...);
78 bool winnerFound = (checkTaskDone<Is>(tasks, res.index, res.result) || ...);
82 (resumeTask<Is>(tasks), ...);
93template <
typename... Tasks>
97 std::index_sequence_for<Tasks...>{},
98 std::forward<Tasks>(tasks)...
Lazy awaitable C++20 coroutine task with zero dynamic heap allocation.
Lightweight C++20 coroutine task with zero-heap resumption chaining and configurable frame allocator.
Definition Task.hpp:22
auto whenAny(Tasks &&... tasks)
Awaits the first task among multiple tasks to complete.
Definition WhenAny.hpp:94
typename WrapVoid< T >::type wrap_void_t
Definition WhenAny.hpp:31
bool checkTaskDone(TaskType &task, size_t &winnerIndex, ResultVariant &resultVariant)
Definition WhenAny.hpp:45
Task< WhenAnyResult< typename std::decay_t< Tasks >::ValueType... > > whenAnyImpl(std::index_sequence< Is... >, Tasks... tasks)
Definition WhenAny.hpp:69
void resumeTask(TaskType &task)
Definition WhenAny.hpp:61
Definition AsyncEvent.hpp:14
Result container for whenAny combinator.
Definition WhenAny.hpp:37
std::variant< detail::wrap_void_t< ResultTypes >... > result
Definition WhenAny.hpp:39
std::size_t index
Definition WhenAny.hpp:38
std::monostate type
Definition WhenAny.hpp:27
Definition WhenAny.hpp:21
T type
Definition WhenAny.hpp:22