From 294fbfbf97c6cd9175b33d9a685f4228c996d04e Mon Sep 17 00:00:00 2001 From: sleepingeight Date: Thu, 26 Feb 2026 23:20:05 +0530 Subject: [PATCH] 1/n: conforming parallel range algos to the standard Signed-off-by: sleepingeight --- .../adjacent_difference.hpp | 141 ++++-------------- .../adjacentdifference_range.cpp | 4 +- .../adjacentdifference_range_sender.cpp | 2 +- .../unit/container_algorithms/test_utils.hpp | 13 +- 4 files changed, 45 insertions(+), 115 deletions(-) diff --git a/libs/core/algorithms/include/hpx/parallel/container_algorithms/adjacent_difference.hpp b/libs/core/algorithms/include/hpx/parallel/container_algorithms/adjacent_difference.hpp index 37c8a9b1a4be..6cf32ed2120f 100644 --- a/libs/core/algorithms/include/hpx/parallel/container_algorithms/adjacent_difference.hpp +++ b/libs/core/algorithms/include/hpx/parallel/container_algorithms/adjacent_difference.hpp @@ -353,172 +353,91 @@ namespace hpx::ranges { : hpx::detail::tag_parallel_algorithm { private: - template - // clang-format off - requires ( - hpx::traits::is_iterator_v && - hpx::traits::is_iterator_v && - std::sentinel_for - ) - // clang-format on + template Sent> friend FwdIter2 tag_fallback_invoke(hpx::ranges::adjacent_difference_t, FwdIter1 first, Sent last, FwdIter2 dest) { - static_assert(std::forward_iterator, - "Required at least forward iterator."); - static_assert(std::forward_iterator, - "Required at least forward iterator."); - return hpx::parallel::detail::adjacent_difference().call( hpx::execution::seq, first, last, dest, std::minus<>()); } - template - // clang-format off - requires(std::ranges::range && - hpx::traits::is_iterator_v) - // clang-format on + template friend FwdIter2 tag_fallback_invoke( hpx::ranges::adjacent_difference_t, Rng&& rng, FwdIter2 dest) { - static_assert(std::forward_iterator>, - "Required at least forward iterator."); - static_assert(std::forward_iterator, - "Required at least forward iterator."); - return hpx::parallel::detail::adjacent_difference().call( hpx::execution::seq, hpx::util::begin(rng), hpx::util::end(rng), dest, std::minus<>()); } - template - // clang-format off - requires ( - hpx::is_execution_policy_v && - hpx::traits::is_iterator_v && - hpx::traits::is_iterator_v && - std::sentinel_for - ) - // clang-format on + template Sent, + std::random_access_iterator RaIter2> friend decltype(auto) tag_fallback_invoke( hpx::ranges::adjacent_difference_t, ExPolicy&& policy, - FwdIter1 first, Sent last, FwdIter2 dest) + RaIter1 first, Sent last, RaIter2 dest) { - static_assert(std::forward_iterator, - "Required at least forward iterator."); - static_assert(std::forward_iterator, - "Required at least forward iterator."); - - return hpx::parallel::detail::adjacent_difference().call( + return hpx::parallel::detail::adjacent_difference().call( HPX_FORWARD(ExPolicy, policy), first, last, dest, std::minus<>()); } - template - // clang-format off - requires ( - hpx::is_execution_policy_v && - std::ranges::range && - hpx::traits::is_iterator_v - ) - // clang-format on + template friend decltype(auto) tag_fallback_invoke( hpx::ranges::adjacent_difference_t, ExPolicy&& policy, Rng&& rng, - FwdIter2 dest) + RaIter2 dest) { - static_assert(std::forward_iterator>, - "Required at least forward iterator."); - static_assert(std::forward_iterator, - "Required at least forward iterator."); - - return hpx::parallel::detail::adjacent_difference().call( + return hpx::parallel::detail::adjacent_difference().call( HPX_FORWARD(ExPolicy, policy), hpx::util::begin(rng), hpx::util::end(rng), dest, std::minus<>()); } - template Sent, std::forward_iterator FwdIter2, typename Op> - // clang-format off - requires(hpx::traits::is_iterator_v && - hpx::traits::is_iterator_v && - std::sentinel_for) - // clang-format on friend FwdIter2 tag_fallback_invoke(hpx::ranges::adjacent_difference_t, FwdIter1 first, Sent last, FwdIter2 dest, Op op) { - static_assert(std::forward_iterator, - "Required at least forward iterator."); - static_assert(std::forward_iterator, - "Required at least forward iterator."); - return hpx::parallel::detail::adjacent_difference().call( hpx::execution::sequenced_policy{}, first, last, dest, HPX_MOVE(op)); } - template - // clang-format off - requires ( - std::ranges::range && - hpx::traits::is_iterator_v - ) - // clang-format on + template friend FwdIter2 tag_fallback_invoke( hpx::ranges::adjacent_difference_t, Rng&& rng, FwdIter2 dest, Op op) { - static_assert(std::forward_iterator>, - "Required at least forward iterator."); - static_assert(std::forward_iterator, - "Required at least forward iterator."); - return hpx::parallel::detail::adjacent_difference().call( hpx::execution::seq, hpx::util::begin(rng), hpx::util::end(rng), dest, HPX_MOVE(op)); } - template - // clang-format off - requires ( - hpx::is_execution_policy_v && - hpx::traits::is_iterator_v && - hpx::traits::is_iterator_v && - std::sentinel_for - ) - // clang-format on + template Sent, + std::random_access_iterator RaIter2, typename Op> friend decltype(auto) tag_fallback_invoke( hpx::ranges::adjacent_difference_t, ExPolicy&& policy, - FwdIter1 first, Sent last, FwdIter2 dest, Op op) + RaIter1 first, Sent last, RaIter2 dest, Op op) { - static_assert(std::forward_iterator, - "Required at least forward iterator."); - static_assert(std::forward_iterator, - "Required at least forward iterator."); - - return hpx::parallel::detail::adjacent_difference().call( + return hpx::parallel::detail::adjacent_difference().call( HPX_FORWARD(ExPolicy, policy), first, last, dest, HPX_MOVE(op)); } - template - // clang-format off - requires ( - hpx::is_execution_policy_v && - std::ranges::range && - hpx::traits::is_iterator_v - ) - // clang-format on + template friend decltype(auto) tag_fallback_invoke( hpx::ranges::adjacent_difference_t, ExPolicy&& policy, Rng&& rng, - FwdIter2 dest, Op op) + RaIter2 dest, Op op) { - static_assert(std::forward_iterator>, - "Required at least forward iterator."); - static_assert(std::forward_iterator, - "Required at least forward iterator."); - - return hpx::parallel::detail::adjacent_difference().call( + return hpx::parallel::detail::adjacent_difference().call( HPX_FORWARD(ExPolicy, policy), hpx::util::begin(rng), hpx::util::end(rng), dest, HPX_MOVE(op)); } diff --git a/libs/core/algorithms/tests/unit/container_algorithms/adjacentdifference_range.cpp b/libs/core/algorithms/tests/unit/container_algorithms/adjacentdifference_range.cpp index 0d52f56ca4e1..6b95c8eed39e 100644 --- a/libs/core/algorithms/tests/unit/container_algorithms/adjacentdifference_range.cpp +++ b/libs/core/algorithms/tests/unit/container_algorithms/adjacentdifference_range.cpp @@ -31,8 +31,8 @@ void test_sen(ExPolicy policy) std::vector d(10007); std::vector d_ans(10007); - auto it = hpx::ranges::adjacent_difference( - policy, std::begin(c), sentinel{10007}, std::begin(d)); + auto it = hpx::ranges::adjacent_difference(policy, std::begin(c), + test::sentinel_from_iterator(std::end(c) - 1), std::begin(d)); std::adjacent_difference(std::begin(c), std::end(c), std::begin(d_ans)); HPX_TEST(std::equal(std::begin(d), std::end(d) - 1, std::begin(d_ans), diff --git a/libs/core/algorithms/tests/unit/container_algorithms/adjacentdifference_range_sender.cpp b/libs/core/algorithms/tests/unit/container_algorithms/adjacentdifference_range_sender.cpp index 0f9f127aded6..6e7275f098ea 100644 --- a/libs/core/algorithms/tests/unit/container_algorithms/adjacentdifference_range_sender.cpp +++ b/libs/core/algorithms/tests/unit/container_algorithms/adjacentdifference_range_sender.cpp @@ -39,7 +39,7 @@ void test_sen_direct(Policy l, ExPolicy&& policy) auto exec = ex::explicit_scheduler_executor(scheduler_t(l)); auto it = hpx::ranges::adjacent_difference(policy.on(exec), std::begin(c), - sentinel{10007}, std::begin(d)); + test::sentinel_from_iterator(std::end(c) - 1), std::begin(d)); std::adjacent_difference(std::begin(c), std::end(c), std::begin(d_ans)); diff --git a/libs/core/algorithms/tests/unit/container_algorithms/test_utils.hpp b/libs/core/algorithms/tests/unit/container_algorithms/test_utils.hpp index 1416bf683a10..e08a61fb090e 100644 --- a/libs/core/algorithms/tests/unit/container_algorithms/test_utils.hpp +++ b/libs/core/algorithms/tests/unit/container_algorithms/test_utils.hpp @@ -18,7 +18,6 @@ #include #include #include -#include #include #include #include @@ -63,6 +62,18 @@ namespace test { return i != s.get(); } + friend auto operator-(sentinel_from_iterator s, IterType i) + requires std::random_access_iterator + { + return s.get() - i; + } + + friend auto operator-(IterType i, sentinel_from_iterator s) + requires std::random_access_iterator + { + return i - s.get(); + } + private: IterType end; };