|
14 | 14 | #include <__algorithm/copy_backward.h>
|
15 | 15 | #include <__algorithm/copy_n.h>
|
16 | 16 | #include <__algorithm/min.h>
|
| 17 | +#include <__algorithm/swap_ranges.h> |
17 | 18 | #include <__bit/countr.h>
|
18 | 19 | #include <__compare/ordering.h>
|
19 | 20 | #include <__config>
|
@@ -202,152 +203,6 @@ inline _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cp, false> move_backward(
|
202 | 203 | return std::copy_backward(__first, __last, __result);
|
203 | 204 | }
|
204 | 205 |
|
205 |
| -// swap_ranges |
206 |
| - |
207 |
| -template <class _Cl, class _Cr> |
208 |
| -_LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cr, false> __swap_ranges_aligned( |
209 |
| - __bit_iterator<_Cl, false> __first, __bit_iterator<_Cl, false> __last, __bit_iterator<_Cr, false> __result) { |
210 |
| - using _I1 = __bit_iterator<_Cl, false>; |
211 |
| - using difference_type = typename _I1::difference_type; |
212 |
| - using __storage_type = typename _I1::__storage_type; |
213 |
| - |
214 |
| - const int __bits_per_word = _I1::__bits_per_word; |
215 |
| - difference_type __n = __last - __first; |
216 |
| - if (__n > 0) { |
217 |
| - // do first word |
218 |
| - if (__first.__ctz_ != 0) { |
219 |
| - unsigned __clz = __bits_per_word - __first.__ctz_; |
220 |
| - difference_type __dn = std::min(static_cast<difference_type>(__clz), __n); |
221 |
| - __n -= __dn; |
222 |
| - __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn)); |
223 |
| - __storage_type __b1 = *__first.__seg_ & __m; |
224 |
| - *__first.__seg_ &= ~__m; |
225 |
| - __storage_type __b2 = *__result.__seg_ & __m; |
226 |
| - *__result.__seg_ &= ~__m; |
227 |
| - *__result.__seg_ |= __b1; |
228 |
| - *__first.__seg_ |= __b2; |
229 |
| - __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word; |
230 |
| - __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word); |
231 |
| - ++__first.__seg_; |
232 |
| - // __first.__ctz_ = 0; |
233 |
| - } |
234 |
| - // __first.__ctz_ == 0; |
235 |
| - // do middle words |
236 |
| - for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_, ++__result.__seg_) |
237 |
| - swap(*__first.__seg_, *__result.__seg_); |
238 |
| - // do last word |
239 |
| - if (__n > 0) { |
240 |
| - __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); |
241 |
| - __storage_type __b1 = *__first.__seg_ & __m; |
242 |
| - *__first.__seg_ &= ~__m; |
243 |
| - __storage_type __b2 = *__result.__seg_ & __m; |
244 |
| - *__result.__seg_ &= ~__m; |
245 |
| - *__result.__seg_ |= __b1; |
246 |
| - *__first.__seg_ |= __b2; |
247 |
| - __result.__ctz_ = static_cast<unsigned>(__n); |
248 |
| - } |
249 |
| - } |
250 |
| - return __result; |
251 |
| -} |
252 |
| - |
253 |
| -template <class _Cl, class _Cr> |
254 |
| -_LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cr, false> __swap_ranges_unaligned( |
255 |
| - __bit_iterator<_Cl, false> __first, __bit_iterator<_Cl, false> __last, __bit_iterator<_Cr, false> __result) { |
256 |
| - using _I1 = __bit_iterator<_Cl, false>; |
257 |
| - using difference_type = typename _I1::difference_type; |
258 |
| - using __storage_type = typename _I1::__storage_type; |
259 |
| - |
260 |
| - const int __bits_per_word = _I1::__bits_per_word; |
261 |
| - difference_type __n = __last - __first; |
262 |
| - if (__n > 0) { |
263 |
| - // do first word |
264 |
| - if (__first.__ctz_ != 0) { |
265 |
| - unsigned __clz_f = __bits_per_word - __first.__ctz_; |
266 |
| - difference_type __dn = std::min(static_cast<difference_type>(__clz_f), __n); |
267 |
| - __n -= __dn; |
268 |
| - __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn)); |
269 |
| - __storage_type __b1 = *__first.__seg_ & __m; |
270 |
| - *__first.__seg_ &= ~__m; |
271 |
| - unsigned __clz_r = __bits_per_word - __result.__ctz_; |
272 |
| - __storage_type __ddn = std::min<__storage_type>(__dn, __clz_r); |
273 |
| - __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn)); |
274 |
| - __storage_type __b2 = *__result.__seg_ & __m; |
275 |
| - *__result.__seg_ &= ~__m; |
276 |
| - if (__result.__ctz_ > __first.__ctz_) { |
277 |
| - unsigned __s = __result.__ctz_ - __first.__ctz_; |
278 |
| - *__result.__seg_ |= __b1 << __s; |
279 |
| - *__first.__seg_ |= __b2 >> __s; |
280 |
| - } else { |
281 |
| - unsigned __s = __first.__ctz_ - __result.__ctz_; |
282 |
| - *__result.__seg_ |= __b1 >> __s; |
283 |
| - *__first.__seg_ |= __b2 << __s; |
284 |
| - } |
285 |
| - __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word; |
286 |
| - __result.__ctz_ = static_cast<unsigned>((__ddn + __result.__ctz_) % __bits_per_word); |
287 |
| - __dn -= __ddn; |
288 |
| - if (__dn > 0) { |
289 |
| - __m = ~__storage_type(0) >> (__bits_per_word - __dn); |
290 |
| - __b2 = *__result.__seg_ & __m; |
291 |
| - *__result.__seg_ &= ~__m; |
292 |
| - unsigned __s = __first.__ctz_ + __ddn; |
293 |
| - *__result.__seg_ |= __b1 >> __s; |
294 |
| - *__first.__seg_ |= __b2 << __s; |
295 |
| - __result.__ctz_ = static_cast<unsigned>(__dn); |
296 |
| - } |
297 |
| - ++__first.__seg_; |
298 |
| - // __first.__ctz_ = 0; |
299 |
| - } |
300 |
| - // __first.__ctz_ == 0; |
301 |
| - // do middle words |
302 |
| - __storage_type __m = ~__storage_type(0) << __result.__ctz_; |
303 |
| - unsigned __clz_r = __bits_per_word - __result.__ctz_; |
304 |
| - for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_) { |
305 |
| - __storage_type __b1 = *__first.__seg_; |
306 |
| - __storage_type __b2 = *__result.__seg_ & __m; |
307 |
| - *__result.__seg_ &= ~__m; |
308 |
| - *__result.__seg_ |= __b1 << __result.__ctz_; |
309 |
| - *__first.__seg_ = __b2 >> __result.__ctz_; |
310 |
| - ++__result.__seg_; |
311 |
| - __b2 = *__result.__seg_ & ~__m; |
312 |
| - *__result.__seg_ &= __m; |
313 |
| - *__result.__seg_ |= __b1 >> __clz_r; |
314 |
| - *__first.__seg_ |= __b2 << __clz_r; |
315 |
| - } |
316 |
| - // do last word |
317 |
| - if (__n > 0) { |
318 |
| - __m = ~__storage_type(0) >> (__bits_per_word - __n); |
319 |
| - __storage_type __b1 = *__first.__seg_ & __m; |
320 |
| - *__first.__seg_ &= ~__m; |
321 |
| - __storage_type __dn = std::min<__storage_type>(__n, __clz_r); |
322 |
| - __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn)); |
323 |
| - __storage_type __b2 = *__result.__seg_ & __m; |
324 |
| - *__result.__seg_ &= ~__m; |
325 |
| - *__result.__seg_ |= __b1 << __result.__ctz_; |
326 |
| - *__first.__seg_ |= __b2 >> __result.__ctz_; |
327 |
| - __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word; |
328 |
| - __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word); |
329 |
| - __n -= __dn; |
330 |
| - if (__n > 0) { |
331 |
| - __m = ~__storage_type(0) >> (__bits_per_word - __n); |
332 |
| - __b2 = *__result.__seg_ & __m; |
333 |
| - *__result.__seg_ &= ~__m; |
334 |
| - *__result.__seg_ |= __b1 >> __dn; |
335 |
| - *__first.__seg_ |= __b2 << __dn; |
336 |
| - __result.__ctz_ = static_cast<unsigned>(__n); |
337 |
| - } |
338 |
| - } |
339 |
| - } |
340 |
| - return __result; |
341 |
| -} |
342 |
| - |
343 |
| -template <class _Cl, class _Cr> |
344 |
| -inline _LIBCPP_HIDE_FROM_ABI __bit_iterator<_Cr, false> swap_ranges( |
345 |
| - __bit_iterator<_Cl, false> __first1, __bit_iterator<_Cl, false> __last1, __bit_iterator<_Cr, false> __first2) { |
346 |
| - if (__first1.__ctz_ == __first2.__ctz_) |
347 |
| - return std::__swap_ranges_aligned(__first1, __last1, __first2); |
348 |
| - return std::__swap_ranges_unaligned(__first1, __last1, __first2); |
349 |
| -} |
350 |
| - |
351 | 206 | // rotate
|
352 | 207 |
|
353 | 208 | template <class _Cp>
|
@@ -752,14 +607,14 @@ private:
|
752 | 607 | template <class _AlgPolicy>
|
753 | 608 | friend struct __copy_backward_impl;
|
754 | 609 | template <class _Cl, class _Cr>
|
755 |
| - friend __bit_iterator<_Cr, false> |
| 610 | + _LIBCPP_CONSTEXPR_SINCE_CXX20 friend __bit_iterator<_Cr, false> |
756 | 611 | __swap_ranges_aligned(__bit_iterator<_Cl, false>, __bit_iterator<_Cl, false>, __bit_iterator<_Cr, false>);
|
757 | 612 | template <class _Cl, class _Cr>
|
758 |
| - friend __bit_iterator<_Cr, false> |
| 613 | + _LIBCPP_CONSTEXPR_SINCE_CXX20 friend __bit_iterator<_Cr, false> |
759 | 614 | __swap_ranges_unaligned(__bit_iterator<_Cl, false>, __bit_iterator<_Cl, false>, __bit_iterator<_Cr, false>);
|
760 |
| - template <class _Cl, class _Cr> |
761 |
| - friend __bit_iterator<_Cr, false> |
762 |
| - swap_ranges(__bit_iterator<_Cl, false>, __bit_iterator<_Cl, false>, __bit_iterator<_Cr, false>); |
| 615 | + template <class, class _Cl, class _Cr> |
| 616 | + _LIBCPP_CONSTEXPR_SINCE_CXX20 friend pair<__bit_iterator<_Cl, false>, __bit_iterator<_Cr, false> > |
| 617 | + __swap_ranges(__bit_iterator<_Cl, false>, __bit_iterator<_Cl, false>, __bit_iterator<_Cr, false>); |
763 | 618 | template <class _Dp>
|
764 | 619 | _LIBCPP_CONSTEXPR_SINCE_CXX20 friend __bit_iterator<_Dp, false>
|
765 | 620 | rotate(__bit_iterator<_Dp, false>, __bit_iterator<_Dp, false>, __bit_iterator<_Dp, false>);
|
|
0 commit comments