Skip to content

Commit cad563e

Browse files
authored
fixed store_receiver
* fixed some types of when_all * removed debug output * added missing import * fixed the result computation using the stop token * clang format * constrained sender_decompose to be only used with basic_sender * fixed a problem with the store_receiver ... get_completion_signatures * clang format * removed a debugging template argument * fix an odd strict warning
1 parent b782a12 commit cad563e

8 files changed

Lines changed: 72 additions & 43 deletions

File tree

include/beman/execution/detail/basic_sender.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ inline constexpr sub_apply_t sub_apply{};
6666
template <typename Tag, typename Data, typename... Child>
6767
struct basic_sender : ::beman::execution::detail::product_type<Tag, Data, Child...> {
6868
//-dk:TODO friend struct ::beman::execution::detail::connect_t;
69-
using sender_concept = ::beman::execution::sender_t;
70-
using indices_for = ::std::index_sequence_for<Child...>;
69+
using sender_concept = ::beman::execution::sender_t;
70+
using is_basic_sender_tag = void; //-dk:TODO need a better way to detect this is a basic sender
71+
using indices_for = ::std::index_sequence_for<Child...>;
7172
static constexpr ::std::integral_constant<::std::size_t, sizeof...(Child) + 2> size{};
7273

7374
auto get_env() const noexcept -> decltype(auto) {

include/beman/execution/detail/inline_scheduler.hpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,6 @@ struct inline_scheduler {
6060

6161
static constexpr auto get_env() noexcept -> env { return {}; }
6262

63-
template <typename, typename...>
64-
static consteval auto get_completion_signatures() noexcept -> completion_signatures {
65-
return {};
66-
}
67-
6863
template <::beman::execution::receiver Rcvr>
6964
auto connect(Rcvr&& receiver) noexcept(::std::is_nothrow_constructible_v<::std::remove_cvref_t<Rcvr>, Rcvr>)
7065
-> state<Rcvr> {

include/beman/execution/detail/sender_decompose.hpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,12 @@ auto get_sender_data(Sender&& sender) {
5151
using sender_type = ::std::remove_cvref_t<Sender>;
5252
static constexpr ::beman::execution::detail::sender_convert_to_any_t at{};
5353

54-
if constexpr (requires {
55-
sender.template get<0>();
56-
sender.size();
57-
})
54+
if constexpr (!requires { typename sender_type::is_basic_sender_tag; }) {
55+
return ::beman::execution::detail::sender_meta<void, void, void>{};
56+
} else if constexpr (requires {
57+
sender.template get<0>();
58+
sender.size();
59+
})
5860
return [&sender]<::std::size_t... I>(::std::index_sequence<I...>) {
5961
return ::beman::execution::detail::sender_data{
6062
sender.template get<0>(), sender.template get<1>(), ::std::tie(sender.template get<2 + I>()...)};

include/beman/execution/detail/store_receiver.hpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,15 @@ struct store_receiver_t {
7979
template <::beman::execution::sender Sndr, typename Trans>
8080
struct sender {
8181
using sender_concept = ::beman::execution::sender_t;
82-
template <typename... Env>
83-
static consteval auto get_completion_signatures(Env&&... env) noexcept {
84-
return ::beman::execution::
85-
get_completion_signatures<decltype(::std::declval<Trans>()(::std::declval<Sndr>())), Env...>();
82+
using trans_t = ::std::remove_cvref_t<Trans>;
83+
template <typename, typename... Env>
84+
static consteval auto get_completion_signatures() noexcept {
85+
return ::beman::execution::get_completion_signatures<
86+
decltype(::std::declval<trans_t>()(::std::declval<Sndr>(), ::std::declval<Env>()...)),
87+
Env...>();
8688
}
87-
::std::remove_cvref_t<Sndr> sndr;
88-
::std::remove_cvref_t<Trans> trans;
89+
::std::remove_cvref_t<Sndr> sndr;
90+
trans_t trans;
8991

9092
template <::beman::execution::receiver Receiver>
9193
auto connect(Receiver&& r) && {

tests/beman/execution/exec-domain-default.test.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ struct tag {
6262

6363
template <bool Noexcept>
6464
struct tagged_sender {
65-
using sender_concept = test_std::sender_t;
65+
using sender_concept = test_std::sender_t;
66+
using is_basic_sender_tag = void;
6667
tag<Noexcept> t{};
6768
int value{17};
6869
int args{};

tests/beman/execution/exec-snd-concepts.test.cpp

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,33 +33,38 @@ struct own_sender {
3333

3434
struct tag_t {};
3535
struct tagged_sender {
36-
using sender_concept = test_std::sender_t;
36+
using sender_concept = test_std::sender_t;
37+
using is_basic_sender_tag = void;
3738
tag_t tag;
3839
int data;
3940
};
4041
struct tagged_sender1 {
41-
using sender_concept = test_std::sender_t;
42+
using sender_concept = test_std::sender_t;
43+
using is_basic_sender_tag = void;
4244
tag_t tag;
4345
int data;
4446
int child1;
4547
};
4648
struct tagged_sender2 {
47-
using sender_concept = test_std::sender_t;
49+
using sender_concept = test_std::sender_t;
50+
using is_basic_sender_tag = void;
4851
tag_t tag;
4952
int data;
5053
int child1;
5154
int child2;
5255
};
5356
struct tagged_sender3 {
54-
using sender_concept = test_std::sender_t;
57+
using sender_concept = test_std::sender_t;
58+
using is_basic_sender_tag = void;
5559
tag_t tag;
5660
int data;
5761
int child1;
5862
int child2;
5963
int child3;
6064
};
6165
struct tagged_sender4 {
62-
using sender_concept = test_std::sender_t;
66+
using sender_concept = test_std::sender_t;
67+
using is_basic_sender_tag = void;
6368
tag_t tag;
6469
int data;
6570
int child1;
@@ -68,19 +73,24 @@ struct tagged_sender4 {
6873
int child4;
6974
};
7075
struct product_sender0 : test_detail::product_type<tag_t, int> {
71-
using sender_concept = test_std::sender_t;
76+
using sender_concept = test_std::sender_t;
77+
using is_basic_sender_tag = void;
7278
};
7379
struct product_sender1 : test_detail::product_type<tag_t, int, int> {
74-
using sender_concept = test_std::sender_t;
80+
using sender_concept = test_std::sender_t;
81+
using is_basic_sender_tag = void;
7582
};
7683
struct product_sender2 : test_detail::product_type<tag_t, int, int, int> {
77-
using sender_concept = test_std::sender_t;
84+
using sender_concept = test_std::sender_t;
85+
using is_basic_sender_tag = void;
7886
};
7987
struct product_sender3 : test_detail::product_type<tag_t, int, int, int, int> {
80-
using sender_concept = test_std::sender_t;
88+
using sender_concept = test_std::sender_t;
89+
using is_basic_sender_tag = void;
8190
};
8291
struct product_sender4 : test_detail::product_type<tag_t, int, int, int, int, int> {
83-
using sender_concept = test_std::sender_t;
92+
using sender_concept = test_std::sender_t;
93+
using is_basic_sender_tag = void;
8494
};
8595

8696
// -------------------------------------------------------------------------

tests/beman/execution/exec-snd-expos.test.cpp

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,9 @@ struct operation_state : test_detail::immovable {
112112

113113
struct sender0 {
114114
struct env {};
115-
using sender_concept = test_std::sender_t;
116-
using indices_for = ::std::index_sequence_for<>;
115+
using sender_concept = test_std::sender_t;
116+
using is_basic_sender_tag = void;
117+
using indices_for = ::std::index_sequence_for<>;
117118
tag t{};
118119
int* data{};
119120
template <typename Receiver>
@@ -124,8 +125,9 @@ struct sender0 {
124125
};
125126

126127
struct sender1 {
127-
using sender_concept = test_std::sender_t;
128-
using indices_for = ::std::index_sequence_for<sender0>;
128+
using sender_concept = test_std::sender_t;
129+
using is_basic_sender_tag = void;
130+
using indices_for = ::std::index_sequence_for<sender0>;
129131
tag t{};
130132
int* data{};
131133
sender0 c0{};
@@ -136,8 +138,9 @@ struct sender1 {
136138
};
137139

138140
struct sender2 {
139-
using sender_concept = test_std::sender_t;
140-
using indices_for = ::std::index_sequence_for<sender0, sender0>;
141+
using sender_concept = test_std::sender_t;
142+
using is_basic_sender_tag = void;
143+
using indices_for = ::std::index_sequence_for<sender0, sender0>;
141144
tag t{};
142145
int* data{};
143146
sender0 c0{};
@@ -149,8 +152,9 @@ struct sender2 {
149152
};
150153

151154
struct sender3 {
152-
using sender_concept = test_std::sender_t;
153-
using indices_for = ::std::index_sequence_for<sender0, sender0, sender0>;
155+
using sender_concept = test_std::sender_t;
156+
using is_basic_sender_tag = void;
157+
using indices_for = ::std::index_sequence_for<sender0, sender0, sender0>;
154158
tag t{};
155159
int* data{};
156160
sender0 c0{};
@@ -163,8 +167,9 @@ struct sender3 {
163167
};
164168

165169
struct sender4 {
166-
using sender_concept = test_std::sender_t;
167-
using indices_for = ::std::index_sequence_for<sender0, sender0, sender0, sender0>;
170+
using sender_concept = test_std::sender_t;
171+
using is_basic_sender_tag = void;
172+
using indices_for = ::std::index_sequence_for<sender0, sender0, sender0, sender0>;
168173
tag t{};
169174
int* data{};
170175
sender0 c0{};
@@ -547,28 +552,33 @@ auto test_default_impls_get_state() -> void {
547552
auto operator==(const data&) const -> bool = default;
548553
};
549554
struct local_sender0 {
555+
using is_basic_sender_tag = void;
550556
local_tag t{};
551557
data d{1, 2};
552558
};
553559
struct local_sender1 {
560+
using is_basic_sender_tag = void;
554561
local_tag t{};
555562
data d{1, 2};
556563
int i1{};
557564
};
558565
struct local_sender2 {
566+
using is_basic_sender_tag = void;
559567
local_tag t{};
560568
data d{1, 2};
561569
int i1{};
562570
int i2{};
563571
};
564572
struct local_sender3 {
573+
using is_basic_sender_tag = void;
565574
local_tag t{};
566575
data d{1, 2};
567576
int i1{};
568577
int i2{};
569578
int i3{};
570579
};
571580
struct local_sender4 {
581+
using is_basic_sender_tag = void;
572582
local_tag t{};
573583
data d{1, 2};
574584
int i1{};
@@ -665,6 +675,7 @@ auto test_state_type() -> void {
665675
};
666676
struct state {};
667677
struct sender {
678+
using is_basic_sender_tag = void;
668679
local_tag t;
669680
state s;
670681
};
@@ -679,6 +690,7 @@ auto test_basic_state() -> void {
679690
};
680691
struct data {};
681692
struct local_sender {
693+
using is_basic_sender_tag = void;
682694
local_tag t;
683695
data d;
684696
};
@@ -717,10 +729,12 @@ auto test_env_type() -> void {
717729
struct data {};
718730
struct local_env {};
719731
struct local_sender {
732+
using is_basic_sender_tag = void;
720733
local_tag t;
721734
data d;
722735
};
723736
struct sender_with_env {
737+
using is_basic_sender_tag = void;
724738
local_tag t;
725739
data d;
726740
auto get_env() const noexcept -> local_env { return {}; }
@@ -750,8 +764,9 @@ auto test_basic_receiver() -> void {
750764
auto operator==(const err&) const -> bool = default;
751765
};
752766
struct local_sender {
753-
local_tag t{};
754-
data d{};
767+
using is_basic_sender_tag = local_tag;
768+
is_basic_sender_tag t{};
769+
data d{};
755770
};
756771
struct local_receiver {
757772
T value{};
@@ -766,6 +781,7 @@ auto test_basic_receiver() -> void {
766781
T value;
767782
};
768783
using basic_receiver = test_detail::basic_receiver<local_sender, local_receiver, index>;
784+
static_assert(requires { typename local_sender::is_basic_sender_tag; });
769785
static_assert(test_std::receiver<basic_receiver>);
770786
static_assert(std::same_as<local_tag, typename basic_receiver::tag_t>);
771787
static_assert(
@@ -1098,7 +1114,8 @@ struct basic_sender_tag {
10981114

10991115
struct data {};
11001116
struct tagged_sender : test_detail::product_type<basic_sender_tag, data, sender0> {
1101-
using sender_concept = test_std::sender_t;
1117+
using sender_concept = test_std::sender_t;
1118+
using is_basic_sender_tag = void;
11021119
};
11031120
} // namespace
11041121
namespace std {

tests/beman/execution/exec-snd-transform.test.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,9 @@ struct tag {
4444

4545
template <int I>
4646
struct sender {
47-
using sender_concept = test_std::sender_t;
48-
using index_type = std::integral_constant<int, I>;
47+
using sender_concept = test_std::sender_t;
48+
using is_basic_sender_tag = void;
49+
using index_type = std::integral_constant<int, I>;
4950
tag<I> t;
5051
int value{};
5152
};

0 commit comments

Comments
 (0)