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
}
@@ -335,7 +336,10 @@ struct repeat_while_sender {
335
336
SF factory;
336
337
};
337
338
338
- template <typename C, typename SF>
339
+ template <typename C, Sender SF>
340
+ requires std::movable<C> && requires (C c) {
341
+ { c () } -> std::convertible_to<bool >;
342
+ }
339
343
repeat_while_sender<C, SF> repeat_while (C cond, SF factory) {
340
344
return {std::move (cond), std::move (factory)};
341
345
}
@@ -351,7 +355,7 @@ template<typename... Functors>
351
355
struct race_and_cancel_sender {
352
356
using value_type = void ;
353
357
354
- template <typename Receiver>
358
+ template <Receives<value_type> Receiver>
355
359
friend race_and_cancel_operation<Receiver, frg::tuple<Functors...>,
356
360
std::index_sequence_for<Functors...>>
357
361
connect (race_and_cancel_sender s, Receiver r) {
@@ -450,7 +454,8 @@ operator co_await(race_and_cancel_sender<Functors...> s) {
450
454
return {std::move (s)};
451
455
}
452
456
453
- template <typename ... Functors>
457
+ template <std::invocable<cancellation_token>... Functors>
458
+ requires ((Sender<std::invoke_result_t <Functors, cancellation_token>>) && ...)
454
459
race_and_cancel_sender<Functors...> race_and_cancel (Functors... fs) {
455
460
return {{fs...}};
456
461
}
@@ -495,7 +500,7 @@ struct [[nodiscard]] let_sender {
495
500
using imm_type = std::invoke_result_t <Pred>;
496
501
using value_type = typename std::invoke_result_t <Func, std::add_lvalue_reference_t <imm_type>>::value_type;
497
502
498
- template <typename Receiver>
503
+ template <Receives<value_type> Receiver>
499
504
friend let_operation<Receiver, Pred, Func>
500
505
connect (let_sender s, Receiver r) {
501
506
return {std::move (s.pred ), std::move (s.func ), std::move (r)};
@@ -511,7 +516,8 @@ operator co_await(let_sender<Pred, Func> s) {
511
516
return {std::move (s)};
512
517
}
513
518
514
- template <typename Pred, typename Func>
519
+ template <std::invocable<> Pred, typename Func>
520
+ requires std::invocable<Func, std::add_lvalue_reference_t <std::invoke_result_t <Pred>>>
515
521
let_sender<Pred, Func> let (Pred pred, Func func) {
516
522
return {std::move (pred), std::move (func)};
517
523
}
@@ -689,7 +695,7 @@ template <typename ...Senders> requires (sizeof...(Senders) > 0)
689
695
struct [[nodiscard]] sequence_sender {
690
696
using value_type = typename std::tuple_element_t <sizeof ...(Senders) - 1 , frg::tuple<Senders...>>::value_type;
691
697
692
- template <typename Receiver>
698
+ template <Receives<value_type> Receiver>
693
699
friend sequence_operation<Receiver, Senders...>
694
700
connect (sequence_sender s, Receiver r) {
695
701
return {std::move (s.senders ), std::move (r)};
@@ -703,7 +709,7 @@ sequence_sender<Senders...> sequence(Senders ...senders) {
703
709
return {frg::tuple<Senders...>{std::move (senders)...}};
704
710
}
705
711
706
- template <typename ...Senders>
712
+ template <Sender ...Senders>
707
713
sender_awaiter<sequence_sender<Senders...>, typename sequence_sender<Senders...>::value_type>
708
714
operator co_await (sequence_sender<Senders...> s) {
709
715
return {std::move (s)};
@@ -778,7 +784,7 @@ template <typename ...Senders> requires (sizeof...(Senders) > 0)
778
784
struct [[nodiscard]] when_all_sender {
779
785
using value_type = void ;
780
786
781
- template <typename Receiver>
787
+ template <Receives<value_type> Receiver>
782
788
friend when_all_operation<Receiver, Senders...>
783
789
connect (when_all_sender s, Receiver r) {
784
790
return {std::move (s.senders ), std::move (r)};
@@ -787,7 +793,8 @@ struct [[nodiscard]] when_all_sender {
787
793
frg::tuple<Senders...> senders;
788
794
};
789
795
790
- template <typename ...Senders> requires (sizeof ...(Senders) > 0)
796
+ template <Sender ...Senders>
797
+ requires (sizeof ...(Senders) > 0 )
791
798
when_all_sender<Senders...> when_all (Senders ...senders) {
792
799
return {frg::tuple<Senders...>{std::move (senders)...}};
793
800
}
0 commit comments