Skip to content

Commit 4e0bbf3

Browse files
committed
constrained sender_decompose to be only used with basic_sender
1 parent ac3bc0c commit 4e0bbf3

7 files changed

Lines changed: 33 additions & 6 deletions

File tree

include/beman/execution/detail/basic_sender.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ 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;
6969
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
7071
using indices_for = ::std::index_sequence_for<Child...>;
7172
static constexpr ::std::integral_constant<::std::size_t, sizeof...(Child) + 2> size{};
7273

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: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,10 @@ 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 {
54+
if constexpr (!requires { typename sender_type::is_basic_sender_tag; }) {
55+
return ::beman::execution::detail::sender_meta<void, void, Sender>{};
56+
}
57+
else if constexpr (requires {
5558
sender.template get<0>();
5659
sender.size();
5760
})

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ struct tag {
6363
template <bool Noexcept>
6464
struct tagged_sender {
6565
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: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,24 +34,28 @@ struct own_sender {
3434
struct tag_t {};
3535
struct tagged_sender {
3636
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 {
4142
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 {
4749
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 {
5457
using sender_concept = test_std::sender_t;
58+
using is_basic_sender_tag = void;
5559
tag_t tag;
5660
int data;
5761
int child1;
@@ -60,6 +64,7 @@ struct tagged_sender3 {
6064
};
6165
struct tagged_sender4 {
6266
using sender_concept = test_std::sender_t;
67+
using is_basic_sender_tag = void;
6368
tag_t tag;
6469
int data;
6570
int child1;
@@ -69,18 +74,23 @@ struct tagged_sender4 {
6974
};
7075
struct product_sender0 : test_detail::product_type<tag_t, int> {
7176
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> {
7480
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> {
7784
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> {
8088
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> {
8392
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: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ struct operation_state : test_detail::immovable {
113113
struct sender0 {
114114
struct env {};
115115
using sender_concept = test_std::sender_t;
116+
using is_basic_sender_tag = void;
116117
using indices_for = ::std::index_sequence_for<>;
117118
tag t{};
118119
int* data{};
@@ -125,6 +126,7 @@ struct sender0 {
125126

126127
struct sender1 {
127128
using sender_concept = test_std::sender_t;
129+
using is_basic_sender_tag = void;
128130
using indices_for = ::std::index_sequence_for<sender0>;
129131
tag t{};
130132
int* data{};
@@ -137,6 +139,7 @@ struct sender1 {
137139

138140
struct sender2 {
139141
using sender_concept = test_std::sender_t;
142+
using is_basic_sender_tag = void;
140143
using indices_for = ::std::index_sequence_for<sender0, sender0>;
141144
tag t{};
142145
int* data{};
@@ -150,6 +153,7 @@ struct sender2 {
150153

151154
struct sender3 {
152155
using sender_concept = test_std::sender_t;
156+
using is_basic_sender_tag = void;
153157
using indices_for = ::std::index_sequence_for<sender0, sender0, sender0>;
154158
tag t{};
155159
int* data{};
@@ -164,6 +168,7 @@ struct sender3 {
164168

165169
struct sender4 {
166170
using sender_concept = test_std::sender_t;
171+
using is_basic_sender_tag = void;
167172
using indices_for = ::std::index_sequence_for<sender0, sender0, sender0, sender0>;
168173
tag t{};
169174
int* data{};
@@ -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,6 +764,7 @@ auto test_basic_receiver() -> void {
750764
auto operator==(const err&) const -> bool = default;
751765
};
752766
struct local_sender {
767+
using is_basic_sender_tag = void;
753768
local_tag t{};
754769
data d{};
755770
};
@@ -1099,6 +1114,7 @@ struct basic_sender_tag {
10991114
struct data {};
11001115
struct tagged_sender : test_detail::product_type<basic_sender_tag, data, sender0> {
11011116
using sender_concept = test_std::sender_t;
1117+
using is_basic_sender_tag = void;
11021118
};
11031119
} // namespace
11041120
namespace std {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ struct tag {
4545
template <int I>
4646
struct sender {
4747
using sender_concept = test_std::sender_t;
48+
using is_basic_sender_tag = void;
4849
using index_type = std::integral_constant<int, I>;
4950
tag<I> t;
5051
int value{};

0 commit comments

Comments
 (0)