7#include "detail/ranges.hpp"
16 :
result_count(std::make_shared<std::atomic<size_t>>(count))
23 any_failed->store(
true, std::memory_order_release);
25 if (
result_count->fetch_sub(1, std::memory_order_acq_rel) == 1) {
26 if (
any_failed->load(std::memory_order_acquire)) {
27 future->set_exception(std::make_exception_ptr(
task_error(
"subtask failed")));
36 std::shared_ptr<std::atomic<bool>>
any_failed = std::make_shared<std::atomic<bool>>(
false);
37 std::shared_ptr<detail::task_future<void>>
future = detail::task_future<void>::create_pending();
40template<
typename TaskRange>
42 auto tasks_size = detail::range_size(tasks);
43 if (tasks_size == 0) {
44 return detail::task_future<void>::create_ready();
46 else if (tasks_size == 1) {
47 return *detail::range_begin(tasks);
51 for (
auto&&
task : tasks) {
76template<
typename TaskRange>
81#ifdef __cpp_fold_expressions
88 template<
typename... Tasks>
89 task<void>
when_all(
const Tasks&... tasks) {
90 if constexpr (
sizeof...(Tasks) == 0) {
91 return detail::task_future<void>::create_ready();
93 else if constexpr (
sizeof...(Tasks) == 1) {
94 return std::get<0>(std::forward_as_tuple(std::forward<Tasks>(tasks)...));
98 (tasks.then(helper), ...);
Definition task_error.hpp:10
task_state get_state() const
Definition task.hpp:193
auto then(F &&f) const
Definition task.hpp:124
Definition when_all.hpp:12
task< void > when_all_internal(const TaskRange &tasks)
Definition when_all.hpp:41
Definition dispatch_queue.hpp:19
task< void > when_all(std::initializer_list< task< T > > tasks)
Definition when_all.hpp:66
@ failed
Task failed with an exception.
Definition task_state.hpp:17
Definition when_all.hpp:14
void operator()(const task< T > &task) const
Definition when_all.hpp:21
std::shared_ptr< std::atomic< bool > > any_failed
Definition when_all.hpp:36
when_all_helper(size_t count)
Definition when_all.hpp:15
std::shared_ptr< std::atomic< size_t > > result_count
Definition when_all.hpp:35
std::shared_ptr< detail::task_future< void > > future
Definition when_all.hpp:37