@@ -118,10 +118,10 @@ namespace exec {
118118
119119 template <__decays_to<__sender> _Self, class _Receiver >
120120 requires receiver_of<_Receiver, __completions_t <env_of_t <_Receiver>>>
121- static auto connect (_Self&& __self , _Receiver __rcvr) //
121+ static auto connect (_Self&& __Self , _Receiver __rcvr) //
122122 noexcept (std::is_nothrow_move_constructible_v<_Receiver>)
123123 -> __operation_t<_Tag, __default_t<env_of_t<_Receiver>>, _Receiver> {
124- return {{}, static_cast <_Self&&>(__self ).__default_ , static_cast <_Receiver&&>(__rcvr)};
124+ return {{}, static_cast <_Self&&>(__Self ).__default_ , static_cast <_Receiver&&>(__rcvr)};
125125 }
126126
127127 template <class _Env >
@@ -141,8 +141,73 @@ namespace exec {
141141
142142 inline constexpr __read_with_default::__read_with_default_t read_with_default{};
143143
144+ [[deprecated (" exec::write_env has been renamed to exec::write_env" )]]
144145 inline constexpr stdexec::__write_::__write_env_t write{};
145146 inline constexpr stdexec::__write_::__write_env_t write_env{};
147+
148+ namespace __write_attrs {
149+ using namespace stdexec ;
150+
151+ template <class _SenderId , class _Attrs >
152+ struct __sender {
153+ using _Sender = stdexec::__t <_SenderId>;
154+
155+ struct __t {
156+ using sender_concept = sender_t ;
157+ using __id = __sender;
158+ _Sender __sndr_;
159+ _Attrs __attrs_;
160+
161+ auto get_env () const noexcept -> __env::__join_t<const _Attrs&, env_of_t<_Sender>> {
162+ return stdexec::__env::__join (__attrs_, stdexec::get_env (__sndr_));
163+ }
164+
165+ template <__decays_to<__t > _Self, class ... _Env>
166+ static auto get_completion_signatures (_Self&&, _Env&&...)
167+ -> completion_signatures_of_t<__copy_cvref_t<_Self, _Sender>, _Env...> {
168+ return {};
169+ }
170+
171+ template <__decays_to<__t > _Self, class _Receiver >
172+ requires sender_in<__copy_cvref_t <_Self, _Sender>, env_of_t <_Receiver>>
173+ static auto connect (_Self&& __self, _Receiver __rcvr)
174+ -> connect_result_t<__copy_cvref_t<_Self, _Sender>, _Receiver> {
175+ return stdexec::connect (std::forward<_Self>(__self).__sndr_ , std::move (__rcvr));
176+ }
177+ };
178+ };
179+
180+ struct __write_attrs_t {
181+ template <class _Sender , class _Attrs >
182+ STDEXEC_ATTRIBUTE ((host, device))
183+ auto operator ()(_Sender snd, _Attrs __attrs_) const //
184+ -> __write_attrs::__sender<_Sender, _Attrs> {
185+ return __t <__write_attrs::__sender<__id<_Sender>, _Attrs>>{
186+ static_cast <_Sender&&>(snd), static_cast <_Attrs&&>(__attrs_)};
187+ }
188+
189+ template <class _Attrs >
190+ struct __closure {
191+ _Attrs __attrs_;
192+
193+ template <class _Sender >
194+ STDEXEC_ATTRIBUTE ((host, device))
195+ friend auto operator |(_Sender __sndr_, __closure _clsr) {
196+ return __t <__write_attrs::__sender<__id<_Sender>, _Attrs>>{
197+ static_cast <_Sender&&>(__sndr_), static_cast <_Attrs&&>(_clsr.__attrs_ )};
198+ }
199+ };
200+
201+ template <class _Attrs >
202+ STDEXEC_ATTRIBUTE ((host, device))
203+ auto operator ()(_Attrs __attrs_) const {
204+ return __closure<_Attrs>{static_cast <_Attrs&&>(__attrs_)};
205+ }
206+ };
207+ } // namespace __write_attrs
208+
209+ inline constexpr __write_attrs::__write_attrs_t write_attrs{};
210+
146211} // namespace exec
147212
148213STDEXEC_PRAGMA_POP ()
0 commit comments