1111#define _LIBCPP___BIT_REFERENCE
1212
1313#include < __algorithm/copy.h>
14+ #include < __algorithm/copy_backward.h>
1415#include < __algorithm/copy_n.h>
1516#include < __algorithm/min.h>
1617#include < __bit/countr.h>
@@ -185,10 +186,17 @@ private:
185186 __mask_(__m) {}
186187};
187188
189+ <<<<<<< HEAD
188190// copy_backward
189191
190192template <class _Cp , bool _IsConst>
191193_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)
192200 __bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) {
193201 using _In = __bit_iterator<_Cp, _IsConst>;
194202 using difference_type = typename _In::difference_type;
@@ -198,6 +206,7 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> _
198206 difference_type __n = __last - __first;
199207 if (__n > 0 ) {
200208 // do first word
209+ <<<<<<< HEAD
201210 if (__last.__ctz_ != 0 ) {
202211 difference_type __dn = std::min (static_cast <difference_type>(__last.__ctz_ ), __n);
203212 __n -= __dn;
@@ -224,13 +233,46 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> _
224233 *--__result.__seg_ &= ~__m;
225234 *__result.__seg_ |= __b;
226235 __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)
227265 }
228266 }
229267 return __result;
230268}
231269
232270template <class _Cp , bool _IsConst>
271+ <<<<<<< HEAD
233272_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)
234276 __bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false > __result) {
235277 using _In = __bit_iterator<_Cp, _IsConst>;
236278 using difference_type = typename _In::difference_type;
@@ -240,6 +282,7 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> _
240282 difference_type __n = __last - __first;
241283 if (__n > 0 ) {
242284 // do first word
285+ <<<<<<< HEAD
243286 if (__last.__ctz_ != 0 ) {
244287 difference_type __dn = std::min (static_cast <difference_type>(__last.__ctz_ ), __n);
245288 __n -= __dn;
@@ -299,18 +342,82 @@ _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> _
299342 __m = ~__storage_type (0 ) << __result.__ctz_ ;
300343 *__result.__seg_ &= ~__m;
301344 *__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)
302401 }
303402 }
304403 }
305404 return __result;
306405}
307406
308407template <class _Cp , bool _IsConst>
408+ <<<<<<< HEAD
309409inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator<_Cp, false > copy_backward (
310410 __bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false > __result) {
311411 if (__last.__ctz_ == __result.__ctz_ )
312412 return std::__copy_backward_aligned (__first, __last, __result);
313413 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)
314421}
315422
316423// move
@@ -876,9 +983,10 @@ private:
876983 template <class _Dp , bool _IC>
877984 _LIBCPP_CONSTEXPR_SINCE_CXX20 friend __bit_iterator<_Dp, false > __copy_backward_unaligned (
878985 __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 ;
882990 template <class _Cl , class _Cr >
883991 friend __bit_iterator<_Cr, false >
884992 __swap_ranges_aligned (__bit_iterator<_Cl, false >, __bit_iterator<_Cl, false >, __bit_iterator<_Cr, false >);
0 commit comments