@@ -1267,56 +1267,32 @@ __brick_compute_mask(_RandomAccessIterator __first, _DifferenceType __len, _Iter
12671267 return std::make_pair (__count_true, __len - __count_true);
12681268}
12691269
1270- template <class _ForwardIterator , class _OutputIterator , class _Assigner >
1271- void
1272- __brick_copy_by_mask (_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result, bool * __mask,
1273- _Assigner __assigner, /* vector=*/ ::std::false_type) noexcept
1274- {
1275- for (; __first != __last; ++__first, (void )++__mask)
1276- {
1277- if (*__mask)
1278- {
1279- __assigner (__first, __result);
1280- ++__result;
1281- }
1282- }
1283- }
1284-
1285- template <class _RandomAccessIterator1 , class _RandomAccessIterator2 , class _Assigner >
1286- void
1287- __brick_copy_by_mask (_RandomAccessIterator1 __first, _RandomAccessIterator1 __last, _RandomAccessIterator2 __result,
1288- bool * __mask, _Assigner __assigner, /* vector=*/ ::std::true_type) noexcept
1289- {
1290- __unseq_backend::__simd_copy_by_mask (__first, __last - __first, __result, __mask, __assigner);
1291- }
1292-
1293- template <class _RandomAccessIterator1 , class _RandomAccessIterator2 , class _Bound , class _Assigner >
1270+ template <bool __Bounded, class _RandomAccessIterator1 , class _RandomAccessIterator2 , class _Bound , class _Assigner >
12941271_Bound
1295- __brick_bounded_copy_by_mask (_RandomAccessIterator1 __first, _Bound __in_len, _RandomAccessIterator2 __result,
1296- _Bound __out_len, bool * __mask, _Assigner __assigner, /* vector=*/ std::false_type) noexcept
1272+ __brick_copy_by_mask (_RandomAccessIterator1 __first, _Bound __in_len, _RandomAccessIterator2 __result, _Bound __out_len ,
1273+ bool * __mask, _Assigner __assigner, /* vector=*/ std::false_type) noexcept
12971274{
12981275 _Bound __i = 0 , __j = 0 ;
1299- for (; __i < __in_len; ++__i, ( void )++__first )
1276+ for (; __i < __in_len; ++__i)
13001277 {
13011278 if (__mask[__i])
13021279 {
1303- if (__j == __out_len )
1304- break ;
1305- __assigner (__first, __result) ;
1306- ++ __result;
1280+ if constexpr (__Bounded )
1281+ if (__j == __out_len)
1282+ break ;
1283+ __assigner (__first + __i, __result + __j) ;
13071284 ++__j;
13081285 }
13091286 }
13101287 return __i;
13111288}
13121289
1313- template <class _RandomAccessIterator1 , class _RandomAccessIterator2 , class _Bound , class _Assigner >
1290+ template <bool __Bounded, class _RandomAccessIterator1 , class _RandomAccessIterator2 , class _Bound , class _Assigner >
13141291_Bound
1315- __brick_bounded_copy_by_mask (_RandomAccessIterator1 __first, _Bound __in_len, _RandomAccessIterator2 __result,
1316- _Bound __out_len, bool * __mask, _Assigner __assigner,
1317- /* vector=*/ std::true_type) noexcept
1292+ __brick_copy_by_mask (_RandomAccessIterator1 __first, _Bound __in_len, _RandomAccessIterator2 __result, _Bound __out_len,
1293+ bool * __mask, _Assigner __assigner, /* vector=*/ std::true_type) noexcept
13181294{
1319- return __unseq_backend::__simd_copy_by_mask<true >(__first, __in_len, __result, __mask, __assigner, __out_len );
1295+ return __unseq_backend::__simd_copy_by_mask<__Bounded >(__first, __in_len, __result, __out_len, __mask, __assigner );
13201296}
13211297
13221298template <class _ForwardIterator , class _OutputIterator1 , class _OutputIterator2 >
@@ -1371,8 +1347,8 @@ __parallel_selective_copy(__parallel_tag<_IsVector>, _ExecutionPolicy&& __exec,
13711347 },
13721348 std::plus<_DifferenceType>(), // Combine
13731349 [=](_DifferenceType __i, _DifferenceType __len, _DifferenceType __initial) { // Scan
1374- __internal::__brick_copy_by_mask (
1375- __first + __i, __first + (__i + __len) , __result + __initial, __mask + __i,
1350+ __internal::__brick_copy_by_mask< /* bounded */ false > (
1351+ __first + __i, __len, __result + __initial, __len , __mask + __i,
13761352 [](_RandomAccessIterator1 __x, _RandomAccessIterator2 __z) { *__z = *__x; }, _IsVector{});
13771353 },
13781354 [&__m](_DifferenceType __total) { __m = __total; }); // Apex
@@ -1437,7 +1413,7 @@ __pattern_bounded_copy_if(__parallel_tag<_IsVector>, _ExecutionPolicy&& __exec,
14371413 [=, &__res_in](_DifferenceType __i, _DifferenceType __len, _DifferenceType __initial) { // Scan
14381414 if (__initial > __n_out) // The chunk has neither elements to write nor the stop position
14391415 return ;
1440- _DifferenceType __stop = __internal::__brick_bounded_copy_by_mask (
1416+ _DifferenceType __stop = __internal::__brick_copy_by_mask< /* bounded */ true > (
14411417 __first + __i, __len, __result + __initial, __n_out - __initial, __mask + __i,
14421418 [](_RandomAccessIterator1 __x, _RandomAccessIterator2 __z) { *__z = *__x; }, _IsVector{});
14431419 if (__stop == __len)
@@ -1597,8 +1573,8 @@ __remove_elements(__parallel_tag<_IsVector>, _ExecutionPolicy&& __exec, _RandomA
15971573 },
15981574 ::std::plus<_DifferenceType>(),
15991575 [=](_DifferenceType __i, _DifferenceType __len, _DifferenceType __initial) {
1600- __internal::__brick_copy_by_mask (
1601- __first + __i, __first + __i + __len, __result + __initial, __mask + __i,
1576+ __internal::__brick_copy_by_mask< /* bounded */ false > (
1577+ __first + __i, __len, __result + __initial, __len , __mask + __i,
16021578 [](_RandomAccessIterator __x, _Tp* __z) { ::new (std::addressof (*__z)) _Tp (std::move (*__x)); },
16031579 _IsVector{});
16041580 },
0 commit comments