diff --git a/include/oneapi/dpl/pstl/glue_algorithm_ranges_impl.h b/include/oneapi/dpl/pstl/glue_algorithm_ranges_impl.h index 048c3348cd6..9da0855fe69 100644 --- a/include/oneapi/dpl/pstl/glue_algorithm_ranges_impl.h +++ b/include/oneapi/dpl/pstl/glue_algorithm_ranges_impl.h @@ -102,14 +102,14 @@ struct __transform_fn template - requires oneapi::dpl::is_execution_policy_v> && (std::ranges::sized_range<_R1> - || std::ranges::sized_range<_R2>) && std::ranges::sized_range<_OutRange> + requires oneapi::dpl::is_execution_policy_v> && std::ranges::sized_range<_R1> + && std::ranges::sized_range<_R2> && std::ranges::sized_range<_OutRange> && std::indirectly_writable, - std::indirect_result_t<_F&, std::projected, _Proj1>, - std::projected, _Proj2>>> + std::indirect_result_t<_F&, std::projected, _Proj1>, + std::projected, _Proj2>>> std::ranges::binary_transform_result, std::ranges::borrowed_iterator_t<_R2>, - std::ranges::borrowed_iterator_t<_OutRange>> + std::ranges::borrowed_iterator_t<_OutRange>> operator()(_ExecutionPolicy&& __exec, _R1&& __r1, _R2&& __r2, _OutRange&& __out_r, _F __binary_op, _Proj1 __proj1 = {}, _Proj2 __proj2 = {}) const { @@ -117,17 +117,13 @@ struct __transform_fn using _Size = std::common_type_t, oneapi::dpl::__internal::__range_size_t<_R2>, std::ranges::range_size_t<_OutRange>>; - _Size __size = std::ranges::size(__out_r); - if constexpr(std::ranges::sized_range<_R1>) - __size = std::ranges::min(__size, (_Size)std::ranges::size(__r1)); - if constexpr(std::ranges::sized_range<_R2>) - __size = std::ranges::min(__size, (_Size)std::ranges::size(__r2)); + const _Size __size = std::ranges::min({(_Size)std::ranges::size(__r1), (_Size)std::ranges::size(__r2), + (_Size)std::ranges::size(__out_r)}); - //take_view doesn't make unsized range sized, so subrange is used below - oneapi::dpl::__internal::__ranges::__pattern_transform(__dispatch_tag, std::forward<_ExecutionPolicy>(__exec), - std::ranges::subrange(std::ranges::begin(__r1), std::ranges::begin(__r1) + __size), - std::ranges::subrange(std::ranges::begin(__r2), std::ranges::begin(__r2) + __size), - std::ranges::take_view(__out_r, __size), __binary_op, __proj1, __proj2); + oneapi::dpl::__internal::__ranges::__pattern_transform( + __dispatch_tag, std::forward<_ExecutionPolicy>(__exec), std::ranges::take_view(__r1, __size), + std::ranges::take_view(__r2, __size), std::ranges::take_view(__out_r, __size), __binary_op, __proj1, + __proj2); return {std::ranges::begin(__r1) + __size, std::ranges::begin(__r2) + __size, std::ranges::begin(__out_r) + __size}; } diff --git a/test/parallel_api/ranges/std_ranges_transform.pass.cpp b/test/parallel_api/ranges/std_ranges_transform.pass.cpp index feac30191e9..3636143309e 100644 --- a/test/parallel_api/ranges/std_ranges_transform.pass.cpp +++ b/test/parallel_api/ranges/std_ranges_transform.pass.cpp @@ -50,14 +50,10 @@ main() { using Size = std::common_type_t, range_size_t, std::ranges::range_size_t>; - Size size = std::ranges::size(r_out); - if constexpr(std::ranges::sized_range) - size = std::ranges::min(size, (Size)std::ranges::size(r_1)); - if constexpr(std::ranges::sized_range) - size = std::ranges::min(size, (Size)std::ranges::size(r_2)); + Size size = std::ranges::min({(Size)std::ranges::size(r_1), (Size)std::ranges::size(r_2), + (Size)std::ranges::size(r_out)}); - auto res = std::ranges::transform(std::ranges::subrange(std::ranges::begin(r_1), std::ranges::begin(r_1) + size), - std::ranges::subrange(std::ranges::begin(r_2), std::ranges::begin(r_2) + size), + auto res = std::ranges::transform(std::ranges::take_view(r_1, + size), std::ranges::take_view(r_2, size), std::ranges::take_view(r_out, size).begin(), std::forward(args)...); using ret_type = std::ranges::binary_transform_result, diff --git a/test/parallel_api/ranges/std_ranges_transform_iota.pass.cpp b/test/parallel_api/ranges/std_ranges_transform_iota.pass.cpp index 3aa451bfe0f..75b4237dd8a 100644 --- a/test/parallel_api/ranges/std_ranges_transform_iota.pass.cpp +++ b/test/parallel_api/ranges/std_ranges_transform_iota.pass.cpp @@ -21,11 +21,11 @@ main() #if _ENABLE_STD_RANGES_TESTING using namespace test_std_ranges; namespace dpl_ranges = oneapi::dpl::ranges; - const char* err_msg = "Wrong effect algo transform with unsized ranges."; + const char* err_msg = "Wrong effect algo ranges::transform."; const int n = medium_size; - std::ranges::iota_view view1(0, n); //size range - std::ranges::iota_view view2(0, std::unreachable_sentinel_t{}); //unsized + std::ranges::iota_view view1(0, n); + std::ranges::iota_view view2(0, n); std::vector res(n), expected(n); std::ranges::transform(view1, view2, expected.begin(), binary_f, proj, proj); diff --git a/test/parallel_api/ranges/std_ranges_transform_iota_sycl.pass.cpp b/test/parallel_api/ranges/std_ranges_transform_iota_sycl.pass.cpp index 67f8cd702a0..9408c184123 100644 --- a/test/parallel_api/ranges/std_ranges_transform_iota_sycl.pass.cpp +++ b/test/parallel_api/ranges/std_ranges_transform_iota_sycl.pass.cpp @@ -21,11 +21,11 @@ main() #if _ENABLE_STD_RANGES_TESTING && TEST_DPCPP_BACKEND_PRESENT using namespace test_std_ranges; namespace dpl_ranges = oneapi::dpl::ranges; - const char* err_msg = "Wrong effect algo transform with unsized ranges."; + const char* err_msg = "Wrong effect algo ranges::transform."; const int n = big_size; std::ranges::iota_view view1(0, n); //size range - std::ranges::iota_view view2(0, std::unreachable_sentinel_t{}); //unsized + std::ranges::iota_view view2(0, n); std::vector src(n), expected(n); std::ranges::transform(view1, view2, expected.begin(), binary_f, proj, proj);