Iros
 
Loading...
Searching...
No Matches
sequence_sender.h
Go to the documentation of this file.
1#pragma once
2
25#include "di/function/invoke.h"
27#include "di/meta/algorithm.h"
28#include "di/meta/core.h"
31#include "di/util/declval.h"
32#include "di/util/immovable.h"
33#include "di/util/move.h"
34
40
41namespace di::concepts {
49template<typename Sender, typename Env = types::EmptyEnv>
50concept NextSender =
54}
55
56namespace di::execution {
57namespace set_next_ns {
58 struct Function {
59 template<concepts::Receiver Rec, concepts::Sender Send>
61 auto operator()(Rec& receiver, Send&& sender) const {
63 "The return value of execution::set_next() must model di::concepts::NextSender.");
64 return function::tag_invoke(*this, receiver, util::forward<Send>(sender));
65 }
66 };
67}
68
77constexpr inline auto set_next = set_next_ns::Function {};
78}
79
80namespace di::meta {
81template<typename Rec, typename Send>
83}
84
85namespace di::execution {
86struct SequenceTag {};
87
88template<typename S>
89constexpr inline bool enable_sequence_sender = false;
90
91template<typename S>
92requires(requires { typename S::is_sender; } && concepts::SameAs<SequenceTag, typename S::is_sender>)
93constexpr inline bool enable_sequence_sender<S> = true;
94
95template<typename S>
97constexpr inline bool enable_sequence_sender<S> = true;
98}
99
100namespace di::concepts {
101template<typename Send>
103
104template<typename Send, typename Env = types::EmptyEnv>
106}
107
112
113template<concepts::ValidCompletionSignatures Sigs>
115 using is_sender = void;
116
118
120};
121
122template<concepts::ValidCompletionSignatures Sigs>
123constexpr inline auto dummy_sender_of = DummySenderOf<Sigs> {};
124}
125
126namespace di::concepts {
127template<typename Rec, typename Sigs>
132}
133
135template<typename Rec>
136struct ReceiverT {
137 struct Type {
138 using is_receiver = void;
139
142
143 [[no_unique_address]] Rec receiver;
144
147 {
148 execution::set_value(util::move(self.receiver));
149 }
150
154 {
156 execution::set_value(util::move(self.receiver));
157 } else {
158 concepts::StoppableToken auto token = get_stop_token(get_env(self.receiver));
159 if (token.stop_requested()) {
160 execution::set_stopped(util::move(self.receiver));
161 } else {
162 execution::set_value(util::move(self.receiver));
163 }
164 }
165 }
166
167 friend auto tag_invoke(types::Tag<get_env>, Type const& self) { return make_env(get_env(self.receiver)); }
168 };
169};
170
171template<concepts::Receiver Rec>
173}
174
175namespace di::meta {
176template<typename Send, typename Env>
180}
181
182namespace di::concepts {
183namespace detail {
184 template<typename Rec, typename Send>
190}
191
192template<typename Rec, typename Send>
198}
199
200namespace di::execution {
201namespace subscribe_ns {
202 struct Function {
203 template<concepts::Receiver Rec, concepts::SenderIn<meta::EnvOf<Rec>> Seq>
207 auto operator()(Seq&& sequence, Rec&& receiver) const {
209 return connect(
210 set_next(receiver, util::forward<Seq>(sequence)),
211 execution::sender_to_sequence_adaptor_ns::Receiver<Rec> { util::forward<Rec>(receiver) });
213 static_assert(
215 "The return value of di::execution::subscribe() must model di::concepts::OperationState.");
216 return function::tag_invoke(*this, util::forward<Seq>(sequence), util::forward<Rec>(receiver));
217 } else if constexpr (!concepts::SequenceSender<Seq>) {
218 return connect(
219 set_next(receiver, util::forward<Seq>(sequence)),
220 execution::sender_to_sequence_adaptor_ns::Receiver<Rec> { util::forward<Rec>(receiver) });
221 } else {
222 return function::tag_invoke(*this, util::forward<Seq>(sequence), util::forward<Rec>(receiver));
223 }
224 }
225 };
226}
227
234constexpr inline auto subscribe = subscribe_ns::Function {};
235}
236
237namespace di::meta {
238template<typename Send, typename Rec>
240}
241
242namespace di::concepts {
243template<typename Send, typename Rec>
245 SequenceSenderIn<Send, Rec> && SubscriberFrom<Rec, Send> && requires(Send&& sender, Rec&& receiver) {
246 execution::subscribe(util::forward<Send>(sender), util::forward<Rec>(receiver));
247 };
248}
249
250namespace di {
252}
Definition async_range.h:61
Check the given environment is a debug environment.
Definition is_debug_env.h:49
Definition invoke.h:58
A sender that can be returned from di::execution::set_next().
Definition sequence_sender.h:50
Definition operation_state.h:9
Definition receiver_of.h:25
Definition receiver.h:10
Definition core.h:114
Definition sender_in.h:10
Definition sender_to.h:11
Definition sender.h:11
Definition sequence_sender.h:105
Definition sequence_sender.h:244
Definition sequence_sender.h:102
Definition stoppable_token.h:13
Definition sequence_sender.h:193
Definition sequence_sender.h:128
Definition tag_invoke.h:33
Definition unstoppable_token.h:7
Definition sequence_sender.h:185
Definition any_storable.h:9
Definition sequence_sender.h:108
constexpr auto dummy_sender_of
Definition sequence_sender.h:123
Definition sequence_sender.h:134
meta::Type< ReceiverT< meta::RemoveCVRef< Rec > > > Receiver
Definition sequence_sender.h:172
Definition sequence_sender.h:57
Definition sequence_sender.h:201
Definition bulk.h:30
constexpr bool enable_sequence_sender
Definition sequence_sender.h:89
constexpr auto set_next
Set the next sender of a sequence.
Definition sequence_sender.h:77
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 subscribe
Subscribe a receiver to a sequence.
Definition sequence_sender.h:234
constexpr auto get_stop_token
Definition get_stop_token.h:25
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
Definition json_deserializer.h:532
Definition merge_interfaces.h:6
meta::RemoveCVRef< decltype(execution::get_stop_token(util::declval< T >()))> StopTokenOf
Definition stop_token_of.h:7
T::Type Type
Definition core.h:26
RemoveCV< RemoveReference< T > > RemoveCVRef
Definition core.h:74
constexpr usize Size
Definition list.h:106
Type< detail::AsListHelper< T > > AsList
Definition algorithm.h:48
meta::MakeCompletionSignatures< Send, Env, types::CompletionSignatures< execution::SetValue()>, meta::TypeConstant< types::CompletionSignatures<> >::template Invoke > SequenceCompletionSignaturesOf
Definition sequence_sender.h:177
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
decltype(execution::set_next(util::declval< meta::RemoveCVRef< Rec > & >(), util::declval< Send >())) NextSenderOf
Definition sequence_sender.h:82
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
Type< detail::ConcatHelper< Lists... > > Concat
Definition algorithm.h:80
Type< Defer< Fun::template Invoke, Args... > > Invoke
Definition function.h:43
decltype(execution::get_env(util::declval< T >())) EnvOf
Definition env_of.h:8
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
Definition zstring_parser.h:9
constexpr auto sequence
Definition sequence.h:34
Definition sequence_sender.h:86
Definition set_stopped.h:6
Definition set_value.h:6
Definition sequence_sender.h:109
friend void tag_invoke(types::Tag< execution::start >, DummyOperationState &)
Definition sequence_sender.h:110
Definition sequence_sender.h:114
void is_sender
Definition sequence_sender.h:115
Sigs CompletionSignatures
Definition sequence_sender.h:117
friend auto tag_invoke(types::Tag< execution::connect >, DummySenderOf, auto &&) -> DummyOperationState
Definition sequence_sender.h:119
meta::StopTokenOf< Env > StopToken
Definition sequence_sender.h:141
friend void tag_invoke(types::Tag< set_stopped >, Type &&self)
Definition sequence_sender.h:151
friend void tag_invoke(types::Tag< set_value >, Type &&self)
Definition sequence_sender.h:145
friend auto tag_invoke(types::Tag< get_env >, Type const &self)
Definition sequence_sender.h:167
meta::EnvOf< Rec > Env
Definition sequence_sender.h:140
Definition sequence_sender.h:58
Definition sequence_sender.h:202
Definition core.h:5
Definition core.h:18
Definition completion_signuatures.h:7
Definition immovable.h:4