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..e2f0df4c5109 100644 --- a/libs/core/execution/include/hpx/execution/algorithms/as_sender.hpp +++ b/libs/core/execution/include/hpx/execution/algorithms/as_sender.hpp @@ -15,7 +15,6 @@ #include #include #include -#include #include #include #include @@ -25,7 +24,7 @@ #include namespace hpx::execution::experimental { - + namespace hpxexp = hpx::execution::experimental; namespace detail { /////////////////////////////////////////////////////////////////////////// @@ -54,10 +53,9 @@ 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 + void start() & noexcept { - os.start_helper(); + start_helper(); } private: @@ -79,19 +77,17 @@ namespace hpx::execution::experimental { { if constexpr (std::is_void_v) { - hpx::execution::experimental::set_value( - HPX_MOVE(receiver_)); + hpxexp::set_value(HPX_MOVE(receiver_)); } else { - hpx::execution::experimental::set_value( + hpxexp::set_value( HPX_MOVE(receiver_), future_.get()); } } else if (future_.has_exception()) { - hpx::execution::experimental::set_error( - HPX_MOVE(receiver_), + hpxexp::set_error(HPX_MOVE(receiver_), future_.get_exception_ptr()); } }; @@ -120,8 +116,7 @@ namespace hpx::execution::experimental { } }, [&](std::exception_ptr ep) { - hpx::execution::experimental::set_error( - HPX_MOVE(receiver_), HPX_MOVE(ep)); + hpxexp::set_error(HPX_MOVE(receiver_), HPX_MOVE(ep)); }); } @@ -140,22 +135,29 @@ namespace hpx::execution::experimental { template struct set_value_void_checked { - using type = hpx::execution::experimental::set_value_t( - _result_type); + using type = hpxexp::set_value_t(_result_type); }; template struct set_value_void_checked { - using type = hpx::execution::experimental::set_value_t(); + using type = hpxexp::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)>; + private: + using _completion_signatures = hpxexp::completion_signatures< + typename set_value_void_checked, + result_type>::type, + hpxexp::set_error_t(std::exception_ptr)>; + + public: + // According to P3557R2 + template + static constexpr auto get_completion_signatures() + { + return _completion_signatures(); + } + #else // Sender compatibility template @@ -210,11 +212,13 @@ namespace hpx::execution::experimental { as_sender_sender(as_sender_sender const&) = delete; as_sender_sender& operator=(as_sender_sender const&) = delete; + // This is not a shared future, so this is only callable with u + // rvalues template - friend as_sender_operation_state tag_invoke( - connect_t, as_sender_sender&& s, Receiver&& receiver) + as_sender_operation_state connect( + Receiver&& receiver) && { - return {HPX_FORWARD(Receiver, receiver), HPX_MOVE(s.future_)}; + return {HPX_FORWARD(Receiver, receiver), HPX_MOVE(future_)}; } }; @@ -241,17 +245,17 @@ namespace hpx::execution::experimental { as_sender_sender& operator=(as_sender_sender const&) = default; template - friend as_sender_operation_state tag_invoke( - connect_t, as_sender_sender&& s, Receiver&& receiver) + as_sender_operation_state connect( + Receiver&& receiver) && { - return {HPX_FORWARD(Receiver, receiver), HPX_MOVE(s.future_)}; + return {HPX_FORWARD(Receiver, receiver), HPX_MOVE(future_)}; } template - friend as_sender_operation_state tag_invoke( - connect_t, as_sender_sender& s, Receiver&& receiver) + as_sender_operation_state connect( + Receiver&& receiver) & { - return {HPX_FORWARD(Receiver, receiver), s.future_}; + return {HPX_FORWARD(Receiver, receiver), future_}; } }; } // namespace detail diff --git a/libs/core/execution/include/hpx/execution/algorithms/bulk.hpp b/libs/core/execution/include/hpx/execution/algorithms/bulk.hpp index 9d67b8c16d08..df6be652da5f 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 hpxexp = 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 = hpxexp::sender_t; template using default_set_value = - hpx::execution::experimental::completion_signatures< - hpx::execution::experimental::set_value_t(Args...)>; + hpxexp::completion_signatures; template using default_set_error = - hpx::execution::experimental::completion_signatures< - hpx::execution::experimental::set_error_t(Arg)>; + hpxexp::completion_signatures; - using disable_set_stopped = - hpx::execution::experimental::completion_signatures<>; + using disable_set_stopped = hpxexp::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 + hpxexp::get_env_t, bulk_sender const& s) noexcept { - return hpx::execution::experimental::get_env(s.sender); + return hpxexp::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< + hpxexp::detail::is_receiver_cpo_v && + hpxexp::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, + hpxexp::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 = hpxexp::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( + hpxexp::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)); + hpxexp::set_stopped(HPX_MOVE(r.receiver)); } template @@ -167,19 +161,18 @@ namespace hpx::execution::experimental { { HPX_INVOKE(f, s, ts...); } - hpx::execution::experimental::set_value( + hpxexp::set_value( HPX_MOVE(receiver), HPX_FORWARD(Ts, ts)...); }, [&](std::exception_ptr ep) { - hpx::execution::experimental::set_error( - HPX_MOVE(receiver), HPX_MOVE(ep)); + hpxexp::set_error(HPX_MOVE(receiver), HPX_MOVE(ep)); }); } template friend auto tag_invoke( set_value_t, bulk_receiver&& r, Ts&&... ts) noexcept - -> decltype(hpx::execution::experimental::set_value( + -> decltype(hpxexp::set_value( std::declval&&>(), HPX_FORWARD(Ts, ts)...), void()) @@ -196,7 +189,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 hpxexp::connect(HPX_MOVE(s.sender), bulk_receiver(HPX_FORWARD(Receiver, receiver), HPX_MOVE(s.shape), HPX_MOVE(s.f))); } @@ -205,7 +198,7 @@ namespace hpx::execution::experimental { friend auto tag_invoke( connect_t, bulk_sender& s, Receiver&& receiver) { - return hpx::execution::experimental::connect(s.sender, + return hpxexp::connect(s.sender, bulk_receiver( HPX_FORWARD(Receiver, receiver), s.shape, s.f)); } @@ -247,7 +240,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, + hpxexp::set_value_t, Sender, bulk_t, Shape, F > )> @@ -256,10 +249,9 @@ namespace hpx::execution::experimental { bulk_t, Sender&& sender, Shape const& shape, F&& f) { auto scheduler = - hpx::execution::experimental::get_completion_scheduler< - hpx::execution::experimental::set_value_t>( + hpxexp::get_completion_scheduler( #if defined(HPX_HAVE_STDEXEC) - hpx::execution::experimental::get_env(sender) + hpxexp::get_env(sender) #else sender #endif 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..2d172b9b3dc1 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 hpxexp = 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( + hpxexp::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)); + hpxexp::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)>; + hpxexp::completion_signatures), + hpxexp::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..ce5e76770385 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 hpxexp = 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(hpxexp::connect(HPX_FORWARD(Sender, sender), detail::future_receiver{{this}})) { - hpx::execution::experimental::start(op_state); + hpxexp::start(op_state); } }; @@ -146,7 +146,7 @@ namespace hpx::execution::experimental { : future_data> { - hpx::execution::experimental::run_loop& loop; + hpxexp::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, + hpxexp::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(*hpxexp::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 = hpxexp::value_types_of_t, + hpxexp::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, + hpxexp::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 = hpxexp::value_types_of_t, + hpxexp::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,24 @@ namespace hpx::execution::experimental { namespace hpx::traits::detail { + namespace hpxexp = hpx::execution::experimental; template - struct shared_state_allocator, - NewAllocator> + struct shared_state_allocator< + hpxexp::detail::future_data, NewAllocator> { - using type = hpx::execution::experimental::detail::future_data; + using type = + hpxexp::detail::future_data; }; template struct shared_state_allocator< - hpx::execution::experimental::detail::future_data_with_run_loop, + hpxexp::detail::future_data_with_run_loop, NewAllocator> { - using type = - hpx::execution::experimental::detail::future_data_with_run_loop; + using type = hpxexp::detail::future_data_with_run_loop; }; } // namespace hpx::traits::detail @@ -330,7 +325,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, + hpxexp::set_value_t, Sender, make_future_t, Allocator > )> @@ -340,13 +335,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)); + hpxexp::get_completion_scheduler( + hpxexp::get_env(sender)); #else auto scheduler = - hpx::execution::experimental::get_completion_scheduler< - hpx::execution::experimental::set_value_t>(sender); + hpxexp::get_completion_scheduler(sender); #endif return hpx::functional::tag_invoke(make_future_t{}, @@ -357,15 +350,15 @@ namespace hpx::execution::experimental { template , HPX_CONCEPT_REQUIRES_( - hpx::execution::experimental::is_sender_v + hpxexp::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, + hpxexp::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 && + hpxexp::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 hpxexp::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..9a6300fd408a 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 hpxexp = 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(hpxexp::then(hpxexp::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 hpxexp::then(hpxexp::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(hpxexp::then(hpxexp::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 hpxexp::then(hpxexp::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 bac1b5685bbe..ee9bd2ad0026 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 @@ -40,6 +41,7 @@ #include namespace hpx::when_all_vector_detail { + namespace hpxexp = hpx::execution::experimental; // callback object to request cancellation struct on_stop_requested @@ -65,6 +67,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; @@ -81,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< + hpxexp::detail::single_result_t>>; static constexpr bool is_void_value_type = std::is_void_v; @@ -103,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 = hpxexp::set_value_t(std::vector); }; template struct set_value_completion_helper { - using type = hpx::execution::experimental::set_value_t(); + using type = hpxexp::set_value_t(); }; using set_value_transform_to_vector = @@ -118,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>; + hpxexp::completion_signatures; template using decay_set_error = - hpx::execution::experimental::completion_signatures< - hpx::execution::experimental::set_error_t(std::decay_t)>; + hpxexp::completion_signatures)>; template - friend auto tag_invoke( - hpx::execution::experimental::get_completion_signatures_t, + friend auto tag_invoke(hpxexp::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)>, + -> hpxexp::transform_completion_signatures_of, transformed_comp_sigs_identity, decay_set_error>; #else // This sender sends a single vector of the type sent by the @@ -153,9 +151,7 @@ namespace hpx::when_all_vector_detail { template