Skip to content

Commit 8775503

Browse files
committed
added basic_operation
1 parent a3bdf08 commit 8775503

File tree

2 files changed

+64
-14
lines changed

2 files changed

+64
-14
lines changed

include/beman/execution26/detail/basic_operation.hpp

+40
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@
44
#ifndef INCLUDED_BEMAN_EXECUTION26_DETAIL_BASIC_OPERATION
55
#define INCLUDED_BEMAN_EXECUTION26_DETAIL_BASIC_OPERATION
66

7+
#include <beman/execution26/detail/operation_state.hpp>
78
#include <beman/execution26/detail/basic_state.hpp>
89
#include <beman/execution26/detail/state_type.hpp>
10+
#include <beman/execution26/detail/sender_decompose.hpp>
11+
#include <beman/execution26/detail/impls_for.hpp>
12+
#include <beman/execution26/detail/connect_all_result.hpp>
913
#include <beman/execution26/detail/valid_specialization.hpp>
1014
#include <utility>
1115

@@ -20,11 +24,47 @@ namespace beman::execution26::detail
2024
struct basic_operation
2125
: ::beman::execution26::detail::basic_state<Sender, Receiver>
2226
{
27+
using operation_state_concept = ::beman::execution26::operation_state_t;
28+
using tag_t = ::beman::execution26::tag_of_t<Sender>;
29+
30+
using inner_ops_t = ::beman::execution26::detail::connect_all_result<Sender, Receiver>;
31+
inner_ops_t inner_ops;
32+
2333
basic_operation(Sender&& sender, Receiver&& receiver) noexcept(true/*-dk:TODO*/)
2434
: ::beman::execution26::detail::basic_state<Sender, Receiver>(
2535
::std::forward<Sender>(sender), ::std::move(receiver)
2636
)
37+
, inner_ops(::beman::execution26::detail::connect_all(
38+
this,
39+
::std::forward<Sender>(sender),
40+
::beman::execution26::detail::indices_for<Sender>()
41+
))
42+
{
43+
}
44+
45+
auto start() & noexcept -> void
2746
{
47+
static constexpr ::beman::execution26::detail::sender_any_t at{};
48+
if constexpr (requires{ inner_ops_t{at, at, at, at}; })
49+
{
50+
auto&[op0, op1, op2, op3] = this->inner_ops;
51+
::beman::execution26::detail::impls_for<tag_t>::start(this->state, this->receiver, op0, op1, op2, op3);
52+
}
53+
else if constexpr (requires{ inner_ops_t{at, at, at}; })
54+
{
55+
auto&[op0, op1, op2] = this->inner_ops;
56+
::beman::execution26::detail::impls_for<tag_t>::start(this->state, this->receiver, op0, op1, op2);
57+
}
58+
else if constexpr (requires{ inner_ops_t{at, at}; })
59+
{
60+
auto&[op0, op1] = this->inner_ops;
61+
::beman::execution26::detail::impls_for<tag_t>::start(this->state, this->receiver, op0, op1);
62+
}
63+
else if constexpr (requires{ inner_ops_t{at}; })
64+
{
65+
auto&[op0] = this->inner_ops;
66+
::beman::execution26::detail::impls_for<tag_t>::start(this->state, this->receiver, op0);
67+
}
2868
}
2969
};
3070
}

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

+24-14
Original file line numberDiff line numberDiff line change
@@ -101,67 +101,70 @@ namespace
101101
struct operation_state
102102
{
103103
using operation_state_concept = test_std::operation_state_t;
104-
auto start() noexcept -> void {}
104+
int* counter;
105+
operation_state(int* counter): counter(counter) {}
106+
operation_state(operation_state&&) = delete;
107+
auto start() & noexcept -> void { ++*counter; }
105108
};
106109

107110
struct sender0
108111
{
109112
using sender_concept = test_std::sender_t;
110113
using indices_for = ::std::index_sequence_for<>;
111114
tag t{};
112-
int data{};
115+
int* data{};
113116
template <typename Receiver>
114-
auto connect(Receiver&&) const noexcept -> operation_state<Receiver> { return {}; }
117+
auto connect(Receiver&&) const noexcept { return operation_state<Receiver>(data); }
115118
};
116119

117120
struct sender1
118121
{
119122
using sender_concept = test_std::sender_t;
120123
using indices_for = ::std::index_sequence_for<sender0>;
121124
tag t{};
122-
int data{};
125+
int* data{};
123126
sender0 c0{};
124127
template <typename Receiver>
125-
auto connect(Receiver&&) const noexcept -> operation_state<Receiver> { return {}; }
128+
auto connect(Receiver&&) const noexcept { return operation_state<Receiver>(data); }
126129
};
127130

128131
struct sender2
129132
{
130133
using sender_concept = test_std::sender_t;
131134
using indices_for = ::std::index_sequence_for<sender0, sender0>;
132135
tag t{};
133-
int data{};
136+
int* data{};
134137
sender0 c0{};
135138
sender0 c1{};
136139
template <typename Receiver>
137-
auto connect(Receiver&&) const noexcept -> operation_state<Receiver> { return {}; }
140+
auto connect(Receiver&&) const noexcept { return operation_state<Receiver>(data); }
138141
};
139142

140143
struct sender3
141144
{
142145
using sender_concept = test_std::sender_t;
143146
using indices_for = ::std::index_sequence_for<sender0, sender0, sender0>;
144147
tag t{};
145-
int data{};
148+
int* data{};
146149
sender0 c0{};
147150
sender0 c1{};
148151
sender0 c2{};
149152
template <typename Receiver>
150-
auto connect(Receiver&&) const noexcept -> operation_state<Receiver> { return {}; }
153+
auto connect(Receiver&&) const noexcept { return operation_state<Receiver>(data); }
151154
};
152155

153156
struct sender4
154157
{
155158
using sender_concept = test_std::sender_t;
156159
using indices_for = ::std::index_sequence_for<sender0, sender0, sender0, sender0>;
157160
tag t{};
158-
int data{};
161+
int* data{};
159162
sender0 c0{};
160163
sender0 c1{};
161164
sender0 c2{};
162165
sender0 c3{};
163166
template <typename Receiver>
164-
auto connect(Receiver&&) const noexcept -> operation_state<Receiver> { return {}; }
167+
auto connect(Receiver&&) const noexcept { return operation_state<Receiver>(data); }
165168
};
166169

167170
struct receiver
@@ -1005,9 +1008,16 @@ namespace
10051008

10061009
auto test_basic_operation() -> void
10071010
{
1008-
test_detail::basic_operation op{sender0{}, receiver{}};
1009-
(void)op;
1010-
//-dk:TODO test basic_operation
1011+
int data{};
1012+
test_detail::basic_operation op{sender4{tag{}, &data,
1013+
sender0{tag{}, &data},
1014+
sender0{tag{}, &data},
1015+
sender0{tag{}, &data},
1016+
sender0{tag{}, &data}}, receiver{}};
1017+
static_assert(test_std::operation_state<decltype(op)>);
1018+
static_assert(requires{ typename decltype(op)::tag_t; });
1019+
op.start();
1020+
assert(data == 4);
10111021
}
10121022
}
10131023

0 commit comments

Comments
 (0)