16#include "pw_async2/dispatcher.h"
25template <
typename... Pendables>
28 static constexpr auto kTupleIndexSequence =
29 std::make_index_sequence<
sizeof...(Pendables)>();
30 using TupleOfOutputRvalues = std::tuple<PendOutputOf<Pendables>&&...>;
34 explicit Join(Pendables&&... pendables)
35 : pendables_(std::move(pendables)...),
36 outputs_(
Poll<PendOutputOf<Pendables>>(Pending())...) {}
41 if (!PendElements(cx, kTupleIndexSequence)) {
44 return TakeOutputs(kTupleIndexSequence);
51 template <
size_t... Is>
52 bool PendElements(
Context& cx, std::index_sequence<Is...>) {
53 return (... && PendElement<Is>(cx));
57 template <
size_t... Is>
58 Poll<TupleOfOutputRvalues> TakeOutputs(std::index_sequence<Is...>) {
59 return Poll<TupleOfOutputRvalues>(
60 std::forward_as_tuple<PendOutputOf<Pendables>...>(TakeOutput<Is>()...));
68 template <
size_t kTupleIndex>
69 bool PendElement(Context& cx) {
70 auto& output = std::get<kTupleIndex>(outputs_);
71 if (output.IsReady()) {
74 output = std::get<kTupleIndex>(pendables_).Pend(cx);
75 return output.IsReady();
79 template <
size_t kTupleIndex>
80 PendOutputOf<
typename std::tuple_element<kTupleIndex,
81 std::tuple<Pendables...>>::type>&&
83 return std::move(std::get<kTupleIndex>(outputs_).value());
86 std::tuple<Pendables...> pendables_;
87 std::tuple<Poll<PendOutputOf<Pendables>>...> outputs_;
Definition: dispatcher_base.h:52
Join(Pendables &&... pendables)
Creates a Join from a series of pendable values.
Definition: join.h:34
Poll< TupleOfOutputRvalues > Pend(Context &cx)
Definition: join.h:40