11
11
#define _LIBCPP___BIT_REFERENCE
12
12
13
13
#include < __algorithm/copy.h>
14
+ #include < __algorithm/copy_backward.h>
14
15
#include < __algorithm/copy_n.h>
15
16
#include < __algorithm/min.h>
16
17
#include < __bit/countr.h>
@@ -185,10 +186,17 @@ private:
185
186
__mask_(__m) {}
186
187
};
187
188
189
+ <<<<<<< HEAD
188
190
// copy_backward
189
191
190
192
template <class _Cp , bool _IsConst>
191
193
_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false > __copy_backward_aligned (
194
+ =======
195
+ // copy
196
+
197
+ template <class _Cp , bool _IsConst>
198
+ _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false > __copy_aligned (
199
+ >>>>>>> 03028d1b8610 (Optimize ranges::copy_backward for vector<bool >::iterator)
192
200
__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) {
193
201
using _In = __bit_iterator<_Cp, _IsConst>;
194
202
using difference_type = typename _In::difference_type;
@@ -198,6 +206,7 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> _
198
206
difference_type __n = __last - __first;
199
207
if (__n > 0 ) {
200
208
// do first word
209
+ <<<<<<< HEAD
201
210
if (__last.__ctz_ != 0 ) {
202
211
difference_type __dn = std::min (static_cast <difference_type>(__last.__ctz_ ), __n);
203
212
__n -= __dn;
@@ -224,13 +233,46 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> _
224
233
*--__result.__seg_ &= ~__m;
225
234
*__result.__seg_ |= __b;
226
235
__result.__ctz_ = static_cast <unsigned >(-__n & (__bits_per_word - 1 ));
236
+ =======
237
+ if (__first.__ctz_ != 0 ) {
238
+ unsigned __clz = __bits_per_word - __first.__ctz_ ;
239
+ difference_type __dn = std::min (static_cast <difference_type>(__clz), __n);
240
+ __n -= __dn;
241
+ __storage_type __m = (~__storage_type (0 ) << __first.__ctz_ ) & (~__storage_type (0 ) >> (__clz - __dn));
242
+ __storage_type __b = *__first.__seg_ & __m;
243
+ *__result.__seg_ &= ~__m;
244
+ *__result.__seg_ |= __b;
245
+ __result.__seg_ += (__dn + __result.__ctz_ ) / __bits_per_word;
246
+ __result.__ctz_ = static_cast <unsigned >((__dn + __result.__ctz_ ) % __bits_per_word);
247
+ ++__first.__seg_ ;
248
+ // __first.__ctz_ = 0;
249
+ }
250
+ // __first.__ctz_ == 0;
251
+ // do middle words
252
+ __storage_type __nw = __n / __bits_per_word;
253
+ std::copy_n (std::__to_address (__first.__seg_ ), __nw, std::__to_address (__result.__seg_ ));
254
+ __n -= __nw * __bits_per_word;
255
+ __result.__seg_ += __nw;
256
+ // do last word
257
+ if (__n > 0 ) {
258
+ __first.__seg_ += __nw;
259
+ __storage_type __m = ~__storage_type (0 ) >> (__bits_per_word - __n);
260
+ __storage_type __b = *__first.__seg_ & __m;
261
+ *__result.__seg_ &= ~__m;
262
+ *__result.__seg_ |= __b;
263
+ __result.__ctz_ = static_cast <unsigned >(__n);
264
+ >>>>>>> 03028d1b8610 (Optimize ranges::copy_backward for vector<bool >::iterator)
227
265
}
228
266
}
229
267
return __result;
230
268
}
231
269
232
270
template <class _Cp , bool _IsConst>
271
+ <<<<<<< HEAD
233
272
_LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false > __copy_backward_unaligned (
273
+ =======
274
+ _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false > __copy_unaligned (
275
+ >>>>>>> 03028d1b8610 (Optimize ranges::copy_backward for vector<bool >::iterator)
234
276
__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false > __result) {
235
277
using _In = __bit_iterator<_Cp, _IsConst>;
236
278
using difference_type = typename _In::difference_type;
@@ -240,6 +282,7 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> _
240
282
difference_type __n = __last - __first;
241
283
if (__n > 0 ) {
242
284
// do first word
285
+ <<<<<<< HEAD
243
286
if (__last.__ctz_ != 0 ) {
244
287
difference_type __dn = std::min (static_cast <difference_type>(__last.__ctz_ ), __n);
245
288
__n -= __dn;
@@ -299,18 +342,82 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> _
299
342
__m = ~__storage_type (0 ) << __result.__ctz_ ;
300
343
*__result.__seg_ &= ~__m;
301
344
*__result.__seg_ |= __b << (__result.__ctz_ - (__bits_per_word - __n - __dn));
345
+ =======
346
+ if (__first.__ctz_ != 0 ) {
347
+ unsigned __clz_f = __bits_per_word - __first.__ctz_ ;
348
+ difference_type __dn = std::min (static_cast <difference_type>(__clz_f), __n);
349
+ __n -= __dn;
350
+ __storage_type __m = (~__storage_type (0 ) << __first.__ctz_ ) & (~__storage_type (0 ) >> (__clz_f - __dn));
351
+ __storage_type __b = *__first.__seg_ & __m;
352
+ unsigned __clz_r = __bits_per_word - __result.__ctz_ ;
353
+ __storage_type __ddn = std::min<__storage_type>(__dn, __clz_r);
354
+ __m = (~__storage_type (0 ) << __result.__ctz_ ) & (~__storage_type (0 ) >> (__clz_r - __ddn));
355
+ *__result.__seg_ &= ~__m;
356
+ if (__result.__ctz_ > __first.__ctz_ )
357
+ *__result.__seg_ |= __b << (__result.__ctz_ - __first.__ctz_ );
358
+ else
359
+ *__result.__seg_ |= __b >> (__first.__ctz_ - __result.__ctz_ );
360
+ __result.__seg_ += (__ddn + __result.__ctz_ ) / __bits_per_word;
361
+ __result.__ctz_ = static_cast <unsigned >((__ddn + __result.__ctz_ ) % __bits_per_word);
362
+ __dn -= __ddn;
363
+ if (__dn > 0 ) {
364
+ __m = ~__storage_type (0 ) >> (__bits_per_word - __dn);
365
+ *__result.__seg_ &= ~__m;
366
+ *__result.__seg_ |= __b >> (__first.__ctz_ + __ddn);
367
+ __result.__ctz_ = static_cast <unsigned >(__dn);
368
+ }
369
+ ++__first.__seg_ ;
370
+ // __first.__ctz_ = 0;
371
+ }
372
+ // __first.__ctz_ == 0;
373
+ // do middle words
374
+ unsigned __clz_r = __bits_per_word - __result.__ctz_ ;
375
+ __storage_type __m = ~__storage_type (0 ) << __result.__ctz_ ;
376
+ for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_ ) {
377
+ __storage_type __b = *__first.__seg_ ;
378
+ *__result.__seg_ &= ~__m;
379
+ *__result.__seg_ |= __b << __result.__ctz_ ;
380
+ ++__result.__seg_ ;
381
+ *__result.__seg_ &= __m;
382
+ *__result.__seg_ |= __b >> __clz_r;
383
+ }
384
+ // do last word
385
+ if (__n > 0 ) {
386
+ __m = ~__storage_type (0 ) >> (__bits_per_word - __n);
387
+ __storage_type __b = *__first.__seg_ & __m;
388
+ __storage_type __dn = std::min (__n, static_cast <difference_type>(__clz_r));
389
+ __m = (~__storage_type (0 ) << __result.__ctz_ ) & (~__storage_type (0 ) >> (__clz_r - __dn));
390
+ *__result.__seg_ &= ~__m;
391
+ *__result.__seg_ |= __b << __result.__ctz_ ;
392
+ __result.__seg_ += (__dn + __result.__ctz_ ) / __bits_per_word;
393
+ __result.__ctz_ = static_cast <unsigned >((__dn + __result.__ctz_ ) % __bits_per_word);
394
+ __n -= __dn;
395
+ if (__n > 0 ) {
396
+ __m = ~__storage_type (0 ) >> (__bits_per_word - __n);
397
+ *__result.__seg_ &= ~__m;
398
+ *__result.__seg_ |= __b >> __dn;
399
+ __result.__ctz_ = static_cast <unsigned >(__n);
400
+ >>>>>>> 03028d1b8610 (Optimize ranges::copy_backward for vector<bool >::iterator)
302
401
}
303
402
}
304
403
}
305
404
return __result;
306
405
}
307
406
308
407
template <class _Cp , bool _IsConst>
408
+ <<<<<<< HEAD
309
409
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator<_Cp, false > copy_backward (
310
410
__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false > __result) {
311
411
if (__last.__ctz_ == __result.__ctz_ )
312
412
return std::__copy_backward_aligned (__first, __last, __result);
313
413
return std::__copy_backward_unaligned (__first, __last, __result);
414
+ =======
415
+ inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator<_Cp, false >
416
+ copy (__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false > __result) {
417
+ if (__first.__ctz_ == __result.__ctz_ )
418
+ return std::__copy_aligned (__first, __last, __result);
419
+ return std::__copy_unaligned (__first, __last, __result);
420
+ >>>>>>> 03028d1b8610 (Optimize ranges::copy_backward for vector<bool >::iterator)
314
421
}
315
422
316
423
// move
@@ -876,9 +983,10 @@ private:
876
983
template <class _Dp , bool _IC>
877
984
_LIBCPP_CONSTEXPR_SINCE_CXX20 friend __bit_iterator<_Dp, false > __copy_backward_unaligned (
878
985
__bit_iterator<_Dp, _IC> __first, __bit_iterator<_Dp, _IC> __last, __bit_iterator<_Dp, false > __result);
879
- template <class _Dp , bool _IC>
880
- _LIBCPP_CONSTEXPR_SINCE_CXX20 friend __bit_iterator<_Dp, false >
881
- copy_backward (__bit_iterator<_Dp, _IC> __first, __bit_iterator<_Dp, _IC> __last, __bit_iterator<_Dp, false > __result);
986
+ // Note: dependent nested name specifier __copy_backward_impl<_AlgPolicy>::operator() for friend declaration
987
+ // is not supported in clang. Thus, we use a friend declaration for the entire class.
988
+ template <class _AlgPolicy >
989
+ friend struct __copy_backward_impl ;
882
990
template <class _Cl , class _Cr >
883
991
friend __bit_iterator<_Cr, false >
884
992
__swap_ranges_aligned (__bit_iterator<_Cl, false >, __bit_iterator<_Cl, false >, __bit_iterator<_Cr, false >);
0 commit comments