1919#include " ../../stdexec/execution.hpp"
2020
2121// include these after execution.hpp
22+ #include " ../../stdexec/__detail/__senders.hpp"
2223#include " ../../stdexec/__detail/__tuple.hpp"
23- #include " ../../stdexec/__detail/__variant.hpp"
2424#include " ../sender_for.hpp"
2525#include " ../sequence_senders.hpp"
2626
@@ -58,7 +58,7 @@ namespace experimental::execution
5858 static_cast <_Receiver&&>(__rcvr));
5959 };
6060
61- template <class _ResultVariant >
61+ template <class _ResultsStorage >
6262 struct __result_type
6363 {
6464 template <class ... _Args>
@@ -83,31 +83,28 @@ namespace experimental::execution
8383 {
8484 STDEXEC::set_value (static_cast <_Receiver&&>(__rcvr));
8585 }
86- else if constexpr (STDEXEC ::__mapply<STDEXEC ::__msize, _ResultVariant >::value != 0 )
86+ else if constexpr (STDEXEC ::__mapply<STDEXEC ::__msize, _ResultsStorage >::value != 0 )
8787 {
88- STDEXEC_ASSERT (__result_.index () != __variant_npos);
89- STDEXEC::__visit (__visit_fn,
90- static_cast <_ResultVariant&&>(__result_),
91- static_cast <_Receiver&&>(__rcvr));
88+ static_cast <_ResultsStorage&&>(__result_).__complete (__rcvr);
9289 }
9390 }
9491
95- _ResultVariant __result_{ STDEXEC ::__no_init} ;
92+ _ResultsStorage __result_;
9693 __std::atomic<int > __emplaced_{0 };
9794 };
9895
99- template <class _ItemReceiver , class _ResultVariant >
96+ template <class _ItemReceiver , class _ResultsStorage >
10097 struct __item_operation_base
10198 {
10299 STDEXEC_ATTRIBUTE (no_unique_address) _ItemReceiver __rcvr_;
103- __result_type<_ResultVariant >* __result_;
100+ __result_type<_ResultsStorage >* __result_;
104101 };
105102
106- template <class _ItemReceiver , class _ResultVariant >
103+ template <class _ItemReceiver , class _ResultsStorage >
107104 struct __item_receiver
108105 {
109106 using receiver_concept = STDEXEC ::receiver_tag;
110- __item_operation_base<_ItemReceiver, _ResultVariant >* __op_;
107+ __item_operation_base<_ItemReceiver, _ResultsStorage >* __op_;
111108
112109 template <class ... _Args>
113110 void set_value ([[maybe_unused]] _Args&&... __args) noexcept
@@ -117,7 +114,7 @@ namespace experimental::execution
117114 }
118115
119116 template <class _Error >
120- requires __variant_emplaceable<_ResultVariant ,
117+ requires __variant_emplaceable<_ResultsStorage ,
121118 __decayed_tuple<set_error_t , _Error>,
122119 set_error_t ,
123120 _Error>
@@ -130,7 +127,9 @@ namespace experimental::execution
130127 }
131128
132129 void set_stopped () noexcept
133- requires __variant_emplaceable<_ResultVariant, __decayed_tuple<set_stopped_t>, set_stopped_t>
130+ requires __variant_emplaceable<_ResultsStorage,
131+ __decayed_tuple<set_stopped_t>,
132+ set_stopped_t>
134133 && __callable<set_stopped_t, _ItemReceiver>
135134 {
136135 // stop without error
@@ -144,15 +143,15 @@ namespace experimental::execution
144143 }
145144 };
146145
147- template <class _Sender , class _ItemReceiver , class _ResultVariant >
148- struct __item_operation : __item_operation_base<_ItemReceiver, _ResultVariant >
146+ template <class _Sender , class _ItemReceiver , class _ResultsStorage >
147+ struct __item_operation : __item_operation_base<_ItemReceiver, _ResultsStorage >
149148 {
150- using __base_t = __item_operation_base<_ItemReceiver, _ResultVariant >;
151- using __item_receiver_t = __item_receiver<_ItemReceiver, _ResultVariant >;
149+ using __base_t = __item_operation_base<_ItemReceiver, _ResultsStorage >;
150+ using __item_receiver_t = __item_receiver<_ItemReceiver, _ResultsStorage >;
152151
153- __item_operation (__result_type<_ResultVariant >* __parent,
154- _Sender&& __sndr,
155- _ItemReceiver __rcvr)
152+ __item_operation (__result_type<_ResultsStorage >* __parent,
153+ _Sender&& __sndr,
154+ _ItemReceiver __rcvr)
156155 noexcept (__nothrow_decay_copyable<_ItemReceiver>
157156 && __nothrow_connectable<_Sender, __item_receiver_t >)
158157 : __base_t {static_cast <_ItemReceiver&&>(__rcvr), __parent}
@@ -167,18 +166,18 @@ namespace experimental::execution
167166 connect_result_t <_Sender, __item_receiver_t > __op_;
168167 };
169168
170- template <class _Sender , class _ResultVariant >
169+ template <class _Sender , class _ResultsStorage >
171170 struct __item_sender
172171 {
173172 using sender_concept = STDEXEC ::sender_tag;
174173 using completion_signatures = STDEXEC ::completion_signatures<set_value_t (), set_stopped_t ()>;
175174
176175 template <class _Self , class _Receiver >
177176 using __operation_t =
178- __item_operation<__copy_cvref_t <_Self, _Sender>, _Receiver, _ResultVariant >;
177+ __item_operation<__copy_cvref_t <_Self, _Sender>, _Receiver, _ResultsStorage >;
179178
180179 template <class _Receiver >
181- using __item_receiver_t = __item_receiver<_Receiver, _ResultVariant >;
180+ using __item_receiver_t = __item_receiver<_Receiver, _ResultsStorage >;
182181
183182 template <__decays_to<__item_sender> _Self,
184183 STDEXEC ::receiver_of<completion_signatures> _Receiver>
@@ -192,23 +191,23 @@ namespace experimental::execution
192191 }
193192 STDEXEC_EXPLICIT_THIS_END (connect)
194193
195- _Sender __sender_;
196- __result_type<_ResultVariant >* __parent_;
194+ _Sender __sender_;
195+ __result_type<_ResultsStorage >* __parent_;
197196 };
198197
199- template <class _Receiver , class _ResultVariant >
200- struct __operation_base : __result_type<_ResultVariant >
198+ template <class _Receiver , class _ResultsStorage >
199+ struct __operation_base : __result_type<_ResultsStorage >
201200 {
202201 STDEXEC_IMMOVABLE_NO_UNIQUE_ADDRESS
203202 _Receiver __rcvr_;
204203 };
205204
206- template <class _Receiver , class _ResultVariant >
205+ template <class _Receiver , class _ResultsStorage >
207206 struct __receiver
208207 {
209208 using receiver_concept = STDEXEC ::receiver_tag;
210209
211- constexpr explicit __receiver (__operation_base<_Receiver, _ResultVariant >* __op) noexcept
210+ constexpr explicit __receiver (__operation_base<_Receiver, _ResultsStorage >* __op) noexcept
212211 : __op_{__op}
213212 {}
214213
@@ -218,7 +217,7 @@ namespace experimental::execution
218217 template <sender _Item>
219218 [[nodiscard]]
220219 auto set_next (_Item&& __item) & noexcept (__nothrow_decay_copyable<_Item>)
221- -> __item_sender<__decay_t<_Item>, _ResultVariant >
220+ -> __item_sender<__decay_t<_Item>, _ResultsStorage >
222221 {
223222 return {static_cast <_Item&&>(__item), __op_};
224223 }
@@ -245,32 +244,30 @@ namespace experimental::execution
245244 }
246245
247246 private:
248- __operation_base<_Receiver, _ResultVariant >* __op_;
247+ __operation_base<_Receiver, _ResultsStorage >* __op_;
249248 };
250249
251- template <class _Sigs >
252- using __result_variant_ = __transform_reduce_completion_signatures_t <
253- _Sigs,
254- __mconst<__mlist<>>::__f,
255- __mcompose_q<__mlist, __mbind_front_q<__decayed_tuple, set_error_t >::__f>::__f,
256- __mlist<__tuple<set_stopped_t >>,
257- __mconcat<__qq<__variant>>::__f>;
250+ template <class _Signature >
251+ using __is_set_value_signature_t =
252+ __mbool<__same_as<set_value_t , __signature_tag_t <_Signature>>>;
258253
254+ // Storage for the non-set_value completions
259255 template <class _Sender , class _Env >
260256 using __result_variant_t =
261- __result_variant_<__sequence_completion_signatures_of_t <_Sender, _Env>>;
257+ __mapply<__mremove_if<__q1<__is_set_value_signature_t >, __qq<__results_storage>>,
258+ __sequence_completion_signatures_of_t <_Sender, _Env>>;
262259
263260 template <class _Sender , class _Receiver >
264261 struct __operation
265262 : __operation_base<_Receiver, __result_variant_t <_Sender, env_of_t <_Receiver>>>
266263 {
267- using _ResultVariant = __result_variant_t <_Sender, env_of_t <_Receiver>>;
268- using __base_type = __operation_base<_Receiver, _ResultVariant >;
269- using __receiver_t = __receiver<_Receiver, _ResultVariant >;
264+ using __variant_t = __result_variant_t <_Sender, env_of_t <_Receiver>>;
265+ using __base_t = __operation_base<_Receiver, __variant_t >;
266+ using __receiver_t = __receiver<_Receiver, __variant_t >;
270267
271268 explicit __operation (_Sender&& __sndr, _Receiver __rcvr)
272269 noexcept (__nothrow_subscribable<_Sender, __receiver_t >)
273- : __base_type {{}, static_cast <_Receiver&&>(__rcvr)}
270+ : __base_t {{}, static_cast <_Receiver&&>(__rcvr)}
274271 , __op_{exec::subscribe (static_cast <_Sender&&>(__sndr), __receiver_t {this })}
275272 {}
276273
0 commit comments