@@ -66,6 +66,14 @@ namespace exec {
6666 }
6767 };
6868
69+ template <class _Tuple >
70+ struct __convert_tuple_fn {
71+ template <class ... _Ts>
72+ STDEXEC_ATTRIBUTE (host, device, always_inline)
73+ constexpr auto
74+ operator ()(_Ts&&... __ts) const STDEXEC_AUTO_RETURN (_Tuple{static_cast <_Ts&&>(__ts)...});
75+ };
76+
6977 template <class Rcvr , class ... Sndrs>
7078 struct _opstate ;
7179
@@ -76,7 +84,7 @@ namespace exec {
7684 // We will be connecting the first sender in the opstate constructor, so we don't need to
7785 // store it in the opstate. The use of `stdexec::__ignore` causes the first sender to not
7886 // be stored.
79- using _senders_tuple_t = stdexec::__tuple_for <stdexec::__ignore, Sndrs...>;
87+ using _senders_tuple_t = stdexec::__tuple <stdexec::__ignore, Sndrs...>;
8088
8189 template <size_t Idx>
8290 using _rcvr_t = _seq::_rcvr<Rcvr, stdexec::__id<_opstate>, stdexec::__msize_t <Idx>>;
@@ -91,24 +99,23 @@ namespace exec {
9199
92100 using _ops_variant_t = stdexec::__minvoke<
93101 _mk_child_ops_variant_fn,
94- stdexec::__tuple_for <Sndr0, Sndrs...>,
102+ stdexec::__tuple <Sndr0, Sndrs...>,
95103 stdexec::__make_indices<sizeof ...(Sndrs) + 1 >
96104 >;
97105
98106 template <class CvrefSndrs >
99107 STDEXEC_ATTRIBUTE (host, device)
100108 explicit _opstate (Rcvr&& rcvr, CvrefSndrs&& sndrs)
101109 : _rcvr{static_cast <Rcvr&&>(rcvr)}
102- , _sndrs{_senders_tuple_t::__convert_from (static_cast <CvrefSndrs&&>(sndrs))}
103- // move all but the first sender into the opstate.
110+ , _sndrs{stdexec::__apply (
111+ __convert_tuple_fn<_senders_tuple_t >{},
112+ static_cast <CvrefSndrs&&>(sndrs))} // move all but the first sender into the opstate.
104113 {
105114 // Below, it looks like we are using `sndrs` after it has been moved from. This is not the
106115 // case. `sndrs` is moved into a tuple type that has `__ignore` for the first element. The
107116 // result is that the first sender in `sndrs` is not moved from, but the rest are.
108117 _ops.template emplace_from_at <0 >(
109- stdexec::connect,
110- sndrs.template __get <0 >(static_cast <CvrefSndrs&&>(sndrs)),
111- _rcvr_t <0 >{this });
118+ stdexec::connect, stdexec::__get<0 >(static_cast <CvrefSndrs&&>(sndrs)), _rcvr_t <0 >{this });
112119 }
113120
114121 template <class Index , class ... Args>
@@ -119,7 +126,7 @@ namespace exec {
119126 if constexpr (Idx == sizeof ...(Sndrs) + 1 ) {
120127 stdexec::set_value (static_cast <Rcvr&&>(_rcvr), static_cast <Args&&>(args)...);
121128 } else {
122- auto & sndr = _sndrs. template __get <Idx>(_sndrs);
129+ auto & sndr = stdexec:: __get<Idx>(_sndrs);
123130 auto & op = _ops.template emplace_from_at <Idx>(
124131 stdexec::connect, std::move (sndr), _rcvr_t <Idx>{this });
125132 stdexec::start (op);
@@ -206,7 +213,7 @@ namespace exec {
206213
207214 STDEXEC_ATTRIBUTE (no_unique_address, maybe_unused) sequence_t _tag;
208215 STDEXEC_ATTRIBUTE (no_unique_address, maybe_unused) stdexec::__ignore _ignore;
209- stdexec::__tuple_for <Sndrs...> _sndrs;
216+ stdexec::__tuple <Sndrs...> _sndrs;
210217 };
211218
212219 template <class Sndr >
0 commit comments