16#include "pw_async2/dispatcher.h"
17#include "pw_async2/future.h"
23template <
typename... Futures>
25 :
public Future<JoinFuture<Futures...>,
26 std::tuple<typename Futures::value_type&&...>> {
28 static constexpr auto kTupleIndexSequence =
29 std::make_index_sequence<
sizeof...(Futures)>();
30 using TupleOfOutputRvalues = std::tuple<
typename Futures::value_type&&...>;
35 template <
typename... Fs>
36 friend constexpr auto Join(Fs&&...);
38 explicit constexpr JoinFuture(Futures&&... futures)
39 : futures_(std::in_place, std::move(futures)...),
45 if (!PendElements(cx, kTupleIndexSequence)) {
48 return TakeOutputs(kTupleIndexSequence);
51 void DoMarkComplete() { futures_.reset(); }
52 bool DoIsComplete()
const {
return !futures_.has_value(); }
57 template <
size_t... Is>
58 bool PendElements(
Context& cx, std::index_sequence<Is...>) {
59 (PendElement<Is>(cx), ...);
60 return (std::get<Is>(outputs_).IsReady() && ...);
65 template <
size_t kTupleIndex>
67 auto& output = std::get<kTupleIndex>(outputs_);
68 if (!output.IsReady()) {
69 output = std::get<kTupleIndex>(*futures_).Pend(cx);
74 template <
size_t... Is>
77 std::forward_as_tuple<internal::PendOutputOf<Futures>...>(
78 TakeOutput<Is>()...));
82 template <
size_t kTupleIndex>
83 internal::PendOutputOf<
84 typename std::tuple_element<kTupleIndex, std::tuple<Futures...>>::type>&&
86 return std::move(std::get<kTupleIndex>(outputs_).value());
89 static_assert(std::conjunction_v<is_future<Futures>...>,
90 "All types in JoinFuture must be Future types");
91 std::optional<std::tuple<Futures...>> futures_;
92 std::tuple<Poll<internal::PendOutputOf<Futures>>...> outputs_;
95template <
typename... Futures>
103template <
typename... Futures>
104constexpr auto Join(Futures&&... futures) {
105 static_assert(std::conjunction_v<is_future<Futures>...>,
106 "All arguments to Join must be Future types");
107 return JoinFuture(std::forward<Futures>(futures)...);
constexpr auto Join(Futures &&... futures)
Definition: join.h:104
constexpr PendingType Pending()
Returns a value indicating that an operation was not yet able to complete.
Definition: poll.h:271