Iros
 
Loading...
Searching...
No Matches
schedule_from.h
Go to the documentation of this file.
1#pragma once
2
11
12namespace di::execution {
14 template<typename Rec, typename Sched, typename Completions>
16 struct Type;
17 };
18
19 template<concepts::Receiver Rec, concepts::Scheduler Sched, concepts::InstanceOf<CompletionSignatures> Completions>
21
22 template<typename Rec, typename Sched, typename Completions>
23 struct DataT {
24 struct Type {
25 private:
26 using List = meta::AsList<Completions>;
27 using Tags =
28 meta::Transform<List,
34
35 using OpState3 =
37
38 public:
39 explicit Type(Sched sch_, Rec out_r_) : sch(util::move(sch_)), out_r(util::move(out_r_)) {}
40
41 [[no_unique_address]] Sched sch;
42 [[no_unique_address]] Rec out_r;
43 [[no_unique_address]] ArgsStorage args {};
44 [[no_unique_address]] Optional<OpState3> op_state3 {};
45
46 template<concepts::OneOf<SetValue, SetError, SetStopped> Tag, concepts::DecayConstructible... Args,
47 typename Tup = meta::DecayedTuple<Tag, Args...>>
50 void phase2(Tag tag, Args&&... values) {
51 args.template emplace<Tup>(tag, util::forward<Args>(values)...);
52
53 auto& op_state = op_state3.emplace(util::DeferConstruct([&] {
56 }));
57
58 execution::start(op_state);
59 }
60 };
61 };
62
63 template<concepts::Receiver Rec, concepts::Scheduler Sched, concepts::InstanceOf<CompletionSignatures> Completions>
65
66 template<typename Rec, typename Sched, typename Completions>
67 struct ScheduleReceiverT<Rec, Sched, Completions>::Type : ReceiverAdaptor<Type> {
69 friend Base;
70
71 public:
73
74 auto base() const& -> Rec const& { return m_data->out_r; }
75 auto base() && -> Rec&& { return util::move(m_data->out_r); }
76
77 private:
78 void set_value() && {
79 visit(
80 [&]<typename T>(T&& value) {
81 apply(
82 [&]<typename... Args>(auto tag, Args&&... args) {
83 if constexpr (concepts::SameAs<decltype(tag), Void>) {
84 DI_ASSERT(false);
85 } else {
86 tag(util::move(m_data->out_r), util::forward<Args>(args)...);
87 }
88 },
89 util::forward<T>(value));
90 },
91 util::move(m_data->args));
92 }
93
95 };
96
97 template<typename Rec, typename Sched, typename Completions>
98 struct ReceiverT {
99 struct Type : ReceiverAdaptor<Type> {
101 friend Base;
102
103 public:
105
106 auto base() const& -> Rec const& { return m_data->out_r; }
107 auto base() && -> Rec&& { return util::move(m_data->out_r); }
108
109 private:
110 template<typename... Args>
111 requires(requires {
113 })
114 void set_value(Args&&... args) && {
115 return m_data->phase2(SetValue {}, util::forward<Args>(args)...);
116 }
117
118 template<typename Error>
119 requires(requires {
121 })
122 void set_error(Error&& error) && {
123 return m_data->phase2(SetError {}, util::forward<Error>(error));
124 }
125
126 void set_stopped() && requires(requires {
127 util::declval<Data<Rec, Sched, Completions>&>().phase2(SetStopped {});
128 }) { return m_data->phase2(SetStopped {}); }
129
131 };
132 };
133
134 template<concepts::Receiver Rec, concepts::Scheduler Sched, concepts::InstanceOf<CompletionSignatures> Completions>
136
137 template<typename Send, typename Rec, typename Sched>
140 private:
142
144
145 public:
146 template<typename S>
147 explicit Type(Sched scheduler, Rec receiver, S&& sender)
148 : m_data(util::move(scheduler), util::move(receiver))
149 , m_op_state2(execution::connect(util::forward<S>(sender),
150 Receiver<Rec, Sched, Completions> { util::addressof(m_data) })) {}
151
152 private:
153 friend void tag_invoke(types::Tag<execution::start>, Type& self) { execution::start(self.m_op_state2); }
154
155 [[no_unique_address]] Data<Rec, Sched, Completions> m_data;
156 DI_IMMOVABLE_NO_UNIQUE_ADDRESS OpState2 m_op_state2;
157 };
158 };
159
160 template<concepts::Sender Send, concepts::Receiver Rec, concepts::Scheduler Sched>
162
163 template<typename Send, typename Sched>
164 struct SenderT {
165 struct Type {
166 public:
167 using is_sender = void;
168
169 [[no_unique_address]] Send sender;
170 [[no_unique_address]] Sched scheduler;
171
172 private:
173 template<concepts::DecaysTo<Type> Self, typename Env>
181
182 template<concepts::DecaysTo<Type> Self, typename Rec>
186 Receiver<Rec, Sched,
188 friend auto tag_invoke(types::Tag<connect>, Self&& self, Rec receiver) {
190 util::move(receiver), util::forward_like<Self>(self.sender) };
191 }
192
193 using SenderEnv = meta::EnvOf<Send>;
194
195 struct Env {
196 Sched scheduler;
197 SenderEnv sender_env;
198
199 template<concepts::OneOf<GetCompletionScheduler<SetValue>, GetCompletionScheduler<SetStopped>> Tag>
200 friend auto tag_invoke(Tag, Env const& self) {
201 return self.scheduler;
202 }
203
204 template<concepts::ForwardingQuery Tag, typename... Args>
207 constexpr friend auto tag_invoke(Tag tag, Env const& self, Args&&... args)
208 -> meta::InvokeResult<Tag, SenderEnv const&, Args...> {
209 return tag(self.sender_env, util::forward<Args>(args)...);
210 }
211 };
212
213 friend auto tag_invoke(types::Tag<get_env>, Type const& self) {
214 return Env { self.scheduler, get_env(self.sender) };
215 }
216 };
217 };
218
219 template<concepts::Sender Send, concepts::Scheduler Sched>
221
222 struct Function {
223 template<concepts::Scheduler Sched, concepts::Sender Send>
224 auto operator()(Sched&& scheduler, Send&& sender) const -> concepts::Sender auto {
226 return function::tag_invoke(*this, util::forward<Sched>(scheduler), util::forward<Send>(sender));
227 } else {
228 return Sender<meta::Decay<Send>, meta::Decay<Sched>> { util::forward<Send>(sender),
229 util::forward<Sched>(scheduler) };
230 }
231 }
232 };
233}
234
235constexpr inline auto schedule_from = schedule_from_ns::Function {};
236}
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition defer_construct.h:8
Definition optional_forward_declaration.h:5
#define DI_IMMOVABLE_NO_UNIQUE_ADDRESS
Definition compiler.h:15
Definition forwarding_query.h:7
Definition core.h:117
Definition receiver_of.h:25
Definition core.h:114
Definition sender_to.h:11
Definition sender.h:11
Definition tag_invoke.h:33
Definition list.h:119
Definition schedule_from.h:13
meta::Type< ReceiverT< Rec, Sched, Completions > > Receiver
Definition schedule_from.h:135
meta::Type< OperationStateT< Send, Rec, Sched > > OperationState
Definition schedule_from.h:161
meta::Type< SenderT< Send, Sched > > Sender
Definition schedule_from.h:220
meta::Type< ScheduleReceiverT< Rec, Sched, Completions > > ScheduleReceiver
Definition schedule_from.h:20
meta::Type< DataT< Rec, Sched, Completions > > Data
Definition schedule_from.h:64
Definition bulk.h:30
constexpr auto set_error
Definition set_error.h:14
constexpr auto schedule
Definition schedule.h:17
constexpr auto start
Definition start.h:20
meta::Type< receiver_interface_ns::ReceiverAdaptor< Self, Base > > ReceiverAdaptor
Definition receiver_adaptor.h:236
constexpr auto set_stopped
Definition set_stopped.h:14
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 auto schedule_from
Definition schedule_from.h:235
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
T::Type Type
Definition core.h:26
decltype(execution::get_completion_signatures(util::declval< Sender >(), util::declval< Env >())) CompletionSignaturesOf
Definition completion_signatures_of.h:12
detail::ComposeHelper< Funs... > Compose
Definition function.h:99
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
Type< detail::LikeHelper< T, U > > Like
Definition language.h:468
Type< detail::AsListHelper< T > > AsList
Definition algorithm.h:48
decltype(function::detail::invoke_impl(util::declval< Ts >()...)) InvokeResult
Definition invoke.h:64
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
detail::TransformHelper< List, Function >::Type Transform
Definition algorithm.h:186
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
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition vocab.h:96
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
constexpr auto forward_like(U &&value) -> decltype(auto)
Definition forward_like.h:8
StatusCode< Erased< long > > Error
Definition error.h:8
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
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 auto data
Definition data.h:51
Definition get_completion_scheduler.h:10
Definition set_value.h:6
Optional< OpState3 > op_state3
Definition schedule_from.h:44
Rec out_r
Definition schedule_from.h:42
Type(Sched sch_, Rec out_r_)
Definition schedule_from.h:39
void phase2(Tag tag, Args &&... values)
Definition schedule_from.h:50
ArgsStorage args
Definition schedule_from.h:43
Sched sch
Definition schedule_from.h:41
Definition schedule_from.h:23
Definition schedule_from.h:222
auto operator()(Sched &&scheduler, Send &&sender) const -> concepts::Sender auto
Definition schedule_from.h:224
Type(Sched scheduler, Rec receiver, S &&sender)
Definition schedule_from.h:147
friend void tag_invoke(types::Tag< execution::start >, Type &self)
Definition schedule_from.h:153
ReceiverAdaptor< Type > Base
Definition schedule_from.h:100
Type(Data< Rec, Sched, Completions > *data)
Definition schedule_from.h:104
auto base() &&-> Rec &&
Definition schedule_from.h:107
auto base() const &-> Rec const &
Definition schedule_from.h:106
Definition schedule_from.h:98
auto base() const &-> Rec const &
Definition schedule_from.h:74
auto base() &&-> Rec &&
Definition schedule_from.h:75
ReceiverAdaptor< Type > Base
Definition schedule_from.h:68
Type(Data< Rec, Sched, Completions > *data)
Definition schedule_from.h:72
Send sender
Definition schedule_from.h:169
Sched scheduler
Definition schedule_from.h:170
void is_sender
Definition schedule_from.h:167
friend auto tag_invoke(types::Tag< get_env >, Type const &self)
Definition schedule_from.h:213
friend auto tag_invoke(types::Tag< get_completion_signatures >, Self &&, Env &&) -> meta::MakeCompletionSignatures< meta::Like< Self, Send >, MakeEnv< Env >, meta::MakeCompletionSignatures< meta::ScheduleResult< Sched >, MakeEnv< Env >, CompletionSignatures<>, meta::TypeConstant< CompletionSignatures<> >::template Invoke > >
Definition schedule_from.h:174
friend auto tag_invoke(types::Tag< connect >, Self &&self, Rec receiver)
Definition schedule_from.h:188
Definition schedule_from.h:164
Definition function.h:30
Definition core.h:18
Definition completion_signuatures.h:7
Definition void.h:6
Definition immovable.h:4