Skip to content

Commit ea3d9de

Browse files
committed
[oneDPL][ranges][L1] + ranges __pattern_reverse
1 parent 04b3ac0 commit ea3d9de

File tree

3 files changed

+42
-3
lines changed

3 files changed

+42
-3
lines changed

include/oneapi/dpl/pstl/algorithm_ranges_impl.h

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -748,7 +748,7 @@ __pattern_unique(_Tag __tag, _ExecutionPolicy&& __exec, _R&& __r, _Comp __comp,
748748
auto __it = oneapi::dpl::__internal::__pattern_unique(__tag, std::forward<_ExecutionPolicy>(__exec),
749749
__beg, __end, __pred_2);
750750

751-
return std::ranges::borrowed_subrange_t<_R>(__it, __end);
751+
return {__it, __end};
752752
}
753753

754754
template <typename _Tag, typename _ExecutionPolicy, typename _R, typename _Comp, typename _Proj>
@@ -758,6 +758,27 @@ __pattern_unique(__serial_tag</*IsVector*/ std::false_type>, _ExecutionPolicy&&,
758758
return std::ranges::unique(std::forward<_R>(__r), __comp, __proj);
759759
}
760760

761+
template <typename _Tag, typename _ExecutionPolicy, typename _R>
762+
std::ranges::borrowed_subrange_t<_R>
763+
__pattern_reverse(_Tag __tag, _ExecutionPolicy&& __exec, _R&& __r)
764+
{
765+
auto __beg = std::ranges::begin(__r);
766+
const auto __n = std::ranges::size(__r);
767+
const auto __n_2 = __n / 2;
768+
auto __r1 = std::ranges::take_view(__r, __n_2);
769+
auto __r2 = std::ranges::take_view(std::ranges::reverse_view(__r), __n_2);
770+
771+
__pattern_swap_ranges(std::forward<_ExecutionPolicy>(__exec), std::move(__r1), std::move(__r2));
772+
return {__beg + __n};
773+
}
774+
775+
template <typename _Tag, typename _ExecutionPolicy, typename _R>
776+
std::ranges::borrowed_subrange_t<_R>
777+
__pattern_reverse(__serial_tag</*IsVector*/ std::false_type>, _ExecutionPolicy&&, _R&& __r)
778+
{
779+
return std::ranges::reverse(std::forward<_R>(__r));
780+
}
781+
761782
template <typename _Tag, typename _ExecutionPolicy, typename _R, typename _OutRange, typename _Comp, typename _Proj>
762783
std::ranges::unique_copy_result<std::ranges::borrowed_iterator_t<_R>, std::ranges::borrowed_iterator_t<_OutRange>>
763784
__pattern_unique_copy(_Tag __tag, _ExecutionPolicy&& __exec, _R&& __r, _OutRange&& __out_r, _Comp __comp, _Proj __proj)

include/oneapi/dpl/pstl/glue_algorithm_ranges_impl.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1124,6 +1124,10 @@ struct __reverse_fn
11241124

11251125
oneapi::dpl::ranges::swap_ranges(std::forward<_ExecutionPolicy>(__exec), std::move(__r1),std::move(__r2));
11261126
return {std::ranges::begin(__r) + __n};
1127+
1128+
const auto __dispatch_tag = oneapi::dpl::__ranges::__select_backend(__exec);
1129+
return oneapi::dpl::__internal::__ranges::__pattern_reverse(__dispatch_tag,
1130+
std::forward<_ExecutionPolicy>(__exec), std::forward<_R>(__r));
11271131
}
11281132

11291133
}; //__reverse_fn

include/oneapi/dpl/pstl/hetero/algorithm_ranges_impl_hetero.h

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,11 +196,11 @@ __pattern_swap(__hetero_tag<_BackendTag>, _ExecutionPolicy&& __exec, _Range1&& _
196196

197197
#if _ONEDPL_CPP20_RANGES_PRESENT
198198
template<typename _BackendTag, typename _ExecutionPolicy, typename _R1, typename _R2>
199-
bool
199+
void
200200
__pattern_swap_ranges(__hetero_tag<_BackendTag> __tag, _ExecutionPolicy&& __exec, _R1&& __r1, _R2&& __r2)
201201
{
202202
return oneapi::dpl::__internal::__ranges::__pattern_swap(__tag, std::forward<_ExecutionPolicy>(__exec),
203-
oneapi::dpl::__ranges::views::all(std::forward<_R1>(__r1)), oneapi::dpl::__ranges::views::all(::std::forward<_R2>(__r2)));
203+
oneapi::dpl::__ranges::views::all(std::forward<_R1>(__r1)), oneapi::dpl::__ranges::views::all(std::forward<_R2>(__r2)));
204204
}
205205
#endif //_ONEDPL_CPP20_RANGES_PRESENT
206206

@@ -791,6 +791,20 @@ __pattern_unique_copy(__hetero_tag<_BackendTag> __tag, _ExecutionPolicy&& __exec
791791

792792
return {__end, __beg_out + __idx};
793793
}
794+
795+
template <typename _BackendTag, typename _ExecutionPolicy, typename _R>
796+
std::ranges::borrowed_iterator_t<_R>
797+
__pattern_reverse(__hetero_tag<_BackendTag> __tag, _ExecutionPolicy&& __exec, _R&& __r)
798+
{
799+
auto __beg = std::ranges::begin(__r);
800+
801+
using _DiffType = oneapi::dpl::__internal::__difference_t<_R>;
802+
auto __i = oneapi::dpl::__par_backend_hetero::__parallel_for(_BackendTag{}, std::forward<_ExecutionPolicy>(__exec),
803+
unseq_backend::__reverse_functor<_DiffType>{__n}, __n / 2,
804+
oneapi::dpl::__ranges::views::all(std::forward<_R>(__r))).__checked_deferrable_wait();
805+
806+
return {__beg + __i};
807+
}
794808
#endif //_ONEDPL_CPP20_RANGES_PRESENT
795809

796810
//------------------------------------------------------------------------

0 commit comments

Comments
 (0)