Mercurial > hg > CbC > CbC_llvm
comparison libcxx/include/__algorithm/move.h @ 221:79ff65ed7e25
LLVM12 Original
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 15 Jun 2021 19:15:29 +0900 |
parents | |
children | 5f17cb93ff66 |
comparison
equal
deleted
inserted
replaced
220:42394fc6a535 | 221:79ff65ed7e25 |
---|---|
1 //===----------------------------------------------------------------------===// | |
2 // | |
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
4 // See https://llvm.org/LICENSE.txt for license information. | |
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
6 // | |
7 //===----------------------------------------------------------------------===// | |
8 | |
9 #ifndef _LIBCPP___ALGORITHM_MOVE_H | |
10 #define _LIBCPP___ALGORITHM_MOVE_H | |
11 | |
12 #include <__config> | |
13 #include <__algorithm/unwrap_iter.h> | |
14 #include <cstring> | |
15 #include <type_traits> | |
16 | |
17 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) | |
18 #pragma GCC system_header | |
19 #endif | |
20 | |
21 _LIBCPP_PUSH_MACROS | |
22 #include <__undef_macros> | |
23 | |
24 _LIBCPP_BEGIN_NAMESPACE_STD | |
25 | |
26 // move | |
27 | |
28 template <class _InputIterator, class _OutputIterator> | |
29 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 | |
30 _OutputIterator | |
31 __move_constexpr(_InputIterator __first, _InputIterator __last, _OutputIterator __result) | |
32 { | |
33 for (; __first != __last; ++__first, (void) ++__result) | |
34 *__result = _VSTD::move(*__first); | |
35 return __result; | |
36 } | |
37 | |
38 template <class _InputIterator, class _OutputIterator> | |
39 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 | |
40 _OutputIterator | |
41 __move(_InputIterator __first, _InputIterator __last, _OutputIterator __result) | |
42 { | |
43 return _VSTD::__move_constexpr(__first, __last, __result); | |
44 } | |
45 | |
46 template <class _Tp, class _Up> | |
47 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 | |
48 typename enable_if | |
49 < | |
50 is_same<typename remove_const<_Tp>::type, _Up>::value && | |
51 is_trivially_move_assignable<_Up>::value, | |
52 _Up* | |
53 >::type | |
54 __move(_Tp* __first, _Tp* __last, _Up* __result) | |
55 { | |
56 const size_t __n = static_cast<size_t>(__last - __first); | |
57 if (__n > 0) | |
58 _VSTD::memmove(__result, __first, __n * sizeof(_Up)); | |
59 return __result + __n; | |
60 } | |
61 | |
62 template <class _InputIterator, class _OutputIterator> | |
63 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 | |
64 _OutputIterator | |
65 move(_InputIterator __first, _InputIterator __last, _OutputIterator __result) | |
66 { | |
67 if (__libcpp_is_constant_evaluated()) { | |
68 return _VSTD::__move_constexpr(__first, __last, __result); | |
69 } else { | |
70 return _VSTD::__rewrap_iter(__result, | |
71 _VSTD::__move(_VSTD::__unwrap_iter(__first), | |
72 _VSTD::__unwrap_iter(__last), | |
73 _VSTD::__unwrap_iter(__result))); | |
74 } | |
75 } | |
76 | |
77 // move_backward | |
78 | |
79 template <class _InputIterator, class _OutputIterator> | |
80 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 | |
81 _OutputIterator | |
82 __move_backward_constexpr(_InputIterator __first, _InputIterator __last, _OutputIterator __result) | |
83 { | |
84 while (__first != __last) | |
85 *--__result = _VSTD::move(*--__last); | |
86 return __result; | |
87 } | |
88 | |
89 template <class _InputIterator, class _OutputIterator> | |
90 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 | |
91 _OutputIterator | |
92 __move_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result) | |
93 { | |
94 return _VSTD::__move_backward_constexpr(__first, __last, __result); | |
95 } | |
96 | |
97 template <class _Tp, class _Up> | |
98 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 | |
99 typename enable_if | |
100 < | |
101 is_same<typename remove_const<_Tp>::type, _Up>::value && | |
102 is_trivially_move_assignable<_Up>::value, | |
103 _Up* | |
104 >::type | |
105 __move_backward(_Tp* __first, _Tp* __last, _Up* __result) | |
106 { | |
107 const size_t __n = static_cast<size_t>(__last - __first); | |
108 if (__n > 0) | |
109 { | |
110 __result -= __n; | |
111 _VSTD::memmove(__result, __first, __n * sizeof(_Up)); | |
112 } | |
113 return __result; | |
114 } | |
115 | |
116 template <class _BidirectionalIterator1, class _BidirectionalIterator2> | |
117 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 | |
118 _BidirectionalIterator2 | |
119 move_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last, | |
120 _BidirectionalIterator2 __result) | |
121 { | |
122 if (__libcpp_is_constant_evaluated()) { | |
123 return _VSTD::__move_backward_constexpr(__first, __last, __result); | |
124 } else { | |
125 return _VSTD::__rewrap_iter(__result, | |
126 _VSTD::__move_backward(_VSTD::__unwrap_iter(__first), | |
127 _VSTD::__unwrap_iter(__last), | |
128 _VSTD::__unwrap_iter(__result))); | |
129 } | |
130 } | |
131 | |
132 _LIBCPP_END_NAMESPACE_STD | |
133 | |
134 _LIBCPP_POP_MACROS | |
135 | |
136 #endif // _LIBCPP___ALGORITHM_MOVE_H |