From f6150b2a9ed66174539f2dbd26596241bc18b982 Mon Sep 17 00:00:00 2001 From: isidorostsa Date: Sat, 10 May 2025 19:39:25 +0300 Subject: [PATCH 1/4] fwd opstate tag --- .../include/hpx/execution_base/stdexec_forward.hpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libs/core/execution_base/include/hpx/execution_base/stdexec_forward.hpp b/libs/core/execution_base/include/hpx/execution_base/stdexec_forward.hpp index 49cc187d8ed7..79a3d86a3654 100644 --- a/libs/core/execution_base/include/hpx/execution_base/stdexec_forward.hpp +++ b/libs/core/execution_base/include/hpx/execution_base/stdexec_forward.hpp @@ -98,6 +98,9 @@ namespace hpx::execution::experimental { using stdexec::get_completion_signatures; using stdexec::get_completion_signatures_t; + // Operation State + using stdexec::operation_state_t; + // Sender using stdexec::connect; using stdexec::connect_result_t; From 13cfb156ca91ae2b5bb5a4e21a7ca040f685291d Mon Sep 17 00:00:00 2001 From: isidorostsa Date: Mon, 12 May 2025 09:33:29 +0300 Subject: [PATCH 2/4] Add missing concept tags --- .../include/hpx/execution/algorithms/when_all_vector.hpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libs/core/execution/include/hpx/execution/algorithms/when_all_vector.hpp b/libs/core/execution/include/hpx/execution/algorithms/when_all_vector.hpp index bac1b5685bbe..b2c1f6db25c7 100644 --- a/libs/core/execution/include/hpx/execution/algorithms/when_all_vector.hpp +++ b/libs/core/execution/include/hpx/execution/algorithms/when_all_vector.hpp @@ -1,5 +1,6 @@ // Copyright (c) 2020 ETH Zurich // Copyright (c) 2022 Hartmut Kaiser +// Copyright (c) 2025 Isidoros Tsaousis-Seiras // // SPDX-License-Identifier: BSL-1.0 // Distributed under the Boost Software License, Version 1.0. (See accompanying @@ -65,6 +66,9 @@ namespace hpx::when_all_vector_detail { struct when_all_vector_sender_impl::when_all_vector_sender_type { using is_sender = void; +#if defined(HPX_HAVE_STDEXEC) + using sender_concept = hpx::execution::experimental::sender_t; +#endif using senders_type = std::vector; senders_type senders; @@ -174,6 +178,10 @@ namespace hpx::when_all_vector_detail { struct operation_state { using receiver_type = std::decay_t; +#if defined(HPX_HAVE_STDEXEC) + using operation_state_concept = + hpx::execution::experimental::operation_state_t; +#endif struct when_all_vector_receiver { From 90e44ee4f0775a82f5839a6a3ed385dfd965518b Mon Sep 17 00:00:00 2001 From: isidorostsa Date: Fri, 16 May 2025 19:37:06 +0300 Subject: [PATCH 3/4] execution ns aliases --- .../hpx/execution/algorithms/as_sender.hpp | 32 ++-- .../include/hpx/execution/algorithms/bulk.hpp | 58 +++---- .../hpx/execution/algorithms/keep_future.hpp | 14 +- .../hpx/execution/algorithms/make_future.hpp | 88 +++++----- .../hpx/execution/algorithms/when_all.hpp | 23 ++- .../execution/algorithms/when_all_vector.hpp | 152 ++++++++---------- .../include/hpx/execution_base/any_sender.hpp | 61 ++++--- .../execution_base/completion_scheduler.hpp | 11 +- .../execution_base/completion_signatures.hpp | 46 +++--- 9 files changed, 214 insertions(+), 271 deletions(-) diff --git a/libs/core/execution/include/hpx/execution/algorithms/as_sender.hpp b/libs/core/execution/include/hpx/execution/algorithms/as_sender.hpp index 8b7153c8a7ac..034951899a2e 100644 --- a/libs/core/execution/include/hpx/execution/algorithms/as_sender.hpp +++ b/libs/core/execution/include/hpx/execution/algorithms/as_sender.hpp @@ -25,7 +25,7 @@ #include namespace hpx::execution::experimental { - + namespace hpxexec = hpx::execution::experimental; namespace detail { /////////////////////////////////////////////////////////////////////////// @@ -54,8 +54,8 @@ namespace hpx::execution::experimental { as_sender_operation_state& operator=( as_sender_operation_state const&) = delete; - friend void tag_invoke(hpx::execution::experimental::start_t, - as_sender_operation_state& os) noexcept + friend void tag_invoke( + hpxexec::start_t, as_sender_operation_state& os) noexcept { os.start_helper(); } @@ -79,19 +79,17 @@ namespace hpx::execution::experimental { { if constexpr (std::is_void_v) { - hpx::execution::experimental::set_value( - HPX_MOVE(receiver_)); + hpxexec::set_value(HPX_MOVE(receiver_)); } else { - hpx::execution::experimental::set_value( + hpxexec::set_value( HPX_MOVE(receiver_), future_.get()); } } else if (future_.has_exception()) { - hpx::execution::experimental::set_error( - HPX_MOVE(receiver_), + hpxexec::set_error(HPX_MOVE(receiver_), future_.get_exception_ptr()); } }; @@ -120,8 +118,7 @@ namespace hpx::execution::experimental { } }, [&](std::exception_ptr ep) { - hpx::execution::experimental::set_error( - HPX_MOVE(receiver_), HPX_MOVE(ep)); + hpxexec::set_error(HPX_MOVE(receiver_), HPX_MOVE(ep)); }); } @@ -140,22 +137,19 @@ namespace hpx::execution::experimental { template struct set_value_void_checked { - using type = hpx::execution::experimental::set_value_t( - _result_type); + using type = hpxexec::set_value_t(_result_type); }; template struct set_value_void_checked { - using type = hpx::execution::experimental::set_value_t(); + using type = hpxexec::set_value_t(); }; - using completion_signatures = - hpx::execution::experimental::completion_signatures< - typename set_value_void_checked, - result_type>::type, - hpx::execution::experimental::set_error_t( - std::exception_ptr)>; + using completion_signatures = hpxexec::completion_signatures< + typename set_value_void_checked, + result_type>::type, + hpxexec::set_error_t(std::exception_ptr)>; #else // Sender compatibility template diff --git a/libs/core/execution/include/hpx/execution/algorithms/bulk.hpp b/libs/core/execution/include/hpx/execution/algorithms/bulk.hpp index 9d67b8c16d08..51e8a8114d6f 100644 --- a/libs/core/execution/include/hpx/execution/algorithms/bulk.hpp +++ b/libs/core/execution/include/hpx/execution/algorithms/bulk.hpp @@ -34,6 +34,7 @@ #include namespace hpx::execution::experimental { + namespace hpxexec = hpx::execution::experimental; /////////////////////////////////////////////////////////////////////////// namespace detail { @@ -46,37 +47,33 @@ namespace hpx::execution::experimental { HPX_NO_UNIQUE_ADDRESS std::decay_t f; #if defined(HPX_HAVE_STDEXEC) - using sender_concept = hpx::execution::experimental::sender_t; + using sender_concept = hpxexec::sender_t; template using default_set_value = - hpx::execution::experimental::completion_signatures< - hpx::execution::experimental::set_value_t(Args...)>; + hpxexec::completion_signatures; template using default_set_error = - hpx::execution::experimental::completion_signatures< - hpx::execution::experimental::set_error_t(Arg)>; + hpxexec::completion_signatures; - using disable_set_stopped = - hpx::execution::experimental::completion_signatures<>; + using disable_set_stopped = hpxexec::completion_signatures<>; // clang-format off template friend auto tag_invoke(get_completion_signatures_t, bulk_sender const&, Env) noexcept -> hpx::execution:: experimental::transform_completion_signatures_of, default_set_value, default_set_error, disable_set_stopped>; // clang-format on friend constexpr auto tag_invoke( - hpx::execution::experimental::get_env_t, - bulk_sender const& s) noexcept + hpxexec::get_env_t, bulk_sender const& s) noexcept { - return hpx::execution::experimental::get_env(s.sender); + return hpxexec::get_env(s.sender); } #else using is_sender = void; @@ -107,14 +104,13 @@ namespace hpx::execution::experimental { // clang-format off template && - hpx::execution::experimental::detail::has_completion_scheduler_v< + hpxexec::detail::is_receiver_cpo_v && + hpxexec::detail::has_completion_scheduler_v< CPO, std::decay_t> )> // clang-format on friend constexpr auto tag_invoke( - hpx::execution::experimental::get_completion_scheduler_t - tag, + hpxexec::get_completion_scheduler_t tag, bulk_sender const& s) { return tag(s.sender); @@ -124,8 +120,7 @@ namespace hpx::execution::experimental { struct bulk_receiver { #if defined(HPX_HAVE_STDEXEC) - using receiver_concept = - hpx::execution::experimental::receiver_t; + using receiver_concept = hpxexec::receiver_t; #endif HPX_NO_UNIQUE_ADDRESS std::decay_t receiver; HPX_NO_UNIQUE_ADDRESS std::decay_t shape; @@ -143,15 +138,14 @@ namespace hpx::execution::experimental { friend void tag_invoke( set_error_t, bulk_receiver&& r, Error&& error) noexcept { - hpx::execution::experimental::set_error( + hpxexec::set_error( HPX_MOVE(r.receiver), HPX_FORWARD(Error, error)); } friend void tag_invoke( set_stopped_t, bulk_receiver&& r) noexcept { - hpx::execution::experimental::set_stopped( - HPX_MOVE(r.receiver)); + hpxexec::set_stopped(HPX_MOVE(r.receiver)); } template @@ -167,11 +161,11 @@ namespace hpx::execution::experimental { { HPX_INVOKE(f, s, ts...); } - hpx::execution::experimental::set_value( + hpxexec::set_value( HPX_MOVE(receiver), HPX_FORWARD(Ts, ts)...); }, [&](std::exception_ptr ep) { - hpx::execution::experimental::set_error( + hpxexec::set_error( HPX_MOVE(receiver), HPX_MOVE(ep)); }); } @@ -179,7 +173,7 @@ namespace hpx::execution::experimental { template friend auto tag_invoke( set_value_t, bulk_receiver&& r, Ts&&... ts) noexcept - -> decltype(hpx::execution::experimental::set_value( + -> decltype(hpxexec::set_value( std::declval&&>(), HPX_FORWARD(Ts, ts)...), void()) @@ -196,7 +190,7 @@ namespace hpx::execution::experimental { friend auto tag_invoke( connect_t, bulk_sender&& s, Receiver&& receiver) { - return hpx::execution::experimental::connect(HPX_MOVE(s.sender), + return hpxexec::connect(HPX_MOVE(s.sender), bulk_receiver(HPX_FORWARD(Receiver, receiver), HPX_MOVE(s.shape), HPX_MOVE(s.f))); } @@ -205,7 +199,7 @@ namespace hpx::execution::experimental { friend auto tag_invoke( connect_t, bulk_sender& s, Receiver&& receiver) { - return hpx::execution::experimental::connect(s.sender, + return hpxexec::connect(s.sender, bulk_receiver( HPX_FORWARD(Receiver, receiver), s.shape, s.f)); } @@ -247,7 +241,7 @@ namespace hpx::execution::experimental { HPX_CONCEPT_REQUIRES_( is_sender_v && experimental::detail::is_completion_scheduler_tag_invocable_v< - hpx::execution::experimental::set_value_t, Sender, + hpxexec::set_value_t, Sender, bulk_t, Shape, F > )> @@ -255,15 +249,13 @@ namespace hpx::execution::experimental { friend constexpr HPX_FORCEINLINE auto tag_override_invoke( bulk_t, Sender&& sender, Shape const& shape, F&& f) { - auto scheduler = - hpx::execution::experimental::get_completion_scheduler< - hpx::execution::experimental::set_value_t>( + auto scheduler = hpxexec::get_completion_scheduler( #if defined(HPX_HAVE_STDEXEC) - hpx::execution::experimental::get_env(sender) + hpxexec::get_env(sender) #else - sender + sender #endif - ); + ); return hpx::functional::tag_invoke(bulk_t{}, HPX_MOVE(scheduler), HPX_FORWARD(Sender, sender), shape, HPX_FORWARD(F, f)); diff --git a/libs/core/execution/include/hpx/execution/algorithms/keep_future.hpp b/libs/core/execution/include/hpx/execution/algorithms/keep_future.hpp index bcd58d71db1b..b279bccd229f 100644 --- a/libs/core/execution/include/hpx/execution/algorithms/keep_future.hpp +++ b/libs/core/execution/include/hpx/execution/algorithms/keep_future.hpp @@ -23,6 +23,7 @@ #include namespace hpx::execution::experimental { + namespace hpxexec = hpx::execution::experimental; namespace detail { @@ -51,13 +52,12 @@ namespace hpx::execution::experimental { // to move receiver and future into the on_completed // callback. state->set_on_completed([&os]() mutable { - hpx::execution::experimental::set_value( + hpxexec::set_value( HPX_MOVE(os.receiver), HPX_MOVE(os.future)); }); }, [&](std::exception_ptr ep) { - hpx::execution::experimental::set_error( - HPX_MOVE(os.receiver), HPX_MOVE(ep)); + hpxexec::set_error(HPX_MOVE(os.receiver), HPX_MOVE(ep)); }); } }; @@ -68,11 +68,9 @@ namespace hpx::execution::experimental { std::decay_t future; #if defined(HPX_HAVE_STDEXEC) using completion_signatures = - hpx::execution::experimental::completion_signatures< - hpx::execution::experimental::set_value_t( - std::decay_t), - hpx::execution::experimental::set_error_t( - std::exception_ptr)>; + hpxexec::completion_signatures), + hpxexec::set_error_t(std::exception_ptr)>; #else struct completion_signatures { diff --git a/libs/core/execution/include/hpx/execution/algorithms/make_future.hpp b/libs/core/execution/include/hpx/execution/algorithms/make_future.hpp index 4e13bc57a2f6..a66c5f3ff752 100644 --- a/libs/core/execution/include/hpx/execution/algorithms/make_future.hpp +++ b/libs/core/execution/include/hpx/execution/algorithms/make_future.hpp @@ -34,6 +34,7 @@ namespace hpx::execution::experimental { + namespace hpxexec = hpx::execution::experimental; // enforce proper formatting namespace detail { @@ -133,11 +134,10 @@ namespace hpx::execution::experimental { future_data(init_no_addref no_addref, other_allocator const& alloc, Sender&& sender) : base_type(no_addref, alloc) - , op_state(hpx::execution::experimental::connect( - HPX_FORWARD(Sender, sender), + , op_state(hpxexec::connect(HPX_FORWARD(Sender, sender), detail::future_receiver{{this}})) { - hpx::execution::experimental::start(op_state); + hpxexec::start(op_state); } }; @@ -146,7 +146,7 @@ namespace hpx::execution::experimental { : future_data> { - hpx::execution::experimental::run_loop& loop; + hpxexec::run_loop& loop; using base_type = future_data; @@ -157,10 +157,10 @@ namespace hpx::execution::experimental { future_data_with_run_loop(init_no_addref no_addref, other_allocator const& alloc, #if defined(HPX_HAVE_STDEXEC) - decltype(std::declval() - .get_scheduler()) const& sched, + decltype(std::declval().get_scheduler()) + const& sched, #else - hpx::execution::experimental::run_loop_scheduler const& sched, + hpxexec::run_loop_scheduler const& sched, #endif Sender&& sender) : base_type(no_addref, alloc, HPX_FORWARD(Sender, sender)) @@ -168,8 +168,7 @@ namespace hpx::execution::experimental { //TODO: Keep an eye on this, it is based on the internal impl of // stdexec, so it is subect to change. This is currently relying // on the env struct to expose __loop_ as a public member. - , loop(*hpx::execution::experimental::get_env(schedule(sched)) - .__loop_) + , loop(*hpxexec::get_env(schedule(sched)).__loop_) #else , loop(sched.get_run_loop()) #endif @@ -196,15 +195,14 @@ namespace hpx::execution::experimental { { using allocator_type = Allocator; - using value_types = hpx::execution::experimental::value_types_of_t< - std::decay_t, hpx::execution::experimental::empty_env, - meta::pack, meta::pack>; + using value_types = hpxexec::value_types_of_t, + hpxexec::empty_env, meta::pack, meta::pack>; using result_type = std::decay_t>; - using operation_state_type = hpx::util::invoke_result_t< - hpx::execution::experimental::connect_t, Sender, - detail::future_receiver>; + using operation_state_type = + hpx::util::invoke_result_t>; using shared_state = future_data; @@ -233,24 +231,23 @@ namespace hpx::execution::experimental { template auto make_future_with_run_loop( #if defined(HPX_HAVE_STDEXEC) - decltype(std::declval() - .get_scheduler()) const& sched, + decltype(std::declval().get_scheduler()) + const& sched, #else - hpx::execution::experimental::run_loop_scheduler const& sched, + hpxexec::run_loop_scheduler const& sched, #endif Sender&& sender, Allocator const& allocator) { using allocator_type = Allocator; - using value_types = hpx::execution::experimental::value_types_of_t< - std::decay_t, hpx::execution::experimental::empty_env, - meta::pack, meta::pack>; + using value_types = hpxexec::value_types_of_t, + hpxexec::empty_env, meta::pack, meta::pack>; using result_type = std::decay_t>; - using operation_state_type = hpx::util::invoke_result_t< - hpx::execution::experimental::connect_t, Sender, - detail::future_receiver>; + using operation_state_type = + hpx::util::invoke_result_t>; using shared_state = future_data_with_run_loop; @@ -276,26 +273,25 @@ namespace hpx::execution::experimental { namespace hpx::traits::detail { + namespace hpxexec = hpx::execution::experimental; template - struct shared_state_allocator, + struct shared_state_allocator< + hpxexec::detail::future_data, NewAllocator> { - using type = hpx::execution::experimental::detail::future_data; + using type = + hpxexec::detail::future_data; }; template - struct shared_state_allocator< - hpx::execution::experimental::detail::future_data_with_run_loop, + struct shared_state_allocator, NewAllocator> { - using type = - hpx::execution::experimental::detail::future_data_with_run_loop; + using type = hpxexec::detail::future_data_with_run_loop; }; } // namespace hpx::traits::detail @@ -330,7 +326,7 @@ namespace hpx::execution::experimental { is_sender_v && hpx::traits::is_allocator_v && experimental::detail::is_completion_scheduler_tag_invocable_v< - hpx::execution::experimental::set_value_t, + hpxexec::set_value_t, Sender, make_future_t, Allocator > )> @@ -340,13 +336,11 @@ namespace hpx::execution::experimental { { #if defined(HPX_HAVE_STDEXEC) auto scheduler = - hpx::execution::experimental::get_completion_scheduler< - hpx::execution::experimental::set_value_t>( - hpx::execution::experimental::get_env(sender)); + hpxexec::get_completion_scheduler( + hpxexec::get_env(sender)); #else auto scheduler = - hpx::execution::experimental::get_completion_scheduler< - hpx::execution::experimental::set_value_t>(sender); + hpxexec::get_completion_scheduler(sender); #endif return hpx::functional::tag_invoke(make_future_t{}, @@ -357,15 +351,14 @@ namespace hpx::execution::experimental { template , HPX_CONCEPT_REQUIRES_( - hpx::execution::experimental::is_sender_v + hpxexec::is_sender_v )> // clang-format on friend auto tag_invoke(make_future_t, #if defined(HPX_HAVE_STDEXEC) - decltype(std::declval() - .get_scheduler()) const& sched, + decltype(std::declval().get_scheduler()) const& sched, #else - hpx::execution::experimental::run_loop_scheduler const& sched, + hpxexec::run_loop_scheduler const& sched, #endif Sender&& sender, Allocator const& allocator = Allocator{}) { @@ -391,16 +384,15 @@ namespace hpx::execution::experimental { template , HPX_CONCEPT_REQUIRES_( - hpx::execution::experimental::is_scheduler_v && + hpxexec::is_scheduler_v && hpx::traits::is_allocator_v )> // clang-format on friend constexpr HPX_FORCEINLINE auto tag_fallback_invoke(make_future_t, Scheduler&& scheduler, Allocator const& allocator = Allocator{}) { - return hpx::execution::experimental::detail::inject_scheduler< - make_future_t, Scheduler, Allocator>{ - HPX_FORWARD(Scheduler, scheduler), allocator}; + return hpxexec::detail::inject_scheduler{HPX_FORWARD(Scheduler, scheduler), allocator}; } // clang-format off diff --git a/libs/core/execution/include/hpx/execution/algorithms/when_all.hpp b/libs/core/execution/include/hpx/execution/algorithms/when_all.hpp index 45c5825dea2e..5e5bafb494d3 100644 --- a/libs/core/execution/include/hpx/execution/algorithms/when_all.hpp +++ b/libs/core/execution/include/hpx/execution/algorithms/when_all.hpp @@ -14,31 +14,30 @@ #include namespace hpx::execution::experimental { + + namespace hpxexec = hpx::execution::experimental; + template constexpr HPX_FORCEINLINE auto tag_invoke( hpx::detail::dataflow_t, F&& f, Sender&& sender, Senders&&... senders) - -> decltype(hpx::execution::experimental::then( - hpx::execution::experimental::when_all( - HPX_FORWARD(Sender, sender), HPX_FORWARD(Senders, senders)...), + -> decltype(hpxexec::then(hpxexec::when_all(HPX_FORWARD(Sender, sender), + HPX_FORWARD(Senders, senders)...), HPX_FORWARD(F, f))) { - return hpx::execution::experimental::then( - hpx::execution::experimental::when_all( - HPX_FORWARD(Sender, sender), HPX_FORWARD(Senders, senders)...), + return hpxexec::then(hpxexec::when_all(HPX_FORWARD(Sender, sender), + HPX_FORWARD(Senders, senders)...), HPX_FORWARD(F, f)); } template constexpr HPX_FORCEINLINE auto tag_invoke(hpx::detail::dataflow_t, hpx::launch, F&& f, Sender&& sender, Senders&&... senders) - -> decltype(hpx::execution::experimental::then( - hpx::execution::experimental::when_all( - HPX_FORWARD(Sender, sender), HPX_FORWARD(Senders, senders)...), + -> decltype(hpxexec::then(hpxexec::when_all(HPX_FORWARD(Sender, sender), + HPX_FORWARD(Senders, senders)...), HPX_FORWARD(F, f))) { - return hpx::execution::experimental::then( - hpx::execution::experimental::when_all( - HPX_FORWARD(Sender, sender), HPX_FORWARD(Senders, senders)...), + return hpxexec::then(hpxexec::when_all(HPX_FORWARD(Sender, sender), + HPX_FORWARD(Senders, senders)...), HPX_FORWARD(F, f)); } } // namespace hpx::execution::experimental diff --git a/libs/core/execution/include/hpx/execution/algorithms/when_all_vector.hpp b/libs/core/execution/include/hpx/execution/algorithms/when_all_vector.hpp index b2c1f6db25c7..a753d9c76885 100644 --- a/libs/core/execution/include/hpx/execution/algorithms/when_all_vector.hpp +++ b/libs/core/execution/include/hpx/execution/algorithms/when_all_vector.hpp @@ -41,6 +41,7 @@ #include namespace hpx::when_all_vector_detail { + namespace hpxexec = hpx::execution::experimental; // callback object to request cancellation struct on_stop_requested @@ -85,11 +86,9 @@ namespace hpx::when_all_vector_detail { // We expect a single value type or nothing from the predecessor // sender type - using element_value_type = - std::decay_t>>; + using element_value_type = std::decay_t< + hpxexec::detail::single_result_t>>; static constexpr bool is_void_value_type = std::is_void_v; @@ -107,14 +106,13 @@ namespace hpx::when_all_vector_detail { template struct set_value_completion_helper { - using type = hpx::execution::experimental::set_value_t( - std::vector); + using type = hpxexec::set_value_t(std::vector); }; template struct set_value_completion_helper { - using type = hpx::execution::experimental::set_value_t(); + using type = hpxexec::set_value_t(); }; using set_value_transform_to_vector = @@ -122,23 +120,19 @@ namespace hpx::when_all_vector_detail { template using transformed_comp_sigs_identity = - hpx::execution::experimental::completion_signatures< - set_value_transform_to_vector>; + hpxexec::completion_signatures; template using decay_set_error = - hpx::execution::experimental::completion_signatures< - hpx::execution::experimental::set_error_t(std::decay_t)>; + hpxexec::completion_signatures)>; template - friend auto tag_invoke( - hpx::execution::experimental::get_completion_signatures_t, + friend auto tag_invoke(hpxexec::get_completion_signatures_t, when_all_vector_sender_type const&, Env const&) noexcept - -> hpx::execution::experimental::transform_completion_signatures_of< - Sender, Env, - hpx::execution::experimental::completion_signatures< - hpx::execution::experimental::set_error_t( - std::exception_ptr)>, + -> hpxexec::transform_completion_signatures_of, transformed_comp_sigs_identity, decay_set_error>; #else // This sender sends a single vector of the type sent by the @@ -157,8 +151,7 @@ namespace hpx::when_all_vector_detail { template