Skip to content

Commit 93f3ba2

Browse files
drop dead trait, dead test guards, and migrate async_mpi receiver to native P2300
Signed-off-by: guptapratykshh <pratykshgupta9999@gmail.com>
1 parent 3735f50 commit 93f3ba2

6 files changed

Lines changed: 29 additions & 369 deletions

File tree

libs/core/async_mpi/include/hpx/async_mpi/transform_mpi.hpp

Lines changed: 22 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ namespace hpx::mpi::experimental {
7373
HPX_CXX_CORE_EXPORT template <typename R, typename F>
7474
struct transform_mpi_receiver
7575
{
76-
using is_receiver = void;
76+
using receiver_concept = hpx::execution::experimental::receiver_t;
7777
HPX_NO_UNIQUE_ADDRESS std::decay_t<R> r;
7878
HPX_NO_UNIQUE_ADDRESS std::decay_t<F> f;
7979

@@ -85,55 +85,52 @@ namespace hpx::mpi::experimental {
8585
}
8686

8787
template <typename E>
88-
friend constexpr void tag_invoke(
89-
hpx::execution::experimental::set_error_t,
90-
transform_mpi_receiver&& r, E&& e) noexcept
88+
void set_error(E&& e) && noexcept
9189
{
9290
hpx::execution::experimental::set_error(
93-
HPX_MOVE(r.r), HPX_FORWARD(E, e));
91+
HPX_MOVE(r), HPX_FORWARD(E, e));
9492
}
9593

96-
friend constexpr void tag_invoke(
97-
hpx::execution::experimental::set_stopped_t,
98-
transform_mpi_receiver&& r) noexcept
94+
void set_stopped() && noexcept
9995
{
100-
hpx::execution::experimental::set_stopped(HPX_MOVE(r.r));
101-
};
96+
hpx::execution::experimental::set_stopped(HPX_MOVE(r));
97+
}
10298

10399
template <typename... Ts,
104100
typename = std::enable_if_t<
105101
hpx::is_invocable_v<F, Ts..., MPI_Request*>>>
106-
friend constexpr void tag_invoke(
107-
hpx::execution::experimental::set_value_t,
108-
transform_mpi_receiver&& r, Ts&&... ts) noexcept
102+
void set_value(Ts&&... ts) && noexcept
109103
{
110104
hpx::detail::try_catch_exception_ptr(
111105
[&]() {
112106
if constexpr (std::is_void_v<util::invoke_result_t<F,
113107
Ts..., MPI_Request*>>)
114108
{
115109
MPI_Request request;
116-
HPX_INVOKE(r.f, ts..., &request);
110+
HPX_INVOKE(f, ts..., &request);
117111
// When the return type is void, there is no value
118112
// to forward to the receiver
119113
set_value_request_callback_void(
120-
request, HPX_MOVE(r.r), HPX_FORWARD(Ts, ts)...);
114+
request, HPX_MOVE(r), HPX_FORWARD(Ts, ts)...);
121115
}
122116
else
123117
{
124118
MPI_Request request;
125119
// When the return type is non-void, we have to
126-
// forward the value to the receiver
127-
auto&& result = HPX_INVOKE(
128-
r.f, HPX_FORWARD(Ts, ts)..., &request);
120+
// forward the value to the receiver. Pass `ts...`
121+
// unforwarded into `f` so the same arguments can
122+
// be moved once into the keep-alive callback
123+
// below; this matches the void branch above and
124+
// avoids a double-move when `Ts...` are rvalues.
125+
auto&& result = HPX_INVOKE(f, ts..., &request);
129126
set_value_request_callback_non_void(request,
130-
HPX_MOVE(r.r), HPX_MOVE(result),
127+
HPX_MOVE(r), HPX_MOVE(result),
131128
HPX_FORWARD(Ts, ts)...);
132129
}
133130
},
134131
[&](std::exception_ptr ep) {
135132
hpx::execution::experimental::set_error(
136-
HPX_MOVE(r.r), HPX_MOVE(ep));
133+
HPX_MOVE(r), HPX_MOVE(ep));
137134
});
138135
}
139136
};
@@ -204,22 +201,18 @@ namespace hpx::mpi::experimental {
204201
// clang-format on
205202

206203
template <typename R>
207-
friend constexpr auto tag_invoke(
208-
hpx::execution::experimental::connect_t,
209-
transform_mpi_sender& s, R&& r)
204+
constexpr auto connect(R&& r) &
210205
{
211206
return hpx::execution::experimental::connect(
212-
s.s, transform_mpi_receiver<R, F>(HPX_FORWARD(R, r), s.f));
207+
s, transform_mpi_receiver<R, F>(HPX_FORWARD(R, r), f));
213208
}
214209

215210
template <typename R>
216-
friend constexpr auto tag_invoke(
217-
hpx::execution::experimental::connect_t,
218-
transform_mpi_sender&& s, R&& r)
211+
constexpr auto connect(R&& r) &&
219212
{
220-
return hpx::execution::experimental::connect(HPX_MOVE(s.s),
213+
return hpx::execution::experimental::connect(HPX_MOVE(s),
221214
transform_mpi_receiver<R, F>(
222-
HPX_FORWARD(R, r), HPX_MOVE(s.f)));
215+
HPX_FORWARD(R, r), HPX_MOVE(f)));
223216
}
224217
};
225218
} // namespace detail

libs/core/execution_base/include/hpx/execution_base/completion_signatures.hpp

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -106,21 +106,6 @@ namespace hpx::execution::experimental {
106106

107107
} // namespace detail
108108

109-
namespace detail {
110-
111-
HPX_CXX_CORE_EXPORT template <typename Sender, typename Enable = void>
112-
struct has_completion_signatures : std::false_type
113-
{
114-
};
115-
116-
HPX_CXX_CORE_EXPORT template <typename Sender>
117-
struct has_completion_signatures<Sender,
118-
std::void_t<
119-
typename remove_cv_ref_t<Sender>::completion_signatures>>
120-
: std::true_type
121-
{
122-
};
123-
} // namespace detail
124109
// A sender is a type that is describing an asynchronous operation. The
125110
// operation itself might not have started yet. In order to get the result
126111
// of this asynchronous operation, a sender needs to be connected to a

libs/core/execution_base/tests/unit/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ set(tests
1616
get_env
1717
execute_may_block_caller
1818
stdexec
19-
test_tag_invoke_only_completion_signatures
2019
)
2120

2221
if(HPX_WITH_CXX20_COROUTINES)

libs/core/execution_base/tests/unit/completion_signatures.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -382,8 +382,6 @@ void test_awaitable_sender1(Signatures&&, Awaiter&&)
382382
static_assert(ex::is_awaitable_v<awaitable_sender_1<Awaiter>>);
383383

384384
awaitable_sender_1<Awaiter> s;
385-
static_assert(!hpx::meta::value<
386-
ex::detail::has_completion_signatures<awaitable_sender_1<Awaiter>>>);
387385
static_assert(std::is_same_v<decltype(ex::get_completion_signatures(
388386
s, ex::empty_env{})),
389387
Signatures>);

libs/core/execution_base/tests/unit/coroutine_utils.cpp

Lines changed: 7 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -177,46 +177,6 @@ int main()
177177
{
178178
namespace ex = hpx::execution::experimental;
179179

180-
// clang-format off
181-
#if !defined(HPX_HAVE_STDEXEC)
182-
{
183-
// clang-format off
184-
static_assert(
185-
std::is_same_v<ex::single_sender_value_t<non_awaitable_sender<decltype(
186-
signature_all(std::exception_ptr(), int()))>>,
187-
int>);
188-
static_assert(
189-
std::is_same_v<ex::single_sender_value_t<non_awaitable_sender<decltype(
190-
signature_all(std::exception_ptr()))>>,
191-
void>);
192-
// clang-format on
193-
}
194-
#endif
195-
// clang-format on
196-
197-
// single sender value
198-
#if !defined(HPX_HAVE_STDEXEC)
199-
{
200-
static_assert(std::is_same_v<
201-
ex::single_sender_value_t<awaitable_sender_1<awaiter>>, bool>);
202-
static_assert(std::is_same_v<
203-
ex::single_sender_value_t<awaitable_sender_1<hpx::suspend_always>>,
204-
void>);
205-
}
206-
#endif
207-
208-
// connect awaitable
209-
#if !defined(HPX_HAVE_STDEXEC)
210-
{
211-
// Verify that connect_awaitable and connect return the same operation state type
212-
static_assert(std::is_same_v<decltype(ex::connect_awaitable(
213-
awaitable_sender_1<awaiter>{},
214-
recv_set_value{})),
215-
decltype(ex::connect(
216-
awaitable_sender_1<awaiter>{}, recv_set_value{}))>);
217-
}
218-
#endif
219-
220180
// Promise env
221181
{
222182
static_assert(ex::is_awaiter_v<awaiter>);
@@ -255,25 +215,13 @@ int main()
255215
awaiter>);
256216
}
257217

258-
// Operation base
259-
#if !defined(HPX_HAVE_STDEXEC)
260-
{
261-
using operation_type = decltype(ex::connect(
262-
awaitable_sender_1<awaiter>{}, recv_set_value{}));
263-
static_assert(ex::is_operation_state_v<operation_type>);
264-
}
265-
#endif
266-
267-
// Connect result type
268-
#if !defined(HPX_HAVE_STDEXEC)
269-
{
270-
using operation_type = decltype(ex::connect(
271-
awaitable_sender_1<awaiter>{}, recv_set_value{}));
272-
static_assert(std::is_same_v<
273-
ex::connect_result_t<awaitable_sender_1<awaiter>, recv_set_value>,
274-
operation_type>);
275-
}
276-
#endif
218+
// Note: tests for `single_sender_value_t<non_awaitable_sender<...>>`,
219+
// `single_sender_value_t<awaitable_sender_1<...>>`, `connect_awaitable`
220+
// and `connect_result_t<awaitable_sender_1, ...>` were removed in the
221+
// post-stdexec cleanup. Under stdexec, awaitables are not standalone
222+
// senders outside a coroutine context (they require
223+
// `with_awaitable_senders`), so those tests relied on HPX's removed
224+
// awaitable-as-sender path and are no longer applicable.
277225

278226
// As awaitable
279227
{

0 commit comments

Comments
 (0)