Skip to content

Commit 6f64c11

Browse files
committed
some progress on basic_sender
1 parent c16f5e2 commit 6f64c11

File tree

5 files changed

+139
-8
lines changed

5 files changed

+139
-8
lines changed

include/beman/execution26/detail/basic_sender.hpp

+37
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#ifndef INCLUDED_BEMAN_EXECUTION26_DETAIL_BASIC_SENDER
55
#define INCLUDED_BEMAN_EXECUTION26_DETAIL_BASIC_SENDER
66

7+
#include <beman/execution26/detail/decays_to.hpp>
8+
#include <beman/execution26/detail/completion_signatures_for.hpp>
79
#include <beman/execution26/detail/sender.hpp>
810

911
// ----------------------------------------------------------------------------
@@ -14,6 +16,41 @@ namespace beman::execution26::detail
1416
struct basic_sender
1517
{
1618
using sender_concept = ::beman::execution26::sender_t;
19+
20+
#if __cpp_explicit_this_parameter < 302110L
21+
template <typename Env>
22+
auto get_completion_signatures(Env&&) && noexcept
23+
-> ::beman::execution26::detail::completion_signatures_for<basic_sender&&, Env>
24+
{
25+
return {};
26+
}
27+
template <typename Env>
28+
auto get_completion_signatures(Env&&) const&& noexcept
29+
-> ::beman::execution26::detail::completion_signatures_for<basic_sender const&&, Env>
30+
{
31+
return {};
32+
}
33+
template <typename Env>
34+
auto get_completion_signatures(Env&&) & noexcept
35+
-> ::beman::execution26::detail::completion_signatures_for<basic_sender&, Env>
36+
{
37+
return {};
38+
}
39+
template <typename Env>
40+
auto get_completion_signatures(Env&&) const& noexcept
41+
-> ::beman::execution26::detail::completion_signatures_for<basic_sender const&, Env>
42+
{
43+
return {};
44+
}
45+
#else
46+
template <::beman::execution26::detail::decays_to<basic_sender> Self,
47+
typename Env>
48+
auto get_completion_signatures(this Self&&, Env&&) noexcept
49+
-> ::beman::execution26::detail::completion_signatures_for<Self, Env>
50+
{
51+
return {};
52+
}
53+
#endif
1754
};
1855
}
1956

include/beman/execution26/detail/product_type.hpp

+13
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,19 @@ namespace beman::execution26::detail
7373
T4 value4;
7474
T5 value5;
7575
};
76+
77+
template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
78+
struct product_type<T1, T2, T3, T4, T5, T6>
79+
{
80+
static constexpr ::std::size_t size{6u};
81+
auto operator== (product_type const&) const -> bool = default;
82+
T1 value1;
83+
T2 value2;
84+
T3 value3;
85+
T4 value4;
86+
T5 value5;
87+
T6 value6;
88+
};
7689
}
7790

7891
// ----------------------------------------------------------------------------

include/beman/execution26/detail/sender_decompose.hpp

+20-5
Original file line numberDiff line numberDiff line change
@@ -43,27 +43,42 @@ namespace beman::execution26::detail
4343
#endif
4444
using sender_type = ::std::remove_cvref_t<Sender>;
4545
static constexpr ::beman::execution26::detail::sender_any_t at{};
46-
if constexpr (requires(){ sender_type{ at, at, at, at, at, at }; })
46+
if constexpr (
47+
requires(){ sender_type{ at, at, at, at, at, at }; }
48+
|| requires(){ sender_type{ { at, at, at, at, at, at } }; }
49+
)
4750
{
4851
auto&& [tag, data, c0, c1, c2, c3] = sender;
4952
return ::beman::execution26::detail::sender_meta<decltype(tag), decltype(data), ::std::tuple<decltype(c0), decltype(c1), decltype(c2), decltype(c3)>>{};
5053
}
51-
else if constexpr (requires(){ sender_type{ at, at, at, at, at }; })
54+
else if constexpr (
55+
requires(){ sender_type{ at, at, at, at, at }; }
56+
|| requires(){ sender_type{ { at, at, at, at, at } }; }
57+
)
5258
{
5359
auto&& [tag, data, c0, c1, c2] = sender;
5460
return ::beman::execution26::detail::sender_meta<decltype(tag), decltype(data), ::std::tuple<decltype(c0), decltype(c1), decltype(c2)>>{};
5561
}
56-
else if constexpr (requires(){ sender_type{ at, at, at, at }; })
62+
else if constexpr (
63+
requires(){ sender_type{ at, at, at, at }; }
64+
|| requires(){ sender_type{ { at, at, at, at } }; }
65+
)
5766
{
5867
auto&& [tag, data, c0, c1] = sender;
5968
return ::beman::execution26::detail::sender_meta<decltype(tag), decltype(data), ::std::tuple<decltype(c0), decltype(c1)>>{};
6069
}
61-
else if constexpr (requires(){ sender_type{ at, at, at }; })
70+
else if constexpr (
71+
requires(){ sender_type{ at, at, at }; }
72+
|| requires(){ sender_type{ { at, at, at } }; }
73+
)
6274
{
6375
auto&& [tag, data, c0] = sender;
6476
return ::beman::execution26::detail::sender_meta<decltype(tag), decltype(data), ::std::tuple<decltype(c0)>>{};
6577
}
66-
else if constexpr (requires(){ sender_type{ at, at }; })
78+
else if constexpr (
79+
requires(){ sender_type{ at, at }; }
80+
|| requires(){ sender_type{ { at, at } }; }
81+
)
6782
{
6883
auto&& [tag, data] = sender;
6984
return ::beman::execution26::detail::sender_meta<decltype(tag), decltype(data), ::std::tuple<>>{};

src/beman/execution26/tests/exec-snd-concepts.pass.cpp

+32
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
33

44
#include <beman/execution26/detail/sender_for.hpp>
5+
#include <beman/execution26/detail/product_type.hpp>
56
#include <beman/execution26/detail/sender_decompose.hpp>
67
#include <beman/execution26/detail/sender.hpp>
78
#include <beman/execution26/detail/sender_in.hpp>
@@ -61,6 +62,31 @@ namespace
6162
int child3;
6263
int child4;
6364
};
65+
struct product_sender0
66+
: test_detail::product_type<tag_t, int>
67+
{
68+
using sender_concept = test_std::sender_t;
69+
};
70+
struct product_sender1
71+
: test_detail::product_type<tag_t, int, int>
72+
{
73+
using sender_concept = test_std::sender_t;
74+
};
75+
struct product_sender2
76+
: test_detail::product_type<tag_t, int, int, int>
77+
{
78+
using sender_concept = test_std::sender_t;
79+
};
80+
struct product_sender3
81+
: test_detail::product_type<tag_t, int, int, int, int>
82+
{
83+
using sender_concept = test_std::sender_t;
84+
};
85+
struct product_sender4
86+
: test_detail::product_type<tag_t, int, int, int, int, int>
87+
{
88+
using sender_concept = test_std::sender_t;
89+
};
6490

6591
// -------------------------------------------------------------------------
6692

@@ -133,6 +159,12 @@ namespace
133159
static_assert(std::same_as<tag_t, test_std::tag_of_t<tagged_sender2>>);
134160
static_assert(std::same_as<tag_t, test_std::tag_of_t<tagged_sender3>>);
135161
static_assert(std::same_as<tag_t, test_std::tag_of_t<tagged_sender4>>);
162+
163+
static_assert(std::same_as<tag_t, test_std::tag_of_t<product_sender0>>);
164+
static_assert(std::same_as<tag_t, test_std::tag_of_t<product_sender1>>);
165+
static_assert(std::same_as<tag_t, test_std::tag_of_t<product_sender2>>);
166+
static_assert(std::same_as<tag_t, test_std::tag_of_t<product_sender3>>);
167+
static_assert(std::same_as<tag_t, test_std::tag_of_t<product_sender4>>);
136168
}
137169

138170
auto test_sender_for() -> void

src/beman/execution26/tests/exec-snd-expos.pass.cpp

+37-3
Original file line numberDiff line numberDiff line change
@@ -1063,15 +1063,49 @@ namespace
10631063
test_detail::no_completion_signatures_defined_in_sender
10641064
>);
10651065
}
1066+
1067+
struct basic_sender_tag
1068+
{
1069+
struct sender
1070+
{
1071+
using sender_concept = test_std::sender_t;
1072+
using completion_signatures = test_std::completion_signatures<>;
1073+
};
1074+
auto transform_sender(auto&&...) noexcept { return sender{}; }
1075+
};
10661076
auto test_basic_sender() -> void
10671077
{
1068-
struct tag {};
10691078
struct data {};
10701079
struct env {};
1080+
struct tagged_sender
1081+
: test_detail::product_type<basic_sender_tag, data, sender0>
1082+
{
1083+
using sender_concept = test_std::sender_t;
1084+
};
1085+
1086+
#if 1
1087+
auto&&[a, b, c] = tagged_sender{basic_sender_tag{}, data{}, sender0{}};
1088+
use(a);
1089+
use(b);
1090+
use(c);
1091+
#endif
1092+
1093+
static_assert(test_std::sender<basic_sender_tag::sender>);
1094+
static_assert(test_std::sender_in<basic_sender_tag::sender>);
1095+
static_assert(test_std::sender_in<basic_sender_tag::sender, env>);
1096+
static_assert(test_std::sender<tagged_sender>);
1097+
static_assert(std::same_as<
1098+
basic_sender_tag,
1099+
test_std::tag_of_t<tagged_sender>
1100+
>);
1101+
//static_assert(std::same_as<
1102+
// basic_sender_tag::sender,
1103+
// decltype(test_std::transform_sender(test_std::default_domain{}, tagged_sender{}, env{}))
1104+
//>);
10711105

1072-
using basic_sender = test_detail::basic_sender<tag, data, sender0>;
1106+
using basic_sender = test_detail::basic_sender<basic_sender_tag, data, sender0>;
10731107
static_assert(test_std::sender<basic_sender>);
1074-
//-dk:TODO static_assert(test_std::sender_in<basic_sender>);
1108+
//static_assert(test_std::sender_in<basic_sender>);
10751109
}
10761110
}
10771111

0 commit comments

Comments
 (0)