38 using value_type = std::variant<variant_decay_t<await_resume_result_t<Ts>>...>;
52 _awaiters(
awaitable_cast<std::decay_t<
decltype(others)>>{}(hi_forward(others))...)
58 when_any(when_any&&) =
delete;
59 when_any(when_any
const&) =
delete;
60 when_any& operator=(when_any&&) =
delete;
61 when_any& operator=(when_any
const&) =
delete;
63 [[nodiscard]]
constexpr bool await_ready() noexcept
65 static_assert(
sizeof...(Ts) > 0);
66 return _await_ready<0>();
69 void await_suspend(std::coroutine_handle<>
const& handle)
noexcept
71 static_assert(
sizeof...(Ts) > 0);
72 return _await_suspend<0>(handle);
75 value_type await_resume() noexcept
77 hi_assert(_value.has_value());
84 std::tuple<
typename notifier<void(await_resume_result_t<Ts>)>::callback_token...> _task_cbts;
85 std::optional<value_type> _value;
87 template<awaitable_direct Awaiter>
88 static scoped_task<await_resume_result_t<Awaiter>> _await_suspend_task(Awaiter& awaiter)
90 co_return co_await awaiter;
93 template<std::
size_t I>
94 void _destroy_tasks() noexcept
96 std::get<I>(_task_cbts) = {};
97 std::get<I>(_tasks) = {};
98 if constexpr (I + 1 <
sizeof...(Ts)) {
99 _destroy_tasks<I + 1>();
103 template<std::
size_t I>
104 bool _await_ready() noexcept
106 auto& task = std::get<I>(_tasks) = _await_suspend_task(std::get<I>(_awaiters));
109 using arg_type = await_resume_result_t<decltype(std::get<I>(_awaiters))>;
111 if constexpr (std::is_same_v<arg_type, void>) {
112 _value = value_type{std::in_place_index<I>, std::monostate{}};
114 _value = value_type{std::in_place_index<I>, task.value()};
119 }
else if constexpr (I + 1 <
sizeof...(Ts)) {
120 return _await_ready<I + 1>();
127 template<std::
size_t I>
128 void _await_suspend(std::coroutine_handle<>
const& handle)
noexcept
130 using arg_type = await_resume_result_t<decltype(std::get<I>(_awaiters))>;
132 if constexpr (std::is_same_v<arg_type, void>) {
133 std::get<I>(_task_cbts) = std::get<I>(_tasks).subscribe(
135 this->_value = value_type{std::in_place_index<I>, std::monostate{}};
136 this->_destroy_tasks<0>();
139 callback_flags::main | callback_flags::once);
142 std::get<I>(_task_cbts) = std::get<I>(_tasks).subscribe(
143 [
this, handle](arg_type
const& arg) {
144 this->_value = value_type{std::in_place_index<I>, arg};
145 this->_destroy_tasks<0>();
148 callback_flags::main | callback_flags::once);
151 if constexpr (I + 1 <
sizeof...(Ts)) {
152 _await_suspend<I + 1>(handle);
156 template<
typename... Args>
157 friend class when_any;
when_any(awaitable auto &&...others) noexcept
Construct a when_any object from the given awaitables.
Definition when_any.hpp:51