@@ -102,32 +102,28 @@ struct __transform_fn
102
102
template <typename _ExecutionPolicy, std::ranges::random_access_range _R1, std::ranges::random_access_range _R2,
103
103
std::ranges::random_access_range _OutRange, std::copy_constructible _F, typename _Proj1 = std::identity,
104
104
typename _Proj2 = std::identity>
105
- requires oneapi::dpl::is_execution_policy_v<std::remove_cvref_t <_ExecutionPolicy>> && ( std::ranges::sized_range<_R1>
106
- || std::ranges::sized_range<_R2>) && std::ranges::sized_range<_OutRange>
105
+ requires oneapi::dpl::is_execution_policy_v<std::remove_cvref_t <_ExecutionPolicy>> && std::ranges::sized_range<_R1>
106
+ && std::ranges::sized_range<_R2> && std::ranges::sized_range<_OutRange>
107
107
&& std::indirectly_writable<std::ranges::iterator_t <_OutRange>,
108
- std::indirect_result_t <_F&, std::projected<std::ranges::iterator_t <_R1>, _Proj1>,
109
- std::projected<std::ranges::iterator_t <_R2>, _Proj2>>>
108
+ std::indirect_result_t <_F&, std::projected<std::ranges::iterator_t <_R1>, _Proj1>,
109
+ std::projected<std::ranges::iterator_t <_R2>, _Proj2>>>
110
110
111
111
std::ranges::binary_transform_result<std::ranges::borrowed_iterator_t <_R1>, std::ranges::borrowed_iterator_t <_R2>,
112
- std::ranges::borrowed_iterator_t <_OutRange>>
112
+ std::ranges::borrowed_iterator_t <_OutRange>>
113
113
operator ()(_ExecutionPolicy&& __exec, _R1&& __r1, _R2&& __r2, _OutRange&& __out_r, _F __binary_op,
114
114
_Proj1 __proj1 = {}, _Proj2 __proj2 = {}) const
115
115
{
116
116
const auto __dispatch_tag = oneapi::dpl::__ranges::__select_backend (__exec);
117
117
118
118
using _Size = std::common_type_t <oneapi::dpl::__internal::__range_size_t <_R1>,
119
119
oneapi::dpl::__internal::__range_size_t <_R2>, std::ranges::range_size_t <_OutRange>>;
120
- _Size __size = std::ranges::size (__out_r);
121
- if constexpr (std::ranges::sized_range<_R1>)
122
- __size = std::ranges::min (__size, (_Size)std::ranges::size (__r1));
123
- if constexpr (std::ranges::sized_range<_R2>)
124
- __size = std::ranges::min (__size, (_Size)std::ranges::size (__r2));
120
+ const _Size __size = std::ranges::min ({(_Size)std::ranges::size (__r1), (_Size)std::ranges::size (__r2),
121
+ (_Size)std::ranges::size (__out_r)});
125
122
126
- // take_view doesn't make unsized range sized, so subrange is used below
127
- oneapi::dpl::__internal::__ranges::__pattern_transform (__dispatch_tag, std::forward<_ExecutionPolicy>(__exec),
128
- std::ranges::subrange (std::ranges::begin (__r1), std::ranges::begin (__r1) + __size),
129
- std::ranges::subrange (std::ranges::begin (__r2), std::ranges::begin (__r2) + __size),
130
- std::ranges::take_view (__out_r, __size), __binary_op, __proj1, __proj2);
123
+ oneapi::dpl::__internal::__ranges::__pattern_transform (
124
+ __dispatch_tag, std::forward<_ExecutionPolicy>(__exec), std::ranges::take_view (__r1, __size),
125
+ std::ranges::take_view (__r2, __size), std::ranges::take_view (__out_r, __size), __binary_op, __proj1,
126
+ __proj2);
131
127
132
128
return {std::ranges::begin (__r1) + __size, std::ranges::begin (__r2) + __size, std::ranges::begin (__out_r) + __size};
133
129
}
0 commit comments