Skip to content

Commit b52f28c

Browse files
authored
tried to reduce the uses of sender_decompose (#118)
* tried to reduce the uses of sender_decompose * clang-format
1 parent 145557b commit b52f28c

File tree

6 files changed

+75
-22
lines changed

6 files changed

+75
-22
lines changed

include/beman/execution26/detail/basic_sender.hpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,9 @@ struct basic_sender : ::beman::execution26::detail::product_type<Tag, Data, Chil
3333
using indices_for = ::std::index_sequence_for<Child...>;
3434

3535
auto get_env() const noexcept -> decltype(auto) {
36-
auto data{::beman::execution26::detail::get_sender_data(*this)};
37-
return ::std::apply(
38-
[&data](auto&&... c) { return ::beman::execution26::detail::impls_for<Tag>::get_attrs(data.data, c...); },
39-
data.children);
36+
auto&& d{this->template get<1>()};
37+
return sub_apply<2>(
38+
[&d](auto&&... c) { return ::beman::execution26::detail::impls_for<Tag>::get_attrs(d, c...); }, *this);
4039
}
4140

4241
template <typename Receiver>

include/beman/execution26/detail/connect_all.hpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,33 @@ struct connect_all_t {
4444
::std::forward<Tuple>(tuple));
4545
}
4646

47+
template <::std::size_t Start, typename Fun, typename Tuple, ::std::size_t... I>
48+
static auto sub_apply_with_index_helper(::std::index_sequence<I...> seq, Fun&& fun, Tuple&& tuple) noexcept(
49+
noexcept(::std::forward<Fun>(fun)(
50+
seq, ::beman::execution26::detail::forward_like<Tuple>(tuple.template get<I + Start>())...)))
51+
-> decltype(auto) {
52+
return ::std::forward<Fun>(fun)(
53+
seq, ::beman::execution26::detail::forward_like<Tuple>(tuple.template get<I + Start>())...);
54+
}
55+
template <::std::size_t Start, typename Fun, typename Tuple>
56+
requires requires { ::std::declval<Tuple>().size(); }
57+
static auto sub_apply_with_index(Fun&& fun, Tuple&& tuple) noexcept(noexcept(sub_apply_with_index_helper<Start>(
58+
::std::make_index_sequence<::std::tuple_size_v<::std::decay_t<Tuple>> - Start>{},
59+
::std::forward<Fun>(fun),
60+
::std::forward<Tuple>(tuple)))) -> decltype(auto) {
61+
return sub_apply_with_index_helper<Start>(
62+
::std::make_index_sequence<::std::tuple_size_v<::std::decay_t<Tuple>> - Start>{},
63+
::std::forward<Fun>(fun),
64+
::std::forward<Tuple>(tuple));
65+
}
66+
template <::std::size_t Start, typename Fun, typename Tuple>
67+
requires(not requires { ::std::declval<Tuple>().size(); })
68+
static auto
69+
sub_apply_with_index(Fun&& fun,
70+
Tuple&&) noexcept(noexcept(::std::forward<Fun>(fun)(::std::make_index_sequence<0u>{}))) {
71+
return ::std::forward<Fun>(fun)(::std::make_index_sequence<0u>{});
72+
}
73+
4774
template <typename Sender, typename Receiver>
4875
struct connect_helper {
4976
::beman::execution26::detail::basic_state<Sender, Receiver>* op;
@@ -66,6 +93,18 @@ struct connect_all_t {
6693

6794
public:
6895
//-dk:TODO is the S parameter deviating from the spec?
96+
template <typename Sender, typename S, typename Receiver, ::std::size_t... I>
97+
requires requires(Sender&& s) {
98+
s.size();
99+
s.template get<0>();
100+
}
101+
auto operator()(::beman::execution26::detail::basic_state<Sender, Receiver>* op,
102+
S&& sender,
103+
::std::index_sequence<I...>) const
104+
noexcept(noexcept(sub_apply_with_index<2>(connect_helper<Sender, Receiver>{op}, ::std::forward<S>(sender))))
105+
-> decltype(auto) {
106+
return sub_apply_with_index<2>(connect_helper<Sender, Receiver>{op}, ::std::forward<S>(sender));
107+
}
69108
template <typename Sender, typename S, typename Receiver, ::std::size_t... I>
70109
auto operator()(::beman::execution26::detail::basic_state<Sender, Receiver>* op,
71110
S&& sender,

include/beman/execution26/detail/default_impls.hpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,18 @@ struct default_impls {
3737
};
3838
static constexpr auto get_state =
3939
[]<typename Sender, typename Receiver>(Sender&& sender, Receiver& receiver) noexcept -> decltype(auto) {
40-
auto&& decompose = ::beman::execution26::detail::get_sender_data(::std::forward<Sender>(sender));
40+
auto&& data{[&sender]() -> decltype(auto) {
41+
if constexpr (requires {
42+
sender.size();
43+
sender.template get<1>();
44+
})
45+
return sender.template get<1>();
46+
else
47+
return ::beman::execution26::detail::get_sender_data(::std::forward<Sender>(sender)).data;
48+
}()};
4149

4250
return ::beman::execution26::detail::allocator_aware_move(
43-
::beman::execution26::detail::forward_like<Sender>(decompose.data), receiver);
51+
::beman::execution26::detail::forward_like<Sender>(data), receiver);
4452
};
4553
static constexpr auto start = [](auto&, auto&, auto&... ops) noexcept -> void {
4654
(::beman::execution26::start(ops), ...);

include/beman/execution26/detail/product_type.hpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,20 @@ template <typename... T>
112112
constexpr auto is_product_type(const ::beman::execution26::detail::product_type<T...>&) -> ::std::true_type {
113113
return {};
114114
}
115+
116+
template <::std::size_t Start, typename Fun, typename Tuple, ::std::size_t... I>
117+
constexpr auto sub_apply_helper(Fun&& fun, Tuple&& tuple, ::std::index_sequence<I...>) -> decltype(auto) {
118+
return ::std::forward<Fun>(fun)(::std::forward<Tuple>(tuple).template get<I + Start>()...);
119+
}
120+
121+
template <::std::size_t Start, typename Fun, typename Tuple>
122+
constexpr auto sub_apply(Fun&& fun, Tuple&& tuple) -> decltype(auto) {
123+
static constexpr ::std::size_t TSize{::std::tuple_size_v<::std::remove_cvref_t<Tuple>>};
124+
static_assert(Start <= TSize);
125+
return sub_apply_helper<Start>(
126+
::std::forward<Fun>(fun), ::std::forward<Tuple>(tuple), ::std::make_index_sequence<TSize - Start>());
127+
}
128+
115129
} // namespace beman::execution26::detail
116130

117131
namespace std {

include/beman/execution26/detail/sender_decompose.hpp

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ struct sender_data {
3333
Data& data;
3434
Children children;
3535
};
36+
template <typename Tag, typename Data, typename Children>
37+
sender_data(Tag&&, Data&, Children&&) -> sender_data<Tag, Data, Children>;
3638

3739
template <typename Sender>
3840
auto get_sender_data(Sender&& sender) {
@@ -49,33 +51,24 @@ auto get_sender_data(Sender&& sender) {
4951
sender.size();
5052
})
5153
return [&sender]<::std::size_t... I>(::std::index_sequence<I...>) {
52-
return ::beman::execution26::detail::sender_data<decltype(sender.template get<0>()),
53-
decltype(sender.template get<1>()),
54-
decltype(::std::tie(sender.template get<2 + I>()...))>{
54+
return ::beman::execution26::detail::sender_data{
5555
sender.template get<0>(), sender.template get<1>(), ::std::tie(sender.template get<2 + I>()...)};
5656
}(::std::make_index_sequence<::std::decay_t<decltype(sender)>::size() - 2u>{});
5757
else if constexpr (requires { sender_type{at, at, at, at, at, at}; }) {
5858
auto&& [tag, data, c0, c1, c2, c3] = sender;
59-
return ::beman::execution26::detail::
60-
sender_data<decltype(tag), decltype(data), decltype(::std::tie(c0, c1, c2, c3))>{
61-
tag, data, ::std::tie(c0, c1, c2, c3)};
59+
return ::beman::execution26::detail::sender_data{tag, data, ::std::tie(c0, c1, c2, c3)};
6260
} else if constexpr (requires { sender_type{at, at, at, at, at}; }) {
6361
auto&& [tag, data, c0, c1, c2] = sender;
64-
return ::beman::execution26::detail::
65-
sender_data<decltype(tag), decltype(data), decltype(::std::tie(c0, c1, c2))>{
66-
tag, data, ::std::tie(c0, c1, c2)};
62+
return ::beman::execution26::detail::sender_data{tag, data, ::std::tie(c0, c1, c2)};
6763
} else if constexpr (requires { sender_type{at, at, at, at}; }) {
6864
auto&& [tag, data, c0, c1] = sender;
69-
return ::beman::execution26::detail::sender_data<decltype(tag), decltype(data), decltype(::std::tie(c0, c1))>{
70-
tag, data, ::std::tie(c0, c1)};
65+
return ::beman::execution26::detail::sender_data{tag, data, ::std::tie(c0, c1)};
7166
} else if constexpr (requires { sender_type{at, at, at}; }) {
7267
auto&& [tag, data, c0] = sender;
73-
return ::beman::execution26::detail::sender_data<decltype(tag), decltype(data), decltype(::std::tie(c0))>{
74-
tag, data, ::std::tie(c0)};
68+
return ::beman::execution26::detail::sender_data{tag, data, ::std::tie(c0)};
7569
} else if constexpr (requires { sender_type{at, at}; }) {
7670
auto&& [tag, data] = sender;
77-
return ::beman::execution26::detail::sender_data<decltype(tag), decltype(data), ::std::tuple<>>{
78-
tag, data, ::std::tuple<>()};
71+
return ::beman::execution26::detail::sender_data{tag, data, ::std::tuple<>()};
7972
} else {
8073
return ::beman::execution26::detail::sender_meta<void, void, void>{};
8174
}

tests/beman/execution26/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ foreach(test ${execution_tests})
129129
add_test(NAME ${TEST_EXE} COMMAND $<TARGET_FILE:${TEST_EXE}>)
130130
endforeach()
131131

132-
if(NOT PROJECT_IS_TOP_LEVEL)
132+
if(ROJECT_IS_TOP_LEVEL)
133133
# test if the targets are findable from the build directory
134134
# cmake-format: off
135135
add_test(NAME find-package-test

0 commit comments

Comments
 (0)