6#include "detail/ranges.hpp"
16 if (!
result_set->exchange(
true, std::memory_order_acq_rel)) {
18 future->set_exception(exception);
26 std::shared_ptr<std::atomic<bool>>
result_set = std::make_shared<std::atomic<bool>>(
false);
27 std::shared_ptr<detail::task_future<void>>
future = detail::task_future<void>::create_pending();
30template<
typename TaskRange>
32 auto tasks_size = detail::range_size(tasks);
33 if (tasks_size == 0) {
34 return detail::task_future<void>::create_ready();
36 else if (tasks_size == 1) {
37 return *detail::range_begin(tasks);
41 for (
auto&&
task : tasks) {
66template<
typename TaskRange>
71#ifdef __cpp_fold_expressions
78 template<
typename... Tasks>
79 task<void>
when_any(
const Tasks&... tasks) {
80 if constexpr (
sizeof...(Tasks) == 0) {
81 return detail::task_future<void>::create_ready();
83 else if constexpr (
sizeof...(Tasks) == 1) {
84 return std::get<0>(std::forward_as_tuple(std::forward<Tasks>(tasks)...));
88 (tasks.then(helper), ...);
std::exception_ptr get_exception() const
Definition task.hpp:205
auto then(F &&f) const
Definition task.hpp:124
Definition when_all.hpp:12
task< void > when_any_internal(const TaskRange &tasks)
Definition when_any.hpp:31
Definition dispatch_queue.hpp:19
task< void > when_any(std::initializer_list< task< T > > tasks)
Definition when_any.hpp:56
Definition when_any.hpp:13
std::shared_ptr< std::atomic< bool > > result_set
Definition when_any.hpp:26
std::shared_ptr< detail::task_future< void > > future
Definition when_any.hpp:27
void operator()(const task< T > &task) const
Definition when_any.hpp:15