2323namespace exec {
2424 struct PREDECESSOR_RESULTS_ARE_NOT_DECAY_COPYABLE { };
2525
26- struct fork_join_t {
27- template <class Sndr , class ... Closures>
28- struct _sndr_t ;
29-
26+ struct fork_join_impl_t {
3027 struct _dematerialize_fn {
3128 struct _impl_fn {
3229 template <class Rcvr , class Tag , class ... Args>
@@ -135,12 +132,13 @@ namespace exec {
135132 using _child_completions_t = STDEXEC::__completion_signatures_of_t <Sndr, _env_t >;
136133 using _domain_t = STDEXEC::__completion_domain_of_t <STDEXEC::set_value_t , Sndr, _env_t >;
137134 using _when_all_sndr_t =
138- fork_join_t ::_when_all_sndr_t <_child_completions_t , Closures, _domain_t >;
135+ fork_join_impl_t ::_when_all_sndr_t <_child_completions_t , Closures, _domain_t >;
139136 using _child_opstate_t =
140137 STDEXEC::connect_result_t <Sndr, STDEXEC::__rcvr_ref_t <_opstate_t , _env_t >>;
141138 using _fork_opstate_t =
142139 STDEXEC::connect_result_t <_when_all_sndr_t , STDEXEC::__rcvr_ref_t <Rcvr>>;
143- using _cache_sndr_t = fork_join_t ::_cache_sndr_t <_variant_t <_child_completions_t >, _domain_t >;
140+ using _cache_sndr_t =
141+ fork_join_impl_t ::_cache_sndr_t <_variant_t <_child_completions_t >, _domain_t >;
144142
145143 STDEXEC_ATTRIBUTE (host, device)
146144 constexpr explicit _opstate_t (Sndr&& sndr, Closures&& closures, Rcvr rcvr) noexcept
@@ -213,51 +211,45 @@ namespace exec {
213211 STDEXEC::__manual_lifetime<_child_opstate_t > _child_opstate_{};
214212 _fork_opstate_t _fork_opstate_;
215213 };
214+ };
216215
217- template <class ... Closures>
218- struct _closure_t {
219- using _closures_t = STDEXEC::__tuple<Closures...>;
220-
221- template <class Sndr >
222- STDEXEC_ATTRIBUTE (host, device)
223- friend constexpr auto
224- operator |(Sndr sndr, _closure_t self) noexcept -> _sndr_t <Sndr, Closures...> {
225- return _sndr_t <Sndr, Closures...>{
226- {}, static_cast <_closures_t &&>(self._closures_ ), static_cast <Sndr&&>(sndr)};
227- }
228-
229- _closures_t _closures_;
230- };
231-
216+ struct fork_join_t {
232217 template <class Sndr , class ... Closures>
233218 requires STDEXEC::sender<Sndr>
234219 STDEXEC_ATTRIBUTE (host, device)
235- auto operator()(Sndr sndr, Closures... closures) const -> _sndr_t<Sndr, Closures...> {
236- return {{}, {static_cast <Closures&&>(closures)...}, static_cast <Sndr&&>(sndr)};
220+ constexpr auto
221+ operator ()(Sndr&& sndr, Closures&&... closures) const -> STDEXEC::__well_formed_sender auto {
222+ return STDEXEC::__make_sexpr<fork_join_t >(
223+ STDEXEC::__tuple{std::forward<Closures>(closures)...}, std::forward<Sndr>(sndr));
237224 }
238225
239226 template <class ... Closures>
240227 requires ((!STDEXEC::sender<Closures>) && ...)
241228 STDEXEC_ATTRIBUTE (host, device)
242- auto operator()(Closures... closures) const -> _closure_t<Closures...> {
243- return {{ static_cast <Closures&& >(closures)...} };
229+ constexpr auto operator ()(Closures&& ... closures) const {
230+ return STDEXEC::__closure{* this , std::forward <Closures>(closures)...};
244231 }
245232 };
246233
247234 template <>
248- struct fork_join_t ::_env_t <STDEXEC::indeterminate_domain<>> { };
235+ struct fork_join_impl_t ::_env_t <STDEXEC::indeterminate_domain<>> { };
249236
250- template <class Sndr , class ... Closures>
251- struct fork_join_t ::_sndr_t {
252- using sender_concept = STDEXEC::sender_t ;
253- using _closures_t = STDEXEC::__tuple<Closures...>;
237+ inline constexpr fork_join_t fork_join{};
238+
239+ } // namespace exec
254240
241+ namespace exec ::__fork_join {
242+ struct __impls : STDEXEC::__sexpr_defaults {
255243 template <class Self , class ... Env>
256244 STDEXEC_ATTRIBUTE (host, device)
257245 static consteval auto get_completion_signatures () {
258246 using namespace STDEXEC ;
259- using _domain_t = STDEXEC::__completion_domain_of_t <set_value_t , Sndr, Env...>;
260- using _child_t = __copy_cvref_t <Self, Sndr>;
247+
248+ using _closures_t = STDEXEC::__data_of<Self>;
249+ using _child_sndr_t = STDEXEC::__child_of<Self>;
250+
251+ using _domain_t = __completion_domain_of_t <set_value_t , _child_sndr_t , Env...>;
252+ using _child_t = __copy_cvref_t <Self, _child_sndr_t >;
261253 using _child_completions_t = __completion_signatures_of_t <_child_t , __fwd_env_t <Env>...>;
262254 using __decay_copyable_results_t = STDEXEC::__decay_copyable_results_t <_child_completions_t >;
263255
@@ -269,37 +261,26 @@ namespace exec {
269261 _IN_ALGORITHM_ (exec::fork_join_t )
270262 >();
271263 } else {
272- using _sndr_t = _when_all_sndr_t <_child_completions_t , _closures_t , _domain_t >;
264+ using _sndr_t =
265+ fork_join_impl_t ::_when_all_sndr_t <_child_completions_t , _closures_t , _domain_t >;
273266 return __completion_signatures_of_t <_sndr_t , __fwd_env_t <Env>...>{};
274267 }
275268 }
276269
277- template <class Rcvr >
278- STDEXEC_ATTRIBUTE (host, device)
279- constexpr auto connect (Rcvr rcvr) && -> _opstate_t<Sndr, _closures_t, Rcvr> {
280- return _opstate_t <Sndr, _closures_t , Rcvr>{
281- static_cast <Sndr&&>(sndr_),
282- static_cast <_closures_t &&>(_closures_),
283- static_cast <Rcvr&&>(rcvr)};
284- }
285-
286- template <class Rcvr >
287- STDEXEC_ATTRIBUTE (host, device)
288- constexpr auto connect (
289- Rcvr rcvr) const & -> _opstate_t<Sndr const &, _closures_t const &, Rcvr> {
290- return _opstate_t <Sndr const &, _closures_t const &, Rcvr>{
291- sndr_, _closures_, static_cast <Rcvr&&>(rcvr)};
292- }
293-
294- STDEXEC_ATTRIBUTE (host, device)
295- constexpr auto get_env () const noexcept -> STDEXEC::__fwd_env_t<STDEXEC::env_of_t<Sndr>> {
296- return STDEXEC::__fwd_env (STDEXEC::get_env (sndr_));
297- }
270+ static constexpr auto connect =
271+ []<class _Receiver , class _Sender >(_Sender&& __sndr, _Receiver&& __rcvr) noexcept {
272+ using _closures_t = STDEXEC::__data_of<_Sender>;
273+ using _sndr_t = STDEXEC::__child_of<_Sender>;
298274
299- STDEXEC_ATTRIBUTE (no_unique_address) fork_join_t _tag_;
300- STDEXEC::__tuple<Closures...> _closures_;
301- Sndr sndr_;
275+ return fork_join_impl_t ::_opstate_t <_sndr_t , _closures_t , _Receiver>{
276+ STDEXEC::__get<2 >(static_cast <_Sender&&>(__sndr)),
277+ STDEXEC::__get<1 >(static_cast <_Sender&&>(__sndr)),
278+ static_cast <_Receiver&&>(__rcvr)};
279+ };
302280 };
281+ } // namespace exec::__fork_join
303282
304- inline constexpr fork_join_t fork_join{};
305- } // namespace exec
283+ namespace STDEXEC {
284+ template <>
285+ struct __sexpr_impl <exec::fork_join_t > : exec::__fork_join::__impls { };
286+ } // namespace STDEXEC
0 commit comments