9
9
#ifndef _LIBCPP___ALGORITHM_MOVE_H
10
10
#define _LIBCPP___ALGORITHM_MOVE_H
11
11
12
+ #include < __algorithm/iterator_operations.h>
12
13
#include < __algorithm/unwrap_iter.h>
13
14
#include < __config>
14
15
#include < __iterator/iterator_traits.h>
@@ -26,18 +27,19 @@ _LIBCPP_BEGIN_NAMESPACE_STD
26
27
27
28
// move
28
29
29
- template <class _InIter , class _Sent , class _OutIter >
30
+ template <class _AlgPolicy , class _InIter , class _Sent , class _OutIter >
30
31
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
31
32
pair<_InIter, _OutIter> __move_impl (_InIter __first, _Sent __last, _OutIter __result) {
32
33
while (__first != __last) {
33
- *__result = std::move (* __first);
34
+ *__result = _IterOps<_AlgPolicy>:: __iter_move ( __first);
34
35
++__first;
35
36
++__result;
36
37
}
37
38
return std::make_pair (std::move (__first), std::move (__result));
38
39
}
39
40
40
- template <class _InType ,
41
+ template <class _AlgPolicy ,
42
+ class _InType ,
41
43
class _OutType ,
42
44
class = __enable_if_t <is_same<typename remove_const<_InType>::type, _OutType>::value
43
45
&& is_trivially_move_assignable<_OutType>::value> >
@@ -49,7 +51,7 @@ pair<_InType*, _OutType*> __move_impl(_InType* __first, _InType* __last, _OutTyp
49
51
&& !is_trivially_copyable<_InType>::value
50
52
#endif
51
53
)
52
- return std::__move_impl<_InType*, _InType*, _OutType*>(__first, __last, __result);
54
+ return std::__move_impl<_AlgPolicy, _InType*, _InType*, _OutType*>(__first, __last, __result);
53
55
const size_t __n = static_cast <size_t >(__last - __first);
54
56
::__builtin_memmove (__result, __first, __n * sizeof (_OutType));
55
57
return std::make_pair (__first + __n, __result + __n);
@@ -65,7 +67,8 @@ template <class _Iter>
65
67
struct __is_trivially_move_assignable_unwrapped
66
68
: __is_trivially_move_assignable_unwrapped_impl<decltype(std::__unwrap_iter<_Iter>(std::declval<_Iter>()))> {};
67
69
68
- template <class _InIter ,
70
+ template <class _AlgPolicy ,
71
+ class _InIter ,
69
72
class _OutIter ,
70
73
__enable_if_t <is_same<typename remove_const<typename iterator_traits<_InIter>::value_type>::type,
71
74
typename iterator_traits<_OutIter>::value_type>::value
@@ -81,33 +84,34 @@ __move_impl(reverse_iterator<_InIter> __first,
81
84
auto __last_base = std::__unwrap_iter (__last.base ());
82
85
auto __result_base = std::__unwrap_iter (__result.base ());
83
86
auto __result_first = __result_base - (__first_base - __last_base);
84
- std::__move_impl (__last_base, __first_base, __result_first);
87
+ std::__move_impl<_AlgPolicy> (__last_base, __first_base, __result_first);
85
88
return std::make_pair (__last, reverse_iterator<_OutIter>(std::__rewrap_iter (__result.base (), __result_first)));
86
89
}
87
90
88
- template <class _InIter , class _Sent , class _OutIter >
91
+ template <class _AlgPolicy , class _InIter , class _Sent , class _OutIter >
89
92
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11
90
93
__enable_if_t <is_copy_constructible<_InIter>::value
91
94
&& is_copy_constructible<_Sent>::value
92
95
&& is_copy_constructible<_OutIter>::value, pair<_InIter, _OutIter> >
93
96
__move (_InIter __first, _Sent __last, _OutIter __result) {
94
- auto __ret = std::__move_impl (std::__unwrap_iter (__first), std::__unwrap_iter (__last), std::__unwrap_iter (__result));
97
+ auto __ret = std::__move_impl<_AlgPolicy>(
98
+ std::__unwrap_iter (__first), std::__unwrap_iter (__last), std::__unwrap_iter (__result));
95
99
return std::make_pair (std::__rewrap_iter (__first, __ret.first ), std::__rewrap_iter (__result, __ret.second ));
96
100
}
97
101
98
- template <class _InIter , class _Sent , class _OutIter >
102
+ template <class _AlgPolicy , class _InIter , class _Sent , class _OutIter >
99
103
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11
100
104
__enable_if_t <!is_copy_constructible<_InIter>::value
101
105
|| !is_copy_constructible<_Sent>::value
102
106
|| !is_copy_constructible<_OutIter>::value, pair<_InIter, _OutIter> >
103
107
__move (_InIter __first, _Sent __last, _OutIter __result) {
104
- return std::__move_impl (std::move (__first), std::move (__last), std::move (__result));
108
+ return std::__move_impl<_AlgPolicy> (std::move (__first), std::move (__last), std::move (__result));
105
109
}
106
110
107
111
template <class _InputIterator , class _OutputIterator >
108
112
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17
109
113
_OutputIterator move (_InputIterator __first, _InputIterator __last, _OutputIterator __result) {
110
- return std::__move (__first, __last, __result).second ;
114
+ return std::__move<_ClassicAlgPolicy> (__first, __last, __result).second ;
111
115
}
112
116
113
117
_LIBCPP_END_NAMESPACE_STD
0 commit comments