|
11 | 11 |
|
12 | 12 | #include <__algorithm/copy_backward.h> |
13 | 13 | #include <__algorithm/copy_move_common.h> |
| 14 | +#include <__algorithm/for_each_segment.h> |
14 | 15 | #include <__algorithm/iterator_operations.h> |
15 | 16 | #include <__algorithm/min.h> |
16 | 17 | #include <__config> |
@@ -54,27 +55,10 @@ struct __move_backward_impl { |
54 | 55 | template <class _InIter, class _OutIter, __enable_if_t<__is_segmented_iterator_v<_InIter>, int> = 0> |
55 | 56 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter> |
56 | 57 | operator()(_InIter __first, _InIter __last, _OutIter __result) const { |
57 | | - using _Traits = __segmented_iterator_traits<_InIter>; |
58 | | - auto __sfirst = _Traits::__segment(__first); |
59 | | - auto __slast = _Traits::__segment(__last); |
60 | | - if (__sfirst == __slast) { |
61 | | - auto __iters = |
62 | | - std::__move_backward<_AlgPolicy>(_Traits::__local(__first), _Traits::__local(__last), std::move(__result)); |
63 | | - return std::make_pair(__last, __iters.second); |
64 | | - } |
65 | | - |
66 | | - __result = |
67 | | - std::__move_backward<_AlgPolicy>(_Traits::__begin(__slast), _Traits::__local(__last), std::move(__result)) |
68 | | - .second; |
69 | | - --__slast; |
70 | | - while (__sfirst != __slast) { |
71 | | - __result = |
72 | | - std::__move_backward<_AlgPolicy>(_Traits::__begin(__slast), _Traits::__end(__slast), std::move(__result)) |
73 | | - .second; |
74 | | - --__slast; |
75 | | - } |
76 | | - __result = std::__move_backward<_AlgPolicy>(_Traits::__local(__first), _Traits::__end(__slast), std::move(__result)) |
77 | | - .second; |
| 58 | + using __local_iterator = typename __segmented_iterator_traits<_InIter>::__local_iterator; |
| 59 | + std::__for_each_segment_backward(__first, __last, [&__result](__local_iterator __lfirst, __local_iterator __llast) { |
| 60 | + __result = std::__move_backward<_AlgPolicy>(std::move(__lfirst), std::move(__llast), std::move(__result)); |
| 61 | + }); |
78 | 62 | return std::make_pair(__last, std::move(__result)); |
79 | 63 | } |
80 | 64 |
|
|
0 commit comments