53 template<
typename Rec,
typename... Seqs>
62 using StopCallback = StopToken::template CallbackType<StopCallbackFunction>;
77 auto callback = util::move(inner_callback);
78 inner_callback =
nullptr;
85 template<
usize index,
typename... Types>
91 optional.emplace(util::forward<Types>(values)...);
101 this->
inner_error.template emplace<meta::Decay<E>>(util::forward<E>(error));
117 if (old_value == 1) {
135 this->
outer_error.template emplace<meta::Decay<E>>(util::forward<E>(error));
153 if (old_value == 1) {
162 [&]<
typename E>(E&& e) {
203 template<usize index,
typename Data>
210 template<
typename... Types>
212 self.data->report_inner_value(
c_<index>, util::forward<Types>(values)...);
217 self.data->report_inner_error(util::forward<E>(error));
229 template<usize index,
typename Data>
232 template<usize index,
typename Send,
typename Data,
typename R>
239 explicit Type(Data*
data, Send&& sender, R receiver)
241 , m_receiver(
util::move(receiver))
250 self.m_data->inner_complete_callbacks[index] = [&self](
bool stopped) {
262 [[no_unique_address]] R m_receiver;
267 template<usize index,
typename Send,
typename Data,
typename R>
270 template<usize index,
typename Send,
typename Data>
280 template<concepts::ReceiverOf<CompletionSignatures> R>
283 util::move(receiver));
290 template<usize index,
typename Send,
typename Data>
293 template<usize index,
typename Seq,
typename Data>
304 self.data->report_outer_error(util::forward<E>(error));
311 template<concepts::SenderTo<NextRec> Send>
323 template<usize index, concepts::Sender Seq,
typename Data>
326 template<
typename Rec,
typename Indices,
typename Seqs>
329 template<
typename Rec,
usize... indices,
typename... Seqs>
346 template<
typename Rec,
typename Indices,
typename Seqs>
349 template<
typename Rec,
typename Indices,
typename Seqs,
typename R>
352 template<
typename Rec,
usize... indices,
typename... Seqs,
typename R>
359 auto&
data = *self.m_data;
363 [&]<
typename E>(E&& e) {
368 util::move(
data.inner_error));
377 [](
auto&... optionals) {
382 [&](
auto&... values) {
394 [[no_unique_address]] R m_receiver;
398 template<
typename Rec,
typename Indices,
typename Seqs,
typename R>
401 template<
typename Rec,
typename Indices,
typename Seqs>
404 template<
typename Rec,
usize... indices,
typename... Seqs>
414 template<concepts::ReceiverOf<CompletionSignatures> R>
417 util::move(receiver));
422 template<
typename Rec,
typename Indices,
typename Seqs>
425 template<
typename Rec,
typename Indices,
typename Seqs>
428 template<
typename Rec,
usize... indices,
typename... Seqs>
440 explicit Type(Rec out_r, Seqs&&... sequences)
441 : m_data(
util::move(out_r))
443 return subscribe(util::forward<Seqs>(sequences),
454 if (self.m_data.stop_source.stop_requested()) {
460 self.m_data.inner_finish_callback = [&self] {
463 if (self.m_data.at_least_one_sequence_stopped()) {
464 return self.m_data.did_complete_outer_stopped();
469 NextRec(util::addressof(self.m_data)));
471 start(*self.m_next_op);
478 [[no_unique_address]] Data m_data;
479 [[no_unique_address]] OpStates m_op_states;
484 template<concepts::Receiver Rec,
typename Indices, concepts::TypeList Seqs>
487 template<
typename... Seqs>
493 template<
typename... Ts>
494 explicit Type(
InPlace, Seqs&&... sequences) : m_sequences(
util::forward<Seqs>(sequences)...) {}
497 template<concepts::RemoveCVRefSameAs<Type> Self,
typename E>
503 template<concepts::RemoveCVRefSameAs<Type> Self, concepts::Receiver Rec>
508 [&](
auto&&... sequences) {
511 util::move(out_r), util::forward<decltype(sequences)>(sequences)...
514 util::forward<Self>(self).m_sequences);
532 requires(
sizeof...(Seqs) > 0)
533 auto operator()(Seqs&&... sequences)
const {
536 "zip() customizations must return a sequence sender");
537 return tag_invoke(*
this, util::forward<Seqs>(sequences)...);
548 requires(
sizeof...(Seqs) > 0)
549 auto operator()(Seqs&&... sequences)
const {
552 "zip_with_variant() customizations must return a sequence sender");
553 return tag_invoke(*
this, util::forward<Seqs>(sequences)...);
Definition function.h:365
Definition in_place_stop_source.h:11
Definition defer_construct.h:8
Definition optional_forward_declaration.h:5
Definition tuple_forward_declaration.h:5
#define DI_IMMOVABLE_NO_UNIQUE_ADDRESS
Definition compiler.h:15
Definition sequence_sender.h:102
Definition sequence_sender.h:128
Definition tag_invoke.h:33
constexpr auto min
Definition min.h:47
meta::AsLanguageFunction< SetValue, meta::Transform< meta::Concat< meta::ValueTypesOf< Sends, Env, meta::List, meta::TypeIdentity >... >, meta::Quote< DecayedRValue > > > ValueCompletion
Definition when_all.h:83
meta::Unique< meta::PushBack< meta::Transform< meta::Concat< meta::ErrorTypesOf< Sends, Env, meta::List >... >, meta::Compose< meta::BindFront< meta::Quote< meta::AsLanguageFunction >, SetError >, meta::Quote< meta::List >, meta::Quote< DecayedRValue > > >, SetStopped()> > NonValueCompletions
Definition when_all.h:75
meta::Type< CompletionSignaturesT< E, Sends... > > Sigs
Definition when_all.h:102
MakeEnv< E, With< Tag< get_stop_token >, sync::InPlaceStopToken > > Env
Definition when_all.h:88
meta::Type< ValueStorageT< Env, Sends... > > ValueStorage
Definition when_all.h:117
meta::AsTemplate< DecayedVariant, meta::Concat< meta::List< NotError, Stopped >, meta::ErrorTypesOf< Sends, Env, meta::List >... > > ErrorStorage
Definition when_all.h:126
constexpr bool never_sends_value
Definition when_all.h:71
meta::Type< OperationStateT< Rec, Indices, Seqs > > OperationState
Definition zip.h:485
meta::Type< InnerReceiverT< index, Data > > InnerReceiver
Definition zip.h:230
meta::Type< InnerNextSenderT< index, meta::RemoveCVRef< Send >, Data > > InnerNextSender
Definition zip.h:291
meta::Type< InnerNextOperationStateT< index, Send, Data, R > > InnerNextOperationState
Definition zip.h:268
meta::Type< NextOperationStateT< Rec, Indices, Seqs, R > > NextOperationState
Definition zip.h:399
meta::Type< NextSenderT< Rec, Indices, Seqs > > NextSender
Definition zip.h:423
meta::Type< ReceiverT< index, Seq, Data > > Receiver
Definition zip.h:324
meta::Type< SequenceT< meta::RemoveCVRef< Seqs >... > > Sequence
Definition zip.h:528
constexpr bool never_sends_value
Definition when_all.h:71
meta::Type< NextReceiverT< Rec, Indices, Seqs > > NextReceiver
Definition zip.h:347
meta::Type< OuterDataT< Rec, Sends... > > OuterData
Definition zip.h:201
constexpr auto set_error
Definition set_error.h:14
constexpr auto set_next
Set the next sender of a sequence.
Definition sequence_sender.h:77
constexpr auto into_variant_each
Transform the values of a sequence into a variant.
Definition into_variant_each.h:33
constexpr auto stopped
Definition just.h:91
constexpr auto empty_sequence
A sequence sender that completes immediately without ever sending a value.
Definition empty_sequence.h:56
constexpr auto start
Definition start.h:20
constexpr auto make_env
Create an environment with overrides for queries.
Definition make_env.h:147
constexpr auto set_stopped
Definition set_stopped.h:14
constexpr auto get_sequence_cardinality
A query that returns the cardinality of a sequence.
Definition get_sequence_cardinality.h:45
constexpr auto with
Specify an override for an environment query.
Definition make_env.h:112
constexpr auto subscribe
Subscribe a receiver to a sequence.
Definition sequence_sender.h:234
constexpr auto is_always_lockstep_sequence
A query that returns whether or not a sequence is always lockstep.
Definition is_always_lockstep_sequence.h:53
constexpr auto get_stop_token
Definition get_stop_token.h:25
constexpr auto into_lockstep_sequence
Converts a sequence into a lockstep sequence.
Definition into_lockstep_sequence.h:47
constexpr auto get_env
Definition get_env.h:27
constexpr auto connect
Definition connect.h:42
constexpr auto zip_with_variant
Zip multiple sequences together, allowing them to send different types of values.
Definition zip.h:597
constexpr auto set_value
Definition set_value.h:14
constexpr auto zip
Zip multiple sequences together.
Definition zip.h:583
@ Relaxed
Definition memory_order.h:7
@ AcquireRelease
Definition memory_order.h:11
size_t usize
Definition integers.h:33
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
void unreachable()
Definition unreachable.h:4
constexpr auto tuple_cat(Tups &&... tuples)
Definition tuple_cat.h:11
constexpr auto tie
Definition tie.h:15
constexpr auto apply(F &&f, Tup &&tuple) -> decltype(detail::apply_impl(meta::MakeIndexSequence< meta::TupleSize< Tup > > {}, util::forward< F >(f), util::forward< Tup >(tuple)))
Definition apply.h:22
constexpr auto visit(Vis &&visitor, Vars &&... variants) -> R
Definition visit.h:39
constexpr void tuple_for_each(F &&function, Tup &&tuple)
Definition tuple_for_each.h:22
constexpr auto holds_alternative
Definition holds_alternative.h:21
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
constexpr auto c_
A value of type Constexpr<val>.
Definition constexpr.h:252
constexpr auto data
Definition data.h:51
constexpr auto in_place
Definition in_place.h:8
constexpr auto empty_env
Definition empty_env.h:6
Defines the sequence sender concepts and related CPOs.
Definition sequence_sender.h:86
Definition set_stopped.h:6
Definition when_all.h:122
Definition when_all.h:130
Definition when_all.h:123
InnerReceiver< index, Data > InnerRec
Definition zip.h:236
friend void tag_invoke(Tag< start >, Type &self)
Definition zip.h:245
meta::ConnectResult< Send, InnerRec > Op
Definition zip.h:237
Type(Data *data, Send &&sender, R receiver)
Definition zip.h:239
friend auto tag_invoke(Tag< connect >, Type &&self, R receiver)
Definition zip.h:281
Data * data
Definition zip.h:277
void is_sender
Definition zip.h:273
types::CompletionSignatures< SetValue(), SetStopped()> CompletionSignatures
Definition zip.h:275
Send sender
Definition zip.h:278
friend auto tag_invoke(Tag< get_env >, Type const &self)
Definition zip.h:286
Data * data
Definition zip.h:208
friend void tag_invoke(Tag< set_error >, Type &&self, E &&error)
Definition zip.h:216
friend void tag_invoke(Tag< set_stopped >, Type &&self)
Definition zip.h:220
void is_receiver
Definition zip.h:206
friend void tag_invoke(Tag< set_value >, Type &&self, Types &&... values)
Definition zip.h:211
friend auto tag_invoke(Tag< get_env >, Type const &self)
Definition zip.h:222
friend void tag_invoke(Tag< start >, Type &self)
Definition zip.h:357
Type(OuterData< Rec, Seqs... > *data, R receiver)
Definition zip.h:355
friend void tag_invoke(Tag< set_stopped >, Type &&self)
Definition zip.h:337
void is_receiver
Definition zip.h:332
friend void tag_invoke(Tag< set_value >, Type &&self)
Definition zip.h:336
OuterData< Rec, Seqs... > * data
Definition zip.h:334
friend auto tag_invoke(Tag< get_env >, Type const &self)
Definition zip.h:339
void is_sender
Definition zip.h:408
friend auto tag_invoke(Tag< connect >, Type &&self, R receiver)
Definition zip.h:415
OuterData< Rec, Seqs... > * data
Definition zip.h:412
Sigs< meta::EnvOf< Rec >, Seqs... > CompletionSignatures
Definition zip.h:410
Type(Rec out_r, Seqs &&... sequences)
Definition zip.h:440
friend void tag_invoke(Tag< start >, Type &self)
Definition zip.h:448
vocab::Tuple< meta::SubscribeResult< Seqs, Receiver< indices, Seqs, Data > >... > OpStates
Definition zip.h:433
OuterData< Rec, Seqs... > Data
Definition zip.h:432
NextReceiver< Rec, meta::ListV< indices... >, meta::List< Seqs... > > NextRec
Definition zip.h:437
NextSender< Rec, meta::ListV< indices... >, meta::List< Seqs... > > ItemSend
Definition zip.h:435
meta::NextSenderOf< Rec, ItemSend > OutSend
Definition zip.h:436
meta::ConnectResult< OutSend, NextRec > NextOp
Definition zip.h:438
StopToken::template CallbackType< StopCallbackFunction > StopCallback
Definition zip.h:62
void report_inner_error(E &&error)
Definition zip.h:97
vocab::Optional< StopCallback > stop_callback
Definition zip.h:196
void finish_one_inner()
Definition zip.h:115
void report_outer_error(E &&error)
Definition zip.h:129
Error outer_error
Definition zip.h:190
usize Count
Definition zip.h:60
void did_complete_outer_stopped()
Definition zip.h:66
ValueStorage< Env, Seqs... > Value
Definition zip.h:58
ErrorStorage< Env, Seqs... > Error
Definition zip.h:59
Error inner_error
Definition zip.h:184
Type(Rec outer_out_r_)
Definition zip.h:64
sync::Atomic< bool > outer_failed
Definition zip.h:193
void did_complete(bool stopped)
Definition zip.h:69
void finish_one_outer()
Definition zip.h:151
vocab::Array< function::Function< void(bool)>, sizeof...(Seqs)> inner_complete_callbacks
Definition zip.h:187
Rec outer_out_r
Definition zip.h:191
void report_outer_stop()
Definition zip.h:140
void report_outer_value()
Definition zip.h:122
sync::InPlaceStopSource stop_source
Definition zip.h:195
void did_complete_outer_value()
Definition zip.h:67
auto at_least_one_sequence_stopped() const -> bool
Definition zip.h:177
sync::Atomic< bool > inner_failed
Definition zip.h:186
meta::StopTokenOf< Env > StopToken
Definition zip.h:61
void report_inner_value(Constexpr< index >, Types &&... values)
Definition zip.h:86
function::Function< void()> inner_finish_callback
Definition zip.h:188
Value inner_value
Definition zip.h:183
void report_inner_stop()
Definition zip.h:106
sync::Atomic< Count > inner_remaining
Definition zip.h:185
meta::EnvOf< Rec > Env
Definition zip.h:57
sync::Atomic< Count > outer_remaining
Definition zip.h:192
void is_receiver
Definition zip.h:296
Data * data
Definition zip.h:298
friend void tag_invoke(Tag< set_error >, Type &&self, E &&error)
Definition zip.h:303
friend void tag_invoke(Tag< set_stopped >, Type &&self)
Definition zip.h:307
friend auto tag_invoke(Tag< set_next >, Type &self, Send &&sender)
Definition zip.h:312
InnerReceiver< index, Data > NextRec
Definition zip.h:309
friend void tag_invoke(Tag< set_value >, Type &&self)
Definition zip.h:300
friend auto tag_invoke(Tag< get_env >, Type const &self)
Definition zip.h:316
friend auto tag_invoke(Tag< get_completion_signatures >, Self &&, E &&) -> Sigs< E, meta::Like< Self, Seqs >... >
Definition zip.h:499
friend auto tag_invoke(Tag< get_env >, Type const &)
Definition zip.h:517
friend auto tag_invoke(Tag< subscribe >, Self &&self, Rec out_r)
Definition zip.h:506
SequenceTag is_sender
Definition zip.h:491
Type(InPlace, Seqs &&... sequences)
Definition zip.h:494
auto operator()() const
Definition zip.h:559
Definition completion_signuatures.h:7
Definition span_fixed_size.h:37