Skip to content

Commit 835bc0d

Browse files
authored
use __tuple to implement __sexpr instead of a lambda (#1764)
also, avoid instantiating the default `sync_wait` implementation needlessly
1 parent 58a2a91 commit 835bc0d

32 files changed

+310
-447
lines changed

include/exec/__detail/__basic_sequence.hpp

Lines changed: 44 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -31,76 +31,53 @@ namespace exec {
3131
using __t = __basic_sequence_sender;
3232
};
3333

34-
template <auto _DescriptorFn, class = STDEXEC::__anon>
35-
struct __seqexpr {
36-
using sender_concept = sequence_sender_t;
37-
using __t = __seqexpr;
38-
using __id = __seqexpr;
39-
using __desc_t = decltype(_DescriptorFn());
40-
using __tag_t = __desc_t::__tag;
41-
using __captures_t =
42-
STDEXEC::__minvoke<__desc_t, STDEXEC::__q<STDEXEC::__detail::__captures_t>>;
43-
44-
static constexpr auto __tag() noexcept -> __tag_t {
45-
return {};
46-
}
47-
48-
mutable __captures_t __impl_;
34+
namespace {
35+
template <auto _DescriptorFn>
36+
struct __seqexpr
37+
: STDEXEC::__minvoke<decltype(_DescriptorFn()), STDEXEC::__qq<STDEXEC::__tuple>> {
38+
using sender_concept = sequence_sender_t;
39+
using __t = __seqexpr;
40+
using __id = __seqexpr;
41+
using __desc_t = decltype(_DescriptorFn());
42+
using __tag_t = __desc_t::__tag;
43+
44+
static constexpr auto __tag() noexcept -> __tag_t {
45+
return {};
46+
}
47+
48+
template <class _Self = __seqexpr>
49+
auto get_env() const noexcept -> decltype(_Self::__tag().get_env(*this)) {
50+
static_assert(noexcept(_Self::__tag().get_env(*this)));
51+
return _Self::__tag().get_env(*this);
52+
}
53+
54+
template <class _Self, class... _Env>
55+
static consteval auto get_completion_signatures() {
56+
static_assert(STDEXEC::__decays_to_derived_from<_Self, __seqexpr>);
57+
return __tag_t::template get_completion_signatures<_Self, _Env...>();
58+
}
59+
60+
template <class _Self, class... _Env>
61+
static consteval auto get_item_types() {
62+
static_assert(STDEXEC::__decays_to_derived_from<_Self, __seqexpr>);
63+
return __tag_t::template get_item_types<_Self, _Env...>();
64+
}
65+
66+
template <class _Self, STDEXEC::receiver _Receiver>
67+
static auto subscribe(_Self&& __self, _Receiver&& __rcvr) noexcept(noexcept(
68+
__self.__tag().subscribe(static_cast<_Self&&>(__self), static_cast<_Receiver&&>(__rcvr))))
69+
-> decltype(__self.__tag()
70+
.subscribe(static_cast<_Self&&>(__self), static_cast<_Receiver&&>(__rcvr))) {
71+
static_assert(STDEXEC::__decays_to_derived_from<_Self, __seqexpr>);
72+
return __tag_t::subscribe(static_cast<_Self&&>(__self), static_cast<_Receiver&&>(__rcvr));
73+
}
74+
};
4975

5076
template <class _Tag, class _Data, class... _Child>
5177
STDEXEC_ATTRIBUTE(host, device)
52-
explicit __seqexpr(_Tag, _Data&& __data, _Child&&... __child)
53-
: __impl_(
54-
STDEXEC::__detail::__captures(
55-
_Tag(),
56-
static_cast<_Data&&>(__data),
57-
static_cast<_Child&&>(__child)...)) {
58-
}
59-
60-
template <STDEXEC::__std::same_as<__seqexpr> _Self = __seqexpr>
61-
auto get_env() const noexcept -> decltype(_Self::__tag().get_env(*this)) {
62-
static_assert(noexcept(_Self::__tag().get_env(*this)));
63-
return _Self::__tag().get_env(*this);
64-
}
65-
66-
template <STDEXEC::__decays_to_derived_from<__seqexpr> _Self, class... _Env>
67-
static consteval auto get_completion_signatures() {
68-
return __tag_t::template get_completion_signatures<_Self, _Env...>();
69-
}
70-
71-
template <STDEXEC::__decays_to_derived_from<__seqexpr> _Self, class... _Env>
72-
static consteval auto get_item_types() {
73-
return __tag_t::template get_item_types<_Self, _Env...>();
74-
}
75-
76-
template <STDEXEC::__decays_to_derived_from<__seqexpr> _Self, STDEXEC::receiver _Receiver>
77-
static auto subscribe(_Self&& __self, _Receiver&& __rcvr) noexcept(noexcept(
78-
__self.__tag().subscribe(static_cast<_Self&&>(__self), static_cast<_Receiver&&>(__rcvr))))
79-
-> decltype(__self.__tag()
80-
.subscribe(static_cast<_Self&&>(__self), static_cast<_Receiver&&>(__rcvr))) {
81-
return __tag_t::subscribe(static_cast<_Self&&>(__self), static_cast<_Receiver&&>(__rcvr));
82-
}
83-
84-
template <class _Sequence, class _ApplyFn>
85-
static auto apply(_Sequence&& __sequence, _ApplyFn&& __fun)
86-
noexcept(STDEXEC::__nothrow_callable<
87-
STDEXEC::__detail::__impl_of<_Sequence>,
88-
STDEXEC::__copy_cvref_fn<_Sequence>,
89-
_ApplyFn
90-
>)
91-
-> STDEXEC::__call_result_t<
92-
STDEXEC::__detail::__impl_of<_Sequence>,
93-
STDEXEC::__copy_cvref_fn<_Sequence>,
94-
_ApplyFn
95-
> {
96-
return static_cast<_Sequence&&>(__sequence)
97-
.__impl_(STDEXEC::__copy_cvref_fn<_Sequence>(), static_cast<_ApplyFn&&>(__fun));
98-
}
99-
};
100-
101-
template <class _Tag, class _Data, class... _Child>
102-
STDEXEC_ATTRIBUTE(host, device)
103-
__seqexpr(_Tag, _Data, _Child...) -> __seqexpr<STDEXEC_SEXPR_DESCRIPTOR(_Tag, _Data, _Child...)>;
78+
__seqexpr(_Tag, _Data, _Child...)
79+
-> __seqexpr<STDEXEC_SEXPR_DESCRIPTOR(_Tag, _Data, _Child...)>;
80+
} // namespace
10481

10582
template <class _Tag, class _Data, class... _Child>
10683
using __seqexpr_t = __seqexpr<STDEXEC_SEXPR_DESCRIPTOR(_Tag, _Data, _Child...)>;

include/exec/finally.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -313,15 +313,15 @@ namespace exec {
313313

314314
template <class _Sender>
315315
static auto transform_sender(STDEXEC::set_value_t, _Sender&& __sndr, __ignore) {
316-
return __sexpr_apply(
317-
static_cast<_Sender&&>(__sndr),
316+
return __apply(
318317
[]<class _Initial, class _Final>(
319318
__ignore, __ignore, _Initial&& __initial, _Final&& __final) {
320319
using __result_sndr_t =
321320
__t<__sender<__id<__decay_t<_Initial>>, __id<__decay_t<_Final>>>>;
322321
return __result_sndr_t{
323322
static_cast<_Initial&&>(__initial), static_cast<_Final&&>(__final)};
324-
});
323+
},
324+
static_cast<_Sender&&>(__sndr));
325325
}
326326
};
327327
} // namespace __final

include/exec/libdispatch_queue.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,8 @@ namespace exec {
120120
auto sched =
121121
STDEXEC::get_completion_scheduler<STDEXEC::set_value_t>(STDEXEC::get_env(sndr), env);
122122
static_assert(std::is_same_v<decltype(sched), libdispatch_scheduler>);
123-
return STDEXEC::__sexpr_apply(
124-
std::forward<Sender>(sndr), __libdispatch_bulk::transform_bulk{*sched.queue_});
123+
return STDEXEC::__apply(
124+
__libdispatch_bulk::transform_bulk{*sched.queue_}, std::forward<Sender>(sndr));
125125
} else {
126126
return STDEXEC::__not_a_sender<
127127
STDEXEC::_WHAT_<>(CANNOT_DISPATCH_THE_BULK_ALGORITHM_TO_THE_LIBDISPATCH_SCHEDULER),

include/exec/repeat_effect_until.hpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,7 @@ namespace exec {
8989
trampoline_scheduler __sched_;
9090

9191
__repeat_effect_state(_Sender &&__sndr, _Receiver &)
92-
: __child_(
93-
__sexpr_apply(static_cast<_Sender &&>(__sndr), STDEXEC::__detail::__get_data())) {
92+
: __child_(STDEXEC::__get<1>(static_cast<_Sender &&>(__sndr))) {
9493
__connect();
9594
}
9695

@@ -227,10 +226,11 @@ namespace exec {
227226

228227
template <class _Sender>
229228
auto transform_sender(STDEXEC::set_value_t, _Sender &&__sndr, __ignore) {
230-
return __sexpr_apply(
231-
static_cast<_Sender &&>(__sndr), []<class _Child>(__ignore, __ignore, _Child __child) {
229+
return STDEXEC::__apply(
230+
[]<class _Child>(__ignore, __ignore, _Child __child) {
232231
return __make_sexpr<__repeat_effect_until_tag>(std::move(__child));
233-
});
232+
},
233+
static_cast<_Sender &&>(__sndr));
234234
}
235235
};
236236

@@ -255,9 +255,9 @@ namespace exec {
255255

256256
template <class _Sender>
257257
auto transform_sender(STDEXEC::set_value_t, _Sender &&__sndr, __ignore) {
258-
return __sexpr_apply(static_cast<_Sender &&>(__sndr), [](__ignore, __ignore, auto __child) {
258+
return STDEXEC::__apply([](__ignore, __ignore, auto __child) {
259259
return repeat_effect_until_t{}(STDEXEC::then(std::move(__child), _never{}));
260-
});
260+
}, static_cast<_Sender &&>(__sndr));
261261
}
262262
};
263263
} // namespace __repeat_effect

include/exec/repeat_n.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ namespace exec {
9292
using __child_op_t = STDEXEC::connect_result_t<__child_on_sched_sender_t, __receiver_t>;
9393

9494
__repeat_n_state(_Sender &&__sndr, _Receiver &)
95-
: __pair_(__sexpr_apply(static_cast<_Sender &&>(__sndr), STDEXEC::__detail::__get_data())) {
95+
: __pair_(STDEXEC::__get<1>(static_cast<_Sender &&>(__sndr))) {
9696
// Q: should we skip __connect() if __count_ == 0?
9797
__connect();
9898
}
@@ -208,11 +208,11 @@ namespace exec {
208208

209209
template <class _Sender, bool _NoThrow = __nothrow_decay_copyable<_Sender>>
210210
auto transform_sender(set_value_t, _Sender &&__sndr, __ignore) noexcept(_NoThrow) {
211-
return __sexpr_apply(
212-
static_cast<_Sender &&>(__sndr),
211+
return __apply(
213212
[]<class _Child>(__ignore, std::size_t __count, _Child __child) noexcept(_NoThrow) {
214213
return __make_sexpr<__repeat_n_tag>(__child_count_pair{std::move(__child), __count});
215-
});
214+
},
215+
static_cast<_Sender &&>(__sndr));
216216
}
217217
};
218218
} // namespace __repeat_n

include/exec/sequence/ignore_all_values.hpp

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -330,24 +330,12 @@ namespace exec {
330330
template <class _Child, class _Receiver>
331331
using __receiver_t = __t<__receiver<__id<_Receiver>, _ResultVariant<_Child, _Receiver>>>;
332332

333-
// static constexpr auto get_state =
334-
// []<class _Sender, class _Receiver>(_Sender&& __sndr, _Receiver& __rcvr) noexcept(
335-
// __nothrow_callable<__sexpr_apply_t, _Sender, __connect_fn<__rcvr_ref_t<_Receiver>>>)
336-
// -> __call_result_t<__sexpr_apply_t, _Sender, __connect_fn<__rcvr_ref_t<_Receiver>>> {
337-
// static_assert(sender_expr_for<_Sender, ignore_all_values_t>);
338-
// return __sexpr_apply(static_cast<_Sender&&>(__sndr), __connect_fn{__ref_rcvr(__rcvr)});
339-
// };
340-
341-
// static constexpr auto start = [](auto& __state, __ignore, __ignore) noexcept -> void {
342-
// STDEXEC::start(__state);
343-
// };
344-
345333
static constexpr auto connect =
346334
[]<class _Sender, receiver _Receiver>(_Sender&& __sndr, _Receiver __rcvr) noexcept(
347-
__nothrow_callable<__sexpr_apply_t, _Sender, __connect_fn<_Receiver>>)
348-
-> __call_result_t<__sexpr_apply_t, _Sender, __connect_fn<_Receiver>> {
335+
__nothrow_applicable<__connect_fn<_Receiver>, _Sender>)
336+
-> __apply_result_t<__connect_fn<_Receiver>, _Sender> {
349337
static_assert(sender_expr_for<_Sender, ignore_all_values_t>);
350-
return __sexpr_apply(static_cast<_Sender&&>(__sndr), __connect_fn<_Receiver>{__rcvr});
338+
return __apply(__connect_fn<_Receiver>{__rcvr}, static_cast<_Sender&&>(__sndr));
351339
};
352340
};
353341
} // namespace __ignore_all_values

include/exec/sequence/iterate.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,9 @@ namespace exec {
190190
>
191191
requires sender_to<_NextSender<_SeqExpr, _Receiver>, _NextReceiver<_SeqExpr, _Receiver>>
192192
static auto subscribe(_SeqExpr&& __seq, _Receiver __rcvr)
193-
noexcept(__nothrow_callable<__sexpr_apply_t, _SeqExpr, __subscribe_fn<_Receiver>>)
194-
-> __call_result_t<__sexpr_apply_t, _SeqExpr, __subscribe_fn<_Receiver>> {
195-
return __sexpr_apply(static_cast<_SeqExpr&&>(__seq), __subscribe_fn<_Receiver>{__rcvr});
193+
noexcept(__nothrow_applicable<__subscribe_fn<_Receiver>, _SeqExpr>)
194+
-> __apply_result_t<__subscribe_fn<_Receiver>, _SeqExpr> {
195+
return __apply(__subscribe_fn<_Receiver>{__rcvr}, static_cast<_SeqExpr&&>(__seq));
196196
}
197197

198198
template <class, class...>

include/exec/sequence/merge.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,9 +214,9 @@ namespace exec {
214214

215215
template <sender_expr_for<merge_t> _Self, receiver _Receiver>
216216
static auto subscribe(_Self&& __self, _Receiver __rcvr)
217-
noexcept(__nothrow_callable<__sexpr_apply_t, _Self, __subscribe_fn<_Receiver>>)
218-
-> __sexpr_apply_result_t<_Self, __subscribe_fn<_Receiver>> {
219-
return __sexpr_apply(static_cast<_Self&&>(__self), __subscribe_fn<_Receiver>{__rcvr});
217+
noexcept(__nothrow_applicable<__subscribe_fn<_Receiver>, _Self>)
218+
-> __apply_result_t<__subscribe_fn<_Receiver>, _Self> {
219+
return __apply(__subscribe_fn<_Receiver>{__rcvr}, static_cast<_Self&&>(__self));
220220
}
221221
};
222222
} // namespace __merge

include/exec/sequence/merge_each.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1288,10 +1288,10 @@ namespace exec {
12881288

12891289
static constexpr auto subscribe =
12901290
[]<class _Sequence, receiver _Receiver>(_Sequence&& __sndr, _Receiver __rcvr) noexcept(
1291-
__nothrow_callable<__sexpr_apply_t, _Sequence, __subscribe_fn<_Receiver>>)
1292-
-> __sexpr_apply_result_t<_Sequence, __subscribe_fn<_Receiver>> {
1291+
__nothrow_applicable<__subscribe_fn<_Receiver>, _Sequence>)
1292+
-> __apply_result_t<__subscribe_fn<_Receiver>, _Sequence> {
12931293
static_assert(sender_expr_for<_Sequence, merge_each_t>);
1294-
return __sexpr_apply(static_cast<_Sequence&&>(__sndr), __subscribe_fn<_Receiver>{__rcvr});
1294+
return __apply(__subscribe_fn<_Receiver>{__rcvr}, static_cast<_Sequence&&>(__sndr));
12951295
};
12961296
};
12971297
} // namespace __merge_each

include/exec/sequence/transform_each.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -259,16 +259,16 @@ namespace exec {
259259

260260
template <sender_expr_for<transform_each_t> _Self, receiver _Receiver>
261261
static auto subscribe(_Self&& __self, _Receiver __rcvr)
262-
noexcept(__nothrow_callable<__sexpr_apply_t, _Self, __subscribe_fn<_Receiver>>)
263-
-> __call_result_t<__sexpr_apply_t, _Self, __subscribe_fn<_Receiver>> {
264-
return __sexpr_apply(static_cast<_Self&&>(__self), __subscribe_fn<_Receiver>{__rcvr});
262+
noexcept(__nothrow_applicable<__subscribe_fn<_Receiver>, _Self>)
263+
-> __apply_result_t<__subscribe_fn<_Receiver>, _Self> {
264+
return __apply(__subscribe_fn<_Receiver>{__rcvr}, static_cast<_Self&&>(__self));
265265
}
266266

267267
template <sender_expr_for<transform_each_t> _Sexpr>
268268
static auto get_env(const _Sexpr& __sexpr) noexcept -> env_of_t<__child_of<_Sexpr>> {
269-
return __sexpr_apply(__sexpr, []<class _Child>(__ignore, __ignore, const _Child& __child) {
269+
return __apply([]<class _Child>(__ignore, __ignore, const _Child& __child) {
270270
return STDEXEC::get_env(__child);
271-
});
271+
}, __sexpr);
272272
}
273273
};
274274
} // namespace __transform_each

0 commit comments

Comments
 (0)