@@ -186,240 +186,6 @@ private:
186
186
__mask_(__m) {}
187
187
};
188
188
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
-
423
189
// move
424
190
425
191
template <class _Cp , bool _IsConst>
@@ -983,8 +749,6 @@ private:
983
749
template <class _Dp , bool _IC>
984
750
_LIBCPP_CONSTEXPR_SINCE_CXX20 friend __bit_iterator<_Dp, false > __copy_backward_unaligned (
985
751
__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
752
template <class _AlgPolicy >
989
753
friend struct __copy_backward_impl ;
990
754
template <class _Cl , class _Cr >
0 commit comments