@@ -186,240 +186,6 @@ private:
186186 __mask_(__m) {}
187187};
188188
189- <<<<<<< HEAD
190- // copy_backward
191-
192- template <class _Cp , bool _IsConst>
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)
200- __bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result) {
201- using _In = __bit_iterator<_Cp, _IsConst>;
202- using difference_type = typename _In::difference_type;
203- using __storage_type = typename _In::__storage_type;
204-
205- const int __bits_per_word = _In::__bits_per_word;
206- difference_type __n = __last - __first;
207- if (__n > 0 ) {
208- // do first word
209- <<<<<<< HEAD
210- if (__last.__ctz_ != 0 ) {
211- difference_type __dn = std::min (static_cast <difference_type>(__last.__ctz_ ), __n);
212- __n -= __dn;
213- unsigned __clz = __bits_per_word - __last.__ctz_ ;
214- __storage_type __m = (~__storage_type (0 ) << (__last.__ctz_ - __dn)) & (~__storage_type (0 ) >> __clz);
215- __storage_type __b = *__last.__seg_ & __m;
216- *__result.__seg_ &= ~__m;
217- *__result.__seg_ |= __b;
218- __result.__ctz_ = static_cast <unsigned >(((-__dn & (__bits_per_word - 1 )) + __result.__ctz_ ) % __bits_per_word);
219- // __last.__ctz_ = 0
220- }
221- // __last.__ctz_ == 0 || __n == 0
222- // __result.__ctz_ == 0 || __n == 0
223- // do middle words
224- __storage_type __nw = __n / __bits_per_word;
225- __result.__seg_ -= __nw;
226- __last.__seg_ -= __nw;
227- std::copy_n (std::__to_address (__last.__seg_ ), __nw, std::__to_address (__result.__seg_ ));
228- __n -= __nw * __bits_per_word;
229- // do last word
230- if (__n > 0 ) {
231- __storage_type __m = ~__storage_type (0 ) << (__bits_per_word - __n);
232- __storage_type __b = *--__last.__seg_ & __m;
233- *--__result.__seg_ &= ~__m;
234- *__result.__seg_ |= __b;
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)
265- }
266- }
267- return __result;
268- }
269-
270- template <class _Cp , bool _IsConst>
271- <<<<<<< HEAD
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)
276- __bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false > __result) {
277- using _In = __bit_iterator<_Cp, _IsConst>;
278- using difference_type = typename _In::difference_type;
279- using __storage_type = typename _In::__storage_type;
280-
281- const int __bits_per_word = _In::__bits_per_word;
282- difference_type __n = __last - __first;
283- if (__n > 0 ) {
284- // do first word
285- <<<<<<< HEAD
286- if (__last.__ctz_ != 0 ) {
287- difference_type __dn = std::min (static_cast <difference_type>(__last.__ctz_ ), __n);
288- __n -= __dn;
289- unsigned __clz_l = __bits_per_word - __last.__ctz_ ;
290- __storage_type __m = (~__storage_type (0 ) << (__last.__ctz_ - __dn)) & (~__storage_type (0 ) >> __clz_l);
291- __storage_type __b = *__last.__seg_ & __m;
292- unsigned __clz_r = __bits_per_word - __result.__ctz_ ;
293- __storage_type __ddn = std::min (__dn, static_cast <difference_type>(__result.__ctz_ ));
294- if (__ddn > 0 ) {
295- __m = (~__storage_type (0 ) << (__result.__ctz_ - __ddn)) & (~__storage_type (0 ) >> __clz_r);
296- *__result.__seg_ &= ~__m;
297- if (__result.__ctz_ > __last.__ctz_ )
298- *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_ );
299- else
300- *__result.__seg_ |= __b >> (__last.__ctz_ - __result.__ctz_ );
301- __result.__ctz_ = static_cast <unsigned >(((-__ddn & (__bits_per_word - 1 )) + __result.__ctz_ ) % __bits_per_word);
302- __dn -= __ddn;
303- }
304- if (__dn > 0 ) {
305- // __result.__ctz_ == 0
306- --__result.__seg_ ;
307- __result.__ctz_ = static_cast <unsigned >(-__dn & (__bits_per_word - 1 ));
308- __m = ~__storage_type (0 ) << __result.__ctz_ ;
309- *__result.__seg_ &= ~__m;
310- __last.__ctz_ -= __dn + __ddn;
311- *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_ );
312- }
313- // __last.__ctz_ = 0
314- }
315- // __last.__ctz_ == 0 || __n == 0
316- // __result.__ctz_ != 0 || __n == 0
317- // do middle words
318- unsigned __clz_r = __bits_per_word - __result.__ctz_ ;
319- __storage_type __m = ~__storage_type (0 ) >> __clz_r;
320- for (; __n >= __bits_per_word; __n -= __bits_per_word) {
321- __storage_type __b = *--__last.__seg_ ;
322- *__result.__seg_ &= ~__m;
323- *__result.__seg_ |= __b >> __clz_r;
324- *--__result.__seg_ &= __m;
325- *__result.__seg_ |= __b << __result.__ctz_ ;
326- }
327- // do last word
328- if (__n > 0 ) {
329- __m = ~__storage_type (0 ) << (__bits_per_word - __n);
330- __storage_type __b = *--__last.__seg_ & __m;
331- __clz_r = __bits_per_word - __result.__ctz_ ;
332- __storage_type __dn = std::min (__n, static_cast <difference_type>(__result.__ctz_ ));
333- __m = (~__storage_type (0 ) << (__result.__ctz_ - __dn)) & (~__storage_type (0 ) >> __clz_r);
334- *__result.__seg_ &= ~__m;
335- *__result.__seg_ |= __b >> (__bits_per_word - __result.__ctz_ );
336- __result.__ctz_ = static_cast <unsigned >(((-__dn & (__bits_per_word - 1 )) + __result.__ctz_ ) % __bits_per_word);
337- __n -= __dn;
338- if (__n > 0 ) {
339- // __result.__ctz_ == 0
340- --__result.__seg_ ;
341- __result.__ctz_ = static_cast <unsigned >(-__n & (__bits_per_word - 1 ));
342- __m = ~__storage_type (0 ) << __result.__ctz_ ;
343- *__result.__seg_ &= ~__m;
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)
401- }
402- }
403- }
404- return __result;
405- }
406-
407- template <class _Cp , bool _IsConst>
408- <<<<<<< HEAD
409- inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 __bit_iterator<_Cp, false > copy_backward (
410- __bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false > __result) {
411- if (__last.__ctz_ == __result.__ctz_ )
412- return std::__copy_backward_aligned (__first, __last, __result);
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)
421- }
422-
423189// move
424190
425191template <class _Cp , bool _IsConst>
@@ -983,8 +749,6 @@ private:
983749 template <class _Dp , bool _IC>
984750 _LIBCPP_CONSTEXPR_SINCE_CXX20 friend __bit_iterator<_Dp, false > __copy_backward_unaligned (
985751 __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.
988752 template <class _AlgPolicy >
989753 friend struct __copy_backward_impl ;
990754 template <class _Cl , class _Cr >
0 commit comments