Iros
 
Loading...
Searching...
No Matches
let.h
Go to the documentation of this file.
1#pragma once
2
13#include "di/meta/core.h"
14#include "di/meta/language.h"
15#include "di/meta/util.h"
17#include "di/util/immovable.h"
18
19namespace di::execution {
20namespace let_ns {
21 template<typename CPO, typename Completions>
25
26 template<typename CPO, typename Fun, typename Completions>
32
33 template<typename CPO, typename Rec, typename Fun, typename Completions>
34 struct DataT {
35 struct Type {
36 private:
38
41
43
44 public:
45 explicit Type(Fun f_, Rec out_r_) : f(util::move(f_)), out_r(util::move(out_r_)) {}
46
47 [[no_unique_address]] Fun f;
48 [[no_unique_address]] Rec out_r;
49 [[no_unique_address]] ArgsStorage args {};
50 [[no_unique_address]] OpStateStorage op_state3 {};
51
52 template<typename... Args>
54 void phase2(Args&&... args) {
55 using Tuple = meta::DecayedTuple<Args...>;
56 auto& decayed_args = this->args.template emplace<Tuple>(util::forward<Args>(args)...);
57
60
61 auto& op_state = this->op_state3.template emplace<OpState>(util::DeferConstruct([&] {
62 return execution::connect(apply(util::move(f), decayed_args), util::move(out_r));
63 }));
64
65 execution::start(op_state);
66 }
67 };
68 };
69
70 template<concepts::OneOf<SetValue, SetError, SetStopped> CPO, concepts::Receiver Rec, concepts::MovableValue Fun,
71 concepts::InstanceOf<CompletionSignatures> Completions>
73
74 template<typename CPO, typename Rec, typename Fun, typename Completions>
75 struct ReceiverT {
76 struct Type {
77 using is_receiver = void;
78
80
81 private:
82 template<concepts::SameAs<CPO> Tag, typename... Args>
83 friend void tag_invoke(Tag, Type&& self, Args&&... args)
84 requires(requires {
85 util::declval<Data<CPO, Rec, Fun, Completions>&>().phase2(util::forward<Args>(args)...);
86 })
87 {
88 self.data->phase2(util::forward<Args>(args)...);
89 }
90
91 template<concepts::OneOf<SetValue, SetError, SetStopped> Tag, typename... Args>
92 friend void tag_invoke(Tag tag, Type&& self, Args&&... args)
93 requires(!concepts::SameAs<Tag, CPO> && concepts::Invocable<Tag, Rec, Args...>)
94 {
95 return tag(util::move(self.data->out_r), util::forward<Args>(args)...);
96 }
97
98 constexpr friend auto tag_invoke(types::Tag<get_env>, Type const& self) {
99 return make_env(get_env(self.data->out_r));
100 }
101 };
102 };
103
104 template<concepts::OneOf<SetValue, SetError, SetStopped> CPO, concepts::Receiver Rec, concepts::MovableValue Fun,
105 concepts::InstanceOf<CompletionSignatures> Completions>
107
108 template<typename CPO, typename Send, typename Rec, typename Fun>
111 private:
113
114 public:
115 explicit Type(Fun f, Rec out_r, Send&& sender)
116 : m_data(util::move(f), util::move(out_r))
117 , m_op_state2(execution::connect(util::forward<Send>(sender),
118 Receiver<CPO, Rec, Fun, Completions> { util::addressof(m_data) })) {}
119
120 private:
121 friend void tag_invoke(types::Tag<start>, Type& self) { execution::start(self.m_op_state2); }
122
123 [[no_unique_address]] Data<CPO, Rec, Fun, Completions> m_data;
125 };
126 };
127
128 template<concepts::OneOf<SetValue, SetError, SetStopped> CPO, concepts::Sender Send, concepts::Receiver Rec,
129 concepts::MovableValue Fun>
131
132 template<typename CPO, typename Send, typename Fun>
133 struct SenderT {
134 struct Type {
135 public:
136 using is_sender = void;
137
138 [[no_unique_address]] Send sender;
139 [[no_unique_address]] Fun function;
140
141 private:
142 template<concepts::DecaysTo<Type> Self, typename Env>
143 using BaseCompletionSignatures =
146
147 template<concepts::DecaysTo<Type> Self, typename Env>
148 using InvokeCompletionSignatures = meta::Join<
152
153 template<concepts::DecaysTo<Type> Self, typename Env>
154 using CompletionSignatures = meta::AsTemplate<
155 CompletionSignatures,
156 meta::Unique<meta::Concat<BaseCompletionSignatures<Self, Env>, InvokeCompletionSignatures<Self, Env>>>>;
157
158 template<concepts::DecaysTo<Type> Self, typename Env>
160 -> CompletionSignatures<Self, MakeEnv<Env>> {
161 return {};
162 }
163
164 template<concepts::DecaysTo<Type> Self, concepts::Receiver Rec,
165 concepts::SameAs<types::Tag<connect>> Tag = types::Tag<connect>>
169 Receiver<CPO, Rec, Fun,
171 friend auto tag_invoke(Tag, Self&& self, Rec receiver) {
173 util::move(receiver),
174 util::forward_like<Self>(self.sender) };
175 }
176
177 constexpr friend auto tag_invoke(types::Tag<get_env>, Type const& self) {
178 return make_env(get_env(self.sender));
179 }
180 };
181 };
182
183 template<concepts::OneOf<SetValue, SetError, SetStopped> CPO, concepts::Sender Send, concepts::MovableValue Fun>
185
186 template<concepts::OneOf<SetValue, SetError, SetStopped> CPO>
187 struct Function {
188 template<concepts::Sender Send, concepts::MovableValue Fun>
189 auto operator()(Send&& sender, Fun&& function) const -> concepts::Sender auto {
190 if constexpr (requires {
192 util::forward<Send>(sender), util::forward<Fun>(function));
193 }) {
195 util::forward<Send>(sender), util::forward<Fun>(function));
196 } else if constexpr (requires {
197 function::tag_invoke(*this, util::forward<Send>(sender),
198 util::forward<Fun>(function));
199 }) {
200 return function::tag_invoke(*this, util::forward<Send>(sender), util::forward<Fun>(function));
201 } else {
202 return Sender<CPO, Send, Fun> { util::forward<Send>(sender), util::forward<Fun>(function) };
203 }
204 }
205 };
206}
207
211}
Definition defer_construct.h:8
Definition tuple_forward_declaration.h:5
#define DI_IMMOVABLE_NO_UNIQUE_ADDRESS
Definition compiler.h:15
Definition invoke.h:58
Definition core.h:114
Definition sender_to.h:11
Definition sender.h:11
Definition let.h:20
meta::Type< ReceiverT< CPO, Rec, Fun, Completions > > Receiver
Definition let.h:106
meta::Type< OperationStateT< CPO, Send, Rec, Fun > > OperationState
Definition let.h:130
meta::Type< SenderT< CPO, meta::RemoveCVRef< Send >, meta::Decay< Fun > > > Sender
Definition let.h:184
meta::Unique< meta::Transform< meta::Filter< meta::AsList< Completions >, meta::IsFunctionTo< CPO > >, meta::Compose< meta::Uncurry< meta::Quote< meta::DecayedTuple > >, meta::Quote< meta::AsList > > > > ArgTypes
Definition let.h:22
meta::Type< DataT< CPO, Rec, Fun, Completions > > Data
Definition let.h:72
meta::Transform< ArgTypes< CPO, Completions >, meta::Compose< meta::Uncurry< meta::BindFront< meta::Quote< meta::InvokeResult >, Fun > >, meta::BindBack< meta::Quote< meta::Transform >, meta::Quote< meta::AddLValueReference > >, meta::Quote< meta::AsList > > > SenderTypes
Definition let.h:27
Definition bulk.h:30
constexpr auto let_value
Definition let.h:208
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 let_error
Definition let.h:209
constexpr auto get_completion_scheduler
Definition get_completion_scheduler.h:19
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 let_stopped
Definition let.h:210
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
Definition as_bool.h:8
constexpr auto curry_back
Definition curry_back.h:141
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
Apply< Quote< Concat >, List > Join
Definition algorithm.h:89
Fold< List, meta::List<>, detail::FilterReducer< Pred > > Filter
Definition algorithm.h:152
constexpr auto c_
A value of type Constexpr<val>.
Definition constexpr.h:252
Fold< Lst, List<>, detail::PushBackIfUnique > Unique
Definition algorithm.h:203
vocab::Tuple< meta::Decay< Types >... > DecayedTuple
Definition decayed_tuple.h:8
decltype(function::detail::invoke_impl(util::declval< Ts >()...)) InvokeResult
Definition invoke.h:64
detail::TransformHelper< List, Function >::Type Transform
Definition algorithm.h:186
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
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
OpStateStorage op_state3
Definition let.h:50
ArgsStorage args
Definition let.h:49
Type(Fun f_, Rec out_r_)
Definition let.h:45
void phase2(Args &&... args)
Definition let.h:54
Rec out_r
Definition let.h:48
Definition let.h:34
auto operator()(Send &&sender, Fun &&function) const -> concepts::Sender auto
Definition let.h:189
friend void tag_invoke(types::Tag< start >, Type &self)
Definition let.h:121
Type(Fun f, Rec out_r, Send &&sender)
Definition let.h:115
void is_receiver
Definition let.h:77
Data< CPO, Rec, Fun, Completions > * data
Definition let.h:79
friend void tag_invoke(Tag tag, Type &&self, Args &&... args)
Definition let.h:92
constexpr friend auto tag_invoke(types::Tag< get_env >, Type const &self)
Definition let.h:98
friend void tag_invoke(Tag, Type &&self, Args &&... args)
Definition let.h:83
Fun function
Definition let.h:139
friend auto tag_invoke(Tag, Self &&self, Rec receiver)
Definition let.h:171
constexpr friend auto tag_invoke(types::Tag< get_env >, Type const &self)
Definition let.h:177
friend auto tag_invoke(types::Tag< get_completion_signatures >, Self &&, Env &&) -> CompletionSignatures< Self, MakeEnv< Env > >
Definition let.h:159
Send sender
Definition let.h:138
void is_sender
Definition let.h:136
Definition let.h:133
Definition function.h:70
Definition language.h:80
Definition function.h:128
Definition function.h:30
Definition void.h:6
Definition immovable.h:4