1919#pragma once
2020
2121#include " ../../stdexec/execution.hpp"
22- #include < cstddef>
23- #include < exception>
24- #include < type_traits>
2522
26- #include < cuda/std/utility >
23+ #include " ../../exec/completion_signatures.hpp "
2724
2825#include " common.cuh"
2926
27+ #include < cuda/std/utility>
28+
29+ #include < cstddef>
30+ #include < type_traits>
31+
3032STDEXEC_PRAGMA_PUSH ()
3133STDEXEC_PRAGMA_IGNORE_EDG (cuda_compile)
3234
@@ -106,7 +108,7 @@ namespace nv::execution::_strm
106108 status == cudaSuccess)
107109 {
108110 opstate_.defer_temp_storage_destruction (d_result);
109- opstate_.propagate_completion_signal (STDEXEC ::set_value, *d_result);
111+ opstate_.propagate_completion_signal (STDEXEC ::set_value, std::move ( *d_result) );
110112 }
111113 else
112114 {
@@ -125,28 +127,24 @@ namespace nv::execution::_strm
125127 Fun fun_;
126128 _strm::opstate_base<Receiver>& opstate_;
127129 };
130+
131+ template <class Fun >
132+ consteval auto _get_completions_fun () noexcept
133+ {
134+ return []() noexcept
135+ {
136+ return __set_value_from_t <Fun>();
137+ };
138+ }
128139 } // namespace _upon_stopped
129140
130141 template <class Sender , class Fun >
131142 struct upon_stopped_sender : stream_sender_base
132143 {
133144 using sender_concept = STDEXEC ::sender_tag;
134- using _set_error_t = completion_signatures<set_error_t (std::exception_ptr)>;
135145
136146 template <class Receiver >
137- using receiver_t = _upon_stopped::receiver<Receiver, Fun>;
138-
139- template <class Self , class ... Env>
140- using completion_signatures = __transform_completion_signatures_t <
141- __completion_signatures_of_t <__copy_cvref_t <Self, Sender>, Env...>,
142- __with_error_invoke_t <__mbind_front_q<__callable_error_t , upon_stopped_t >,
143- set_stopped_t ,
144- Fun,
145- __copy_cvref_t <Self, Sender>,
146- Env...>,
147- __cmplsigs::__default_set_value,
148- __cmplsigs::__default_set_error,
149- __set_value_from_t <Fun>>;
147+ using _receiver_t = _upon_stopped::receiver<Receiver, Fun>;
150148
151149 explicit upon_stopped_sender (Sender sndr, Fun fun)
152150 noexcept (__nothrow_move_constructible<Sender, Fun>)
@@ -155,22 +153,26 @@ namespace nv::execution::_strm
155153 {}
156154
157155 template <__decays_to<upon_stopped_sender> Self, STDEXEC ::receiver Receiver>
158- requires receiver_of<Receiver, completion_signatures<Self, env_of_t <Receiver>>>
159156 STDEXEC_EXPLICIT_THIS_BEGIN (auto connect)(this Self&& self, Receiver rcvr)
160- -> stream_opstate_t <__copy_cvref_t <Self, Sender>, receiver_t <Receiver>, Receiver>
157+ -> stream_opstate_t <__copy_cvref_t <Self, Sender>, _receiver_t <Receiver>, Receiver>
161158 {
162159 return stream_opstate<__copy_cvref_t <Self, Sender>>(
163160 static_cast <Self&&>(self).sndr_ ,
164161 static_cast <Receiver&&>(rcvr),
165- [&](_strm::opstate_base<Receiver>& stream_provider) -> receiver_t <Receiver>
166- { return receiver_t <Receiver>(self.fun_ , stream_provider); });
162+ [&](_strm::opstate_base<Receiver>& stream_provider) -> _receiver_t <Receiver>
163+ { return _receiver_t <Receiver>(self.fun_ , stream_provider); });
167164 }
168165 STDEXEC_EXPLICIT_THIS_END (connect)
169166
170167 template <__decays_to<upon_stopped_sender> Self, class ... Env>
171- static consteval auto get_completion_signatures () -> completion_signatures<Self, Env...>
168+ static consteval auto get_completion_signatures ()
172169 {
173- return {};
170+ return exec::transform_completion_signatures (
171+ STDEXEC ::get_completion_signatures<__copy_cvref_t <Self, Sender>, Env...>(),
172+ {},
173+ {},
174+ _upon_stopped::_get_completions_fun<Fun>(),
175+ _cuda_error_completion_t ());
174176 }
175177
176178 auto get_env () const noexcept -> stream_sender_attrs<Sender>
0 commit comments