Skip to content

Commit 86ecb14

Browse files
committed
fix the domain used to find customizations within repeat_n, repeat_effect_until, and iterate
1 parent 0d0a15c commit 86ecb14

4 files changed

Lines changed: 40 additions & 30 deletions

File tree

include/exec/repeat_effect_until.hpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "../stdexec/__detail/__manual_lifetime.hpp"
2323

2424
#include "trampoline_scheduler.hpp"
25+
#include "sequence.hpp"
2526

2627
#include <atomic>
2728
#include <exception>
@@ -77,7 +78,7 @@ namespace exec {
7778
using __child_t = __decay_t<__data_of<_Sender>>;
7879
using __receiver_t = stdexec::__t<__receiver<__id<_Sender>, __id<_Receiver>>>;
7980
using __child_on_sched_sender_t =
80-
__result_of<stdexec::starts_on, trampoline_scheduler, __child_t &>;
81+
__result_of<exec::sequence, schedule_result_t<trampoline_scheduler>, __child_t &>;
8182
using __child_op_t = stdexec::connect_result_t<__child_on_sched_sender_t, __receiver_t>;
8283

8384
__child_t __child_;
@@ -103,7 +104,8 @@ namespace exec {
103104

104105
void __connect() {
105106
__child_op_.__construct_from([this] {
106-
return stdexec::connect(stdexec::starts_on(__sched_, __child_), __receiver_t{this});
107+
return stdexec::connect(
108+
exec::sequence(stdexec::schedule(__sched_), __child_), __receiver_t{this});
107109
});
108110
}
109111

@@ -172,6 +174,7 @@ namespace exec {
172174
>;
173175

174176
struct __repeat_effect_tag { };
177+
175178
struct __repeat_effect_until_tag { };
176179

177180
struct __repeat_effect_until_impl : __sexpr_defaults {
@@ -218,7 +221,7 @@ namespace exec {
218221
struct _never {
219222
template <class... _Args>
220223
STDEXEC_ATTRIBUTE(host, device, always_inline)
221-
constexpr auto operator()(_Args &&...) const noexcept -> bool{
224+
constexpr auto operator()(_Args &&...) const noexcept -> bool {
222225
return false;
223226
}
224227
};
@@ -231,6 +234,7 @@ namespace exec {
231234
}
232235

233236
STDEXEC_ATTRIBUTE(always_inline)
237+
234238
constexpr auto operator()() const -> __binder_back<repeat_effect_t> {
235239
return {{}, {}, {}};
236240
}

include/exec/repeat_n.hpp

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "../stdexec/__detail/__manual_lifetime.hpp"
2323

2424
#include "trampoline_scheduler.hpp"
25+
#include "sequence.hpp"
2526

2627
#include <atomic>
2728
#include <cstddef>
@@ -89,7 +90,7 @@ namespace exec {
8990
using __child_t = decltype(__child_count_pair_t::__child_);
9091
using __receiver_t = stdexec::__t<__receiver<__id<_Sender>, __id<_Receiver>>>;
9192
using __child_on_sched_sender_t =
92-
__result_of<stdexec::starts_on, trampoline_scheduler, __child_t &>;
93+
__result_of<exec::sequence, schedule_result_t<trampoline_scheduler>, __child_t &>;
9394
using __child_op_t = stdexec::connect_result_t<__child_on_sched_sender_t, __receiver_t>;
9495

9596
__child_count_pair<__child_t> __pair_;
@@ -116,17 +117,16 @@ namespace exec {
116117
void __connect() {
117118
__child_op_.__construct_from([this] {
118119
return stdexec::connect(
119-
stdexec::starts_on(__sched_, __pair_.__child_), __receiver_t{this});
120+
exec::sequence(stdexec::schedule(__sched_), __pair_.__child_), __receiver_t{this});
120121
});
121122
}
122123

123124
void __start() noexcept {
124125
if (__pair_.__count_ == 0) {
125126
stdexec::set_value(static_cast<_Receiver &&>(this->__receiver()));
126127
} else {
127-
128-
const bool __already_started [[maybe_unused]]
129-
= __started_.test_and_set(std::memory_order_relaxed);
128+
[[maybe_unused]]
129+
const bool __already_started = __started_.test_and_set(std::memory_order_relaxed);
130130
STDEXEC_ASSERT(!__already_started);
131131
stdexec::start(__child_op_.__get());
132132
}
@@ -157,19 +157,20 @@ namespace exec {
157157

158158
STDEXEC_PRAGMA_POP()
159159

160-
template <
161-
__mstring _Where = "In repeat_n: "_mstr,
162-
__mstring _What = "The input sender must be a sender of void"_mstr
163-
>
164-
struct _INVALID_ARGUMENT_TO_REPEAT_N_ { };
160+
struct repeat_n_t;
161+
struct _REPEAT_N_EXPECTS_A_SENDER_OF_VOID_;
165162

166163
template <class _Sender, class... _Args>
167164
using __values_t =
168165
// There's something funny going on with __if_c here. Use std::conditional_t instead. :-(
169166
std::conditional_t<
170167
(sizeof...(_Args) == 0),
171168
completion_signatures<>,
172-
__mexception<_INVALID_ARGUMENT_TO_REPEAT_N_<>, _WITH_SENDER_<_Sender>>
169+
__mexception<
170+
_REPEAT_N_EXPECTS_A_SENDER_OF_VOID_,
171+
_WHERE_(_IN_ALGORITHM_, repeat_n_t),
172+
_WITH_SENDER_<_Sender>
173+
>
173174
>;
174175

175176
template <class _Error>

include/exec/sequence/iterate.hpp

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
# include "../__detail/__basic_sequence.hpp"
2727

2828
# include "../trampoline_scheduler.hpp"
29+
# include "../sequence.hpp"
2930

3031
# include <exception>
3132
# include <ranges>
@@ -110,13 +111,13 @@ namespace exec {
110111
using _Receiver = stdexec::__t<_ReceiverId>;
111112
_Receiver __rcvr_;
112113

113-
using _ItemSender = decltype(stdexec::starts_on(
114-
std::declval<trampoline_scheduler&>(),
115-
std::declval<__sender_t<_Range>>()));
116-
114+
using __item_sender_t =
115+
__result_of<exec::sequence, schedule_result_t<trampoline_scheduler&>, __sender_t<_Range>>;
117116
using __next_receiver_t = stdexec::__t<__next_receiver<_Range, _ReceiverId>>;
118117

119-
std::optional<connect_result_t<next_sender_of_t<_Receiver, _ItemSender>, __next_receiver_t>>
118+
std::optional<
119+
connect_result_t<next_sender_of_t<_Receiver, __item_sender_t>, __next_receiver_t>
120+
>
120121
__op_{};
121122
trampoline_scheduler __scheduler_{};
122123

@@ -128,7 +129,9 @@ namespace exec {
128129
STDEXEC_TRY {
129130
stdexec::start(__op_.emplace(__emplace_from{[&] {
130131
return stdexec::connect(
131-
exec::set_next(__rcvr_, stdexec::starts_on(__scheduler_, __sender_t<_Range>{this})),
132+
exec::set_next(
133+
__rcvr_,
134+
exec::sequence(stdexec::schedule(__scheduler_), __sender_t<_Range>{this})),
132135
__next_receiver_t{this});
133136
}}));
134137
}
@@ -171,21 +174,23 @@ namespace exec {
171174
using __completion_sigs =
172175
completion_signatures<set_value_t(), set_error_t(std::exception_ptr), set_stopped_t()>;
173176

174-
175177
template <class _Sequence>
176-
using _ItemSender = decltype(stdexec::starts_on(
177-
__declval<trampoline_scheduler&>(),
178-
__declval<__sender_t<__data_of<_Sequence>>>()));
178+
using __item_sender_t = __result_of<
179+
exec::sequence,
180+
schedule_result_t<trampoline_scheduler&>,
181+
__sender_t<__data_of<_Sequence>>
182+
>;
179183

180184
template <class _Sequence, class _Receiver>
181185
using _NextReceiver = stdexec::__t<__next_receiver<__data_of<_Sequence>, __id<_Receiver>>>;
182186

183187
template <class _Sequence, class _Receiver>
184-
using _NextSender = next_sender_of_t<_Receiver, _ItemSender<_Sequence>>;
188+
using _NextSender = next_sender_of_t<_Receiver, __item_sender_t<_Sequence>>;
185189

186190
template <
187191
sender_expr_for<iterate_t> _SeqExpr,
188-
sequence_receiver_of<item_types<_ItemSender<_SeqExpr>>> _Receiver>
192+
sequence_receiver_of<item_types<__item_sender_t<_SeqExpr>>> _Receiver
193+
>
189194
requires sender_to<_NextSender<_SeqExpr, _Receiver>, _NextReceiver<_SeqExpr, _Receiver>>
190195
static auto subscribe(_SeqExpr&& __seq, _Receiver __rcvr)
191196
noexcept(__nothrow_callable<__sexpr_apply_t, _SeqExpr, __subscribe_fn<_Receiver>>)
@@ -200,7 +205,7 @@ namespace exec {
200205

201206
template <sender_expr_for<iterate_t> _Sequence>
202207
static auto get_item_types(_Sequence&&, __ignore) noexcept //
203-
-> item_types<_ItemSender<_Sequence>> {
208+
-> item_types<__item_sender_t<_Sequence>> {
204209
return {};
205210
}
206211

include/stdexec/__detail/__env.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -740,15 +740,15 @@ namespace stdexec {
740740
using __id = __sched_env;
741741

742742
using __scheduler_t = __decay_t<_Scheduler>;
743+
using __sched_domain_t = __query_result_or_t<get_domain_t, __scheduler_t, default_domain>;
743744
_Scheduler __sched_;
744745

745746
auto query(get_scheduler_t) const noexcept -> __scheduler_t {
746747
return __sched_;
747748
}
748749

749-
template <class _Sched = _Scheduler>
750-
auto query(get_domain_t) const noexcept -> __domain_of_t<_Sched> {
751-
return get_domain(__sched_);
750+
auto query(get_domain_t) const noexcept -> __sched_domain_t {
751+
return {};
752752
}
753753
};
754754

0 commit comments

Comments
 (0)