10
10
11
11
namespace async {
12
12
13
- template <typename Sender, typename Receiver>
13
+ template <Sender Sender, Receives< typename Sender::value_type> Receiver>
14
14
struct connect_helper {
15
15
using operation = execution::operation_t <Sender, Receiver>;
16
16
@@ -22,7 +22,7 @@ struct connect_helper {
22
22
Receiver r;
23
23
};
24
24
25
- template <typename Sender, typename Receiver>
25
+ template <Sender Sender, Receives< typename Sender::value_type> Receiver>
26
26
connect_helper<Sender, Receiver> make_connect_helper (Sender s, Receiver r) {
27
27
return {std::move (s), std::move (r)};
28
28
}
@@ -59,7 +59,7 @@ template<typename F>
59
59
struct [[nodiscard]] invocable_sender {
60
60
using value_type = std::invoke_result_t <F>;
61
61
62
- template <typename R>
62
+ template <Receives<value_type> R>
63
63
invocable_operation<F, R> connect (R r) {
64
64
return {std::move (f), std::move (r)};
65
65
}
@@ -165,7 +165,7 @@ requires std::same_as<typename Sender::value_type, void>
165
165
struct [[nodiscard]] transform_sender<Sender, F> {
166
166
using value_type = std::invoke_result_t <F>;
167
167
168
- template <typename Receiver>
168
+ template <Receives<value_type> Receiver>
169
169
friend auto connect (transform_sender s, Receiver dr) {
170
170
return execution::connect (std::move (s.ds ),
171
171
void_transform_receiver<Receiver, F>{std::move (dr), std::move (s.f )});
@@ -234,7 +234,7 @@ struct [[nodiscard]] ite_sender {
234
234
ite_sender (C cond, ST then_s, SE else_s)
235
235
: cond_{std::move (cond)}, then_s_{std::move (then_s)}, else_s_{std::move (else_s)} { }
236
236
237
- template <typename R>
237
+ template <Receives<value_type> R>
238
238
ite_operation<C, ST, SE, R> connect (R dr) {
239
239
return {std::move (cond_), std::move (then_s_), std::move (else_s_), std::move (dr)};
240
240
}
@@ -249,7 +249,8 @@ struct [[nodiscard]] ite_sender {
249
249
SE else_s_;
250
250
};
251
251
252
- template <typename C, typename ST, typename SE>
252
+ template <std::invocable<> C, Sender ST, Sender SE>
253
+ requires std::same_as<typename ST::value_type, typename SE::value_type>
253
254
ite_sender<C, ST, SE> ite (C cond, ST then_s, SE else_s) {
254
255
return {std::move (cond), std::move (then_s), std::move (else_s)};
255
256
}
@@ -326,7 +327,7 @@ struct repeat_while_sender {
326
327
return {std::move (*this )};
327
328
}
328
329
329
- template <typename R>
330
+ template <Receives<value_type> R>
330
331
repeat_while_operation<C, SF, R> connect (R receiver) {
331
332
return {std::move (cond), std::move (factory), std::move (receiver)};
332
333
}
@@ -336,6 +337,10 @@ struct repeat_while_sender {
336
337
};
337
338
338
339
template <typename C, typename SF>
340
+ requires std::move_constructible<C> && requires (C c, SF sf) {
341
+ { c () } -> std::convertible_to<bool >;
342
+ { sf () } -> Sender;
343
+ }
339
344
repeat_while_sender<C, SF> repeat_while (C cond, SF factory) {
340
345
return {std::move (cond), std::move (factory)};
341
346
}
@@ -351,7 +356,7 @@ template<typename... Functors>
351
356
struct race_and_cancel_sender {
352
357
using value_type = void ;
353
358
354
- template <typename Receiver>
359
+ template <Receives<value_type> Receiver>
355
360
friend race_and_cancel_operation<Receiver, frg::tuple<Functors...>,
356
361
std::index_sequence_for<Functors...>>
357
362
connect (race_and_cancel_sender s, Receiver r) {
@@ -450,7 +455,8 @@ operator co_await(race_and_cancel_sender<Functors...> s) {
450
455
return {std::move (s)};
451
456
}
452
457
453
- template <typename ... Functors>
458
+ template <std::invocable<cancellation_token>... Functors>
459
+ requires ((Sender<std::invoke_result_t <Functors, cancellation_token>>) && ...)
454
460
race_and_cancel_sender<Functors...> race_and_cancel (Functors... fs) {
455
461
return {{fs...}};
456
462
}
@@ -495,7 +501,7 @@ struct [[nodiscard]] let_sender {
495
501
using imm_type = std::invoke_result_t <Pred>;
496
502
using value_type = typename std::invoke_result_t <Func, std::add_lvalue_reference_t <imm_type>>::value_type;
497
503
498
- template <typename Receiver>
504
+ template <Receives<value_type> Receiver>
499
505
friend let_operation<Receiver, Pred, Func>
500
506
connect (let_sender s, Receiver r) {
501
507
return {std::move (s.pred ), std::move (s.func ), std::move (r)};
@@ -511,7 +517,10 @@ operator co_await(let_sender<Pred, Func> s) {
511
517
return {std::move (s)};
512
518
}
513
519
514
- template <typename Pred, typename Func>
520
+ template <std::invocable<> Pred, typename Func>
521
+ requires requires (Func func, Pred pred) {
522
+ func (std::declval<std::add_lvalue_reference_t <decltype (pred ())>>());
523
+ }
515
524
let_sender<Pred, Func> let (Pred pred, Func func) {
516
525
return {std::move (pred), std::move (func)};
517
526
}
@@ -703,7 +712,7 @@ sequence_sender<Senders...> sequence(Senders ...senders) {
703
712
return {frg::tuple<Senders...>{std::move (senders)...}};
704
713
}
705
714
706
- template <typename ...Senders>
715
+ template <Sender ...Senders>
707
716
sender_awaiter<sequence_sender<Senders...>, typename sequence_sender<Senders...>::value_type>
708
717
operator co_await (sequence_sender<Senders...> s) {
709
718
return {std::move (s)};
@@ -778,7 +787,7 @@ template <typename ...Senders> requires (sizeof...(Senders) > 0)
778
787
struct [[nodiscard]] when_all_sender {
779
788
using value_type = void ;
780
789
781
- template <typename Receiver>
790
+ template <Receives<value_type> Receiver>
782
791
friend when_all_operation<Receiver, Senders...>
783
792
connect (when_all_sender s, Receiver r) {
784
793
return {std::move (s.senders ), std::move (r)};
@@ -787,7 +796,8 @@ struct [[nodiscard]] when_all_sender {
787
796
frg::tuple<Senders...> senders;
788
797
};
789
798
790
- template <typename ...Senders> requires (sizeof ...(Senders) > 0)
799
+ template <Sender ...Senders>
800
+ requires (sizeof ...(Senders) > 0 )
791
801
when_all_sender<Senders...> when_all (Senders ...senders) {
792
802
return {frg::tuple<Senders...>{std::move (senders)...}};
793
803
}
0 commit comments