Iros
 
Loading...
Searching...
No Matches
ignore_all.h
Go to the documentation of this file.
1#pragma once
2
26#include "di/meta/algorithm.h"
27#include "di/meta/core.h"
28#include "di/meta/util.h"
30#include "di/sync/atomic.h"
32#include "di/util/addressof.h"
33#include "di/util/immovable.h"
34#include "di/util/unreachable.h"
36
37namespace di::execution {
38namespace ignore_all_ns {
39 template<typename T>
41
42 template<typename Env, typename Seq>
43 constexpr bool sends_stopped =
45
46 template<typename... Types>
48
49 struct NotError {};
50 struct Stopped {};
51
52 template<typename Env, typename Seq>
58
59 template<typename Seq, typename Rec>
60 struct DataT {
61 struct Type {
65
66 explicit Type(Rec receiver_)
67 : receiver(util::move(receiver_)), stop_token(get_stop_token(get_env(receiver))) {}
68
69 template<typename E>
70 void report_error(E&& error) {
71 auto old = failed.exchange(true, sync::MemoryOrder::AcquireRelease);
72 if (!old) {
73 this->error.template emplace<meta::Decay<E>>(util::forward<E>(error));
74 }
75 }
76
77 void report_stop() {
78 auto old = failed.exchange(true, sync::MemoryOrder::AcquireRelease);
79 if (!old) {
80 this->error.template emplace<Stopped>();
81 }
82 }
83
84 void finish() {
85 auto did_fail = failed.load(sync::MemoryOrder::Acquire);
86 if (!did_fail) {
87 return set_value(util::move(receiver));
88 }
89
91 [&]<typename E>(E&& error) {
93 return set_stopped(util::move(receiver));
94 } else if constexpr (concepts::SameAs<meta::Decay<E>, NotError>) {
96 } else {
97 return set_error(util::move(receiver), util::forward<E>(error));
98 }
99 },
100 util::move(error));
101 }
102
103 [[no_unique_address]] Rec receiver;
104 [[no_unique_address]] StopToken stop_token;
107 };
108 };
109
110 template<concepts::Sender Seq, concepts::Receiver Rec>
112
113 template<typename Seq, typename Rec, typename Next, typename NextRec>
114 struct NextDataT {
115 struct Type {
116 [[no_unique_address]] NextRec next_receiver;
117 };
118 };
119
120 template<concepts::Sender Seq, concepts::Receiver Rec, concepts::Sender Next, concepts::Receiver NextRec>
122
123 template<typename Seq, typename Rec, typename Next, typename NextRec>
125 struct Type : ReceiverAdaptor<Type> {
126 private:
127 using Base = ReceiverAdaptor<Type>;
128 friend Base;
129
130 public:
132 : m_next_data(next_data), m_data(data) {}
133
134 auto base() const& -> NextRec const& { return m_next_data->next_receiver; }
135 auto base() && -> NextRec&& { return util::move(m_next_data->next_receiver); }
136
137 private:
138 void set_value(auto&&...) && {
139 if (m_data->stop_token.stop_requested()) {
140 execution::set_stopped(util::move(*this).base());
141 } else {
142 execution::set_value(util::move(*this).base());
143 }
144 }
145
146 template<typename E>
147 void set_error(E&& error) && {
148 m_data->report_error(util::forward<E>(error));
149 execution::set_stopped(util::move(*this).base());
150 }
151
152 void set_stopped() && {
153 m_data->report_stop();
154 execution::set_stopped(util::move(*this).base());
155 }
156
158 Data<Seq, Rec>* m_data;
159 };
160 };
161
162 template<concepts::Sender Seq, concepts::Receiver Rec, concepts::Sender Next, concepts::Receiver NextRec>
164
165 template<typename Seq, typename Rec, typename Next, typename NextRec>
169
170 explicit Type(Data<Seq, Rec>* data, Next&& next_sender, NextRec next_receiver)
171 : m_next_data(util::move(next_receiver))
172 , m_operation(connect(util::forward<Next>(next_sender),
173 NextReceiver<Seq, Rec, Next, NextRec>(util::addressof(m_next_data), data))) {}
174
175 private:
176 friend void tag_invoke(types::Tag<start>, Type& self) { start(self.m_operation); }
177
178 [[no_unique_address]] NextData<Seq, Rec, Next, NextRec> m_next_data;
180 };
181 };
182
183 template<concepts::Sender Seq, concepts::Receiver Rec, concepts::Sender Next, concepts::Receiver NextRec>
185
186 template<typename Next, typename Env>
191
192 template<typename Seq, typename Rec, typename Next>
193 struct NextSenderT {
194 struct Type {
195 using is_sender = void;
196
197 [[no_unique_address]] Next next;
199
200 template<concepts::RemoveCVRefSameAs<Type> Self, typename NextRec>
202 friend auto tag_invoke(types::Tag<connect>, Self&& self, NextRec receiver) {
204 self.data, di::forward_like<Self>(self.next), util::move(receiver));
205 }
206
207 template<concepts::RemoveCVRefSameAs<Type> Self, typename Env>
210 return {};
211 }
212
213 constexpr friend auto tag_invoke(types::Tag<get_env>, Type const& self) {
214 return make_env(get_env(self.next));
215 }
216 };
217 };
218
219 template<concepts::Sender Seq, concepts::Receiver Rec, concepts::Sender Next>
221
222 template<typename Seq, typename Rec>
223 struct ReceiverT {
224 struct Type : ReceiverAdaptor<Type> {
225 private:
226 using Base = ReceiverAdaptor<Type>;
227 friend Base;
228
229 public:
230 explicit Type(Data<Seq, Rec>* data) : m_data(data) {}
231
232 auto base() const& -> Rec const& { return m_data->receiver; }
233 auto base() && -> Rec&& { return util::move(m_data->receiver); }
234
235 private:
236 void set_value() && { m_data->finish(); }
237
238 template<concepts::Sender Next>
239 auto set_next(Next&& next) & {
240 return NextSender<Seq, Rec, meta::RemoveCVRef<Next>>(util::forward<Next>(next), m_data);
241 }
242
243 Data<Seq, Rec>* m_data;
244 };
245 };
246
247 template<concepts::Sender Seq, concepts::Receiver Rec>
249
250 template<typename Seq, typename Rec>
253 public:
255
256 explicit Type(Seq&& sender, Rec receiver)
257 : m_data(util::move(receiver))
258 , m_operation(subscribe(util::forward<Seq>(sender), Receiver<Seq, Rec>(util::addressof(m_data)))) {}
259
260 private:
261 friend void tag_invoke(types::Tag<start>, Type& self) { start(self.m_operation); }
262
263 [[no_unique_address]] Data<Seq, Rec> m_data;
265 };
266 };
267
268 template<concepts::Sender Seq, concepts::Receiver Rec>
270
271 template<typename Err>
273
274 template<typename Seq, typename Env>
279
280 template<typename Seq>
281 struct SenderT {
282 struct Type {
283 using is_sender = void;
284
285 [[no_unique_address]] Seq sequence;
286
287 template<concepts::RemoveCVRefSameAs<Type> Self, typename Rec>
289 friend auto tag_invoke(types::Tag<connect>, Self&& self, Rec receiver) {
290 return OperationState<meta::Like<Self, Seq>, Rec>(util::forward<Self>(self).sequence,
291 util::move(receiver));
292 }
293
294 template<concepts::RemoveCVRefSameAs<Type> Self, typename Env>
297 return {};
298 }
299
300 constexpr friend auto tag_invoke(types::Tag<get_env>, Type const& self) {
301 return make_env(get_env(self.sequence));
302 }
303 };
304 };
305
306 template<concepts::Sender Seq>
308
310 template<concepts::Sender Seq>
311 auto operator()(Seq&& sequence) const -> concepts::Sender auto {
313 return function::tag_invoke(*this, util::forward<Seq>(sequence));
314 } else {
315 return Sender<Seq> { util::forward<Seq>(sequence) };
316 }
317 }
318 };
319}
320
334constexpr inline auto ignore_all = ignore_all_ns::Function {};
335}
Definition atomic.h:15
Definition variant_forward_declaration.h:6
#define DI_IMMOVABLE_NO_UNIQUE_ADDRESS
Definition compiler.h:15
Definition receiver_of.h:25
Definition core.h:114
Definition sender.h:11
Definition tag_invoke.h:33
Definition ignore_all.h:38
meta::MakeCompletionSignatures< Seq, Env, types::CompletionSignatures< SetValue()>, meta::TypeConstant< types::CompletionSignatures<> >::template Invoke, ErrorsWithStopped > Completions
Definition ignore_all.h:275
meta::Decay< T > && DecayedRValue
Definition ignore_all.h:40
meta::Type< NextSenderT< Seq, Rec, Next > > NextSender
Definition ignore_all.h:220
meta::Type< NextDataT< Seq, Rec, Next, NextRec > > NextData
Definition ignore_all.h:121
meta::Type< NextReceiverT< Seq, Rec, Next, NextRec > > NextReceiver
Definition ignore_all.h:163
types::CompletionSignatures< SetStopped(), SetError(DecayedRValue< Err >)> ErrorsWithStopped
Definition ignore_all.h:272
meta::Type< SenderT< meta::RemoveCVRef< Seq > > > Sender
Definition ignore_all.h:307
vocab::Variant< meta::Decay< Types >... > DecayedVariant
Definition ignore_all.h:47
meta::MakeCompletionSignatures< Next, Env, types::CompletionSignatures< SetValue()>, meta::TypeConstant< types::CompletionSignatures<> >::template Invoke, meta::TypeConstant< types::CompletionSignatures< SetStopped()> >::template Invoke > NextSignatures
Definition ignore_all.h:187
meta::Type< ReceiverT< Seq, Rec > > Receiver
Definition ignore_all.h:248
meta::Type< OperationStateT< Seq, Rec > > OperationState
Definition ignore_all.h:269
meta::Type< DataT< Seq, Rec > > Data
Definition ignore_all.h:111
constexpr bool sends_stopped
Definition ignore_all.h:43
meta::AsTemplate< DecayedVariant, meta::Unique< meta::Concat< meta::Conditional< sends_stopped< Env, Seq >, meta::List< NotError, Stopped >, meta::List< NotError > >, meta::ErrorTypesOf< Seq, Env, meta::List > > > > ErrorStorage
Definition ignore_all.h:53
meta::Type< NextOperationStateT< Seq, Rec, Next, NextRec > > NextOperationState
Definition ignore_all.h:184
Definition bulk.h:30
constexpr auto set_error
Definition set_error.h:14
constexpr auto ignore_all
Adapt a sequence sender to a regular sender of void, ignoring the sequence's values.
Definition ignore_all.h:334
constexpr auto set_next
Set the next sender of a sequence.
Definition sequence_sender.h:77
constexpr auto start
Definition start.h:20
constexpr auto make_env
Create an environment with overrides for queries.
Definition make_env.h:147
meta::Type< receiver_interface_ns::ReceiverAdaptor< Self, Base > > ReceiverAdaptor
Definition receiver_adaptor.h:236
constexpr auto set_stopped
Definition set_stopped.h:14
constexpr auto subscribe
Subscribe a receiver to a sequence.
Definition sequence_sender.h:234
constexpr auto next
Get the next value of a async range in a coroutine.
Definition async_range.h:52
constexpr auto get_stop_token
Definition get_stop_token.h:25
decltype(make_env(util::declval< BaseEnv >(), util::declval< Withs >()...)) MakeEnv
Represent an environment with overrides for queries.
Definition make_env.h:189
constexpr auto get_env
Definition get_env.h:27
constexpr auto connect
Definition connect.h:42
constexpr auto set_value
Definition set_value.h:14
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
meta::RemoveCVRef< decltype(execution::get_stop_token(util::declval< T >()))> StopTokenOf
Definition stop_token_of.h:7
detail::ConditionalHelper< value, T, U >::Type Conditional
Definition core.h:88
T::Type Type
Definition core.h:26
Type< detail::AsTemplateHelper< Template, T > > AsTemplate
Definition algorithm.h:60
Conditional< concepts::LanguageArray< RemoveReference< T > >, RemoveExtent< RemoveReference< T > > *, Conditional< concepts::LanguageFunction< RemoveReference< T > >, AddPointer< RemoveReference< T > >, RemoveCVRef< T > > > Decay
Definition language.h:574
constexpr usize Size
Definition list.h:106
decltype(execution::subscribe(util::declval< Send >(), util::declval< Rec >())) SubscribeResult
Definition sequence_sender.h:239
Fold< Lst, List<>, detail::PushBackIfUnique > Unique
Definition algorithm.h:203
Type< detail::MakeCompletionSignaturesHelper< ExtraSigs, meta::ValueTypesOf< Send, Env, SetValue, meta::List >, meta::Transform< meta::ErrorTypesOf< Send, Env, meta::List >, meta::Quote< SetError > >, meta::Conditional< meta::sends_stopped< Send, Env >, SetStopped, types::CompletionSignatures<> > > > MakeCompletionSignatures
Definition make_completion_signatures.h:36
GatherSignatures< execution::SetError, Sender, Env, meta::TypeIdentity, Var > ErrorTypesOf
Definition error_types_of.h:13
Type< detail::ConcatHelper< Lists... > > Concat
Definition algorithm.h:80
decltype(execution::get_env(util::declval< T >())) EnvOf
Definition env_of.h:8
decltype(execution::connect(util::declval< Send >(), util::declval< Rec >())) ConnectResult
Definition connect_result.h:7
constexpr bool sends_stopped
Definition sends_stopped.h:13
@ AcquireRelease
Definition memory_order.h:11
@ Acquire
Definition memory_order.h:9
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition vocab.h:96
void unreachable()
Definition unreachable.h:4
constexpr auto visit(Vis &&visitor, Vars &&... variants) -> R
Definition visit.h:39
constexpr auto forward_like(U &&value) -> decltype(auto)
Definition forward_like.h:8
constexpr auto sequence
Definition sequence.h:34
constexpr auto data
Definition data.h:51
Defines the sequence sender concepts and related CPOs.
Definition set_error.h:6
Definition set_stopped.h:6
Definition set_value.h:6
Rec receiver
Definition ignore_all.h:103
void report_stop()
Definition ignore_all.h:77
Error error
Definition ignore_all.h:105
Type(Rec receiver_)
Definition ignore_all.h:66
meta::StopTokenOf< Env > StopToken
Definition ignore_all.h:64
void finish()
Definition ignore_all.h:84
void report_error(E &&error)
Definition ignore_all.h:70
sync::Atomic< bool > failed
Definition ignore_all.h:106
meta::EnvOf< Rec > Env
Definition ignore_all.h:62
StopToken stop_token
Definition ignore_all.h:104
ErrorStorage< Env, Seq > Error
Definition ignore_all.h:63
Definition ignore_all.h:60
Definition ignore_all.h:309
auto operator()(Seq &&sequence) const -> concepts::Sender auto
Definition ignore_all.h:311
NextRec next_receiver
Definition ignore_all.h:116
Definition ignore_all.h:114
friend void tag_invoke(types::Tag< start >, Type &self)
Definition ignore_all.h:176
Type(Data< Seq, Rec > *data, Next &&next_sender, NextRec next_receiver)
Definition ignore_all.h:170
meta::ConnectResult< Next, NextReceiver< Seq, Rec, Next, NextRec > > Op
Definition ignore_all.h:168
auto base() const &-> NextRec const &
Definition ignore_all.h:134
Type(NextData< Seq, Rec, Next, NextRec > *next_data, Data< Seq, Rec > *data)
Definition ignore_all.h:131
auto base() &&-> NextRec &&
Definition ignore_all.h:135
Next next
Definition ignore_all.h:197
Data< Seq, Rec > * data
Definition ignore_all.h:198
void is_sender
Definition ignore_all.h:195
friend auto tag_invoke(types::Tag< get_completion_signatures >, Self &&, Env &&) -> NextSignatures< meta::Like< Self, Next >, Env >
Definition ignore_all.h:208
constexpr friend auto tag_invoke(types::Tag< get_env >, Type const &self)
Definition ignore_all.h:213
friend auto tag_invoke(types::Tag< connect >, Self &&self, NextRec receiver)
Definition ignore_all.h:202
Definition ignore_all.h:49
friend void tag_invoke(types::Tag< start >, Type &self)
Definition ignore_all.h:261
Type(Seq &&sender, Rec receiver)
Definition ignore_all.h:256
meta::SubscribeResult< Seq, Receiver< Seq, Rec > > Op
Definition ignore_all.h:254
auto base() const &-> Rec const &
Definition ignore_all.h:232
Type(Data< Seq, Rec > *data)
Definition ignore_all.h:230
auto base() &&-> Rec &&
Definition ignore_all.h:233
Definition ignore_all.h:223
friend auto tag_invoke(types::Tag< connect >, Self &&self, Rec receiver)
Definition ignore_all.h:289
void is_sender
Definition ignore_all.h:283
constexpr friend auto tag_invoke(types::Tag< get_env >, Type const &self)
Definition ignore_all.h:300
friend auto tag_invoke(types::Tag< get_completion_signatures >, Self &&, Env &&) -> Completions< meta::Like< Self, Seq >, MakeEnv< Env > >
Definition ignore_all.h:295
Seq sequence
Definition ignore_all.h:285
Definition ignore_all.h:281
Definition ignore_all.h:50
Definition core.h:5
Definition core.h:18
Definition completion_signuatures.h:7
Definition immovable.h:4