1 // -*- C++ -*- 2 //===----------------------------------------------------------------------===// 3 // 4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5 // See https://llvm.org/LICENSE.txt for license information. 6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef _LIBCPP___MEMORY_UNINITIALIZED_ALGORITHMS_H 11 #define _LIBCPP___MEMORY_UNINITIALIZED_ALGORITHMS_H 12 13 #include <__config> 14 #include <__memory/addressof.h> 15 #include <__memory/construct_at.h> 16 #include <iterator> 17 #include <utility> 18 19 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 20 #pragma GCC system_header 21 #endif 22 23 _LIBCPP_BEGIN_NAMESPACE_STD 24 25 template <class _InputIterator, class _ForwardIterator> 26 _ForwardIterator 27 uninitialized_copy(_InputIterator __f, _InputIterator __l, _ForwardIterator __r) 28 { 29 typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 30 #ifndef _LIBCPP_NO_EXCEPTIONS 31 _ForwardIterator __s = __r; 32 try 33 { 34 #endif 35 for (; __f != __l; ++__f, (void) ++__r) 36 ::new ((void*)_VSTD::addressof(*__r)) value_type(*__f); 37 #ifndef _LIBCPP_NO_EXCEPTIONS 38 } 39 catch (...) 40 { 41 for (; __s != __r; ++__s) 42 __s->~value_type(); 43 throw; 44 } 45 #endif 46 return __r; 47 } 48 49 template <class _InputIterator, class _Size, class _ForwardIterator> 50 _ForwardIterator 51 uninitialized_copy_n(_InputIterator __f, _Size __n, _ForwardIterator __r) 52 { 53 typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 54 #ifndef _LIBCPP_NO_EXCEPTIONS 55 _ForwardIterator __s = __r; 56 try 57 { 58 #endif 59 for (; __n > 0; ++__f, (void) ++__r, (void) --__n) 60 ::new ((void*)_VSTD::addressof(*__r)) value_type(*__f); 61 #ifndef _LIBCPP_NO_EXCEPTIONS 62 } 63 catch (...) 64 { 65 for (; __s != __r; ++__s) 66 __s->~value_type(); 67 throw; 68 } 69 #endif 70 return __r; 71 } 72 73 template <class _ForwardIterator, class _Tp> 74 void 75 uninitialized_fill(_ForwardIterator __f, _ForwardIterator __l, const _Tp& __x) 76 { 77 typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 78 #ifndef _LIBCPP_NO_EXCEPTIONS 79 _ForwardIterator __s = __f; 80 try 81 { 82 #endif 83 for (; __f != __l; ++__f) 84 ::new ((void*)_VSTD::addressof(*__f)) value_type(__x); 85 #ifndef _LIBCPP_NO_EXCEPTIONS 86 } 87 catch (...) 88 { 89 for (; __s != __f; ++__s) 90 __s->~value_type(); 91 throw; 92 } 93 #endif 94 } 95 96 template <class _ForwardIterator, class _Size, class _Tp> 97 _ForwardIterator 98 uninitialized_fill_n(_ForwardIterator __f, _Size __n, const _Tp& __x) 99 { 100 typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 101 #ifndef _LIBCPP_NO_EXCEPTIONS 102 _ForwardIterator __s = __f; 103 try 104 { 105 #endif 106 for (; __n > 0; ++__f, (void) --__n) 107 ::new ((void*)_VSTD::addressof(*__f)) value_type(__x); 108 #ifndef _LIBCPP_NO_EXCEPTIONS 109 } 110 catch (...) 111 { 112 for (; __s != __f; ++__s) 113 __s->~value_type(); 114 throw; 115 } 116 #endif 117 return __f; 118 } 119 120 #if _LIBCPP_STD_VER > 14 121 122 template <class _ForwardIterator> 123 inline _LIBCPP_INLINE_VISIBILITY 124 void uninitialized_default_construct(_ForwardIterator __first, _ForwardIterator __last) { 125 using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 126 auto __idx = __first; 127 #ifndef _LIBCPP_NO_EXCEPTIONS 128 try { 129 #endif 130 for (; __idx != __last; ++__idx) 131 ::new ((void*)_VSTD::addressof(*__idx)) _Vt; 132 #ifndef _LIBCPP_NO_EXCEPTIONS 133 } catch (...) { 134 _VSTD::destroy(__first, __idx); 135 throw; 136 } 137 #endif 138 } 139 140 template <class _ForwardIterator, class _Size> 141 inline _LIBCPP_INLINE_VISIBILITY 142 _ForwardIterator uninitialized_default_construct_n(_ForwardIterator __first, _Size __n) { 143 using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 144 auto __idx = __first; 145 #ifndef _LIBCPP_NO_EXCEPTIONS 146 try { 147 #endif 148 for (; __n > 0; ++__idx, (void) --__n) 149 ::new ((void*)_VSTD::addressof(*__idx)) _Vt; 150 return __idx; 151 #ifndef _LIBCPP_NO_EXCEPTIONS 152 } catch (...) { 153 _VSTD::destroy(__first, __idx); 154 throw; 155 } 156 #endif 157 } 158 159 160 template <class _ForwardIterator> 161 inline _LIBCPP_INLINE_VISIBILITY 162 void uninitialized_value_construct(_ForwardIterator __first, _ForwardIterator __last) { 163 using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 164 auto __idx = __first; 165 #ifndef _LIBCPP_NO_EXCEPTIONS 166 try { 167 #endif 168 for (; __idx != __last; ++__idx) 169 ::new ((void*)_VSTD::addressof(*__idx)) _Vt(); 170 #ifndef _LIBCPP_NO_EXCEPTIONS 171 } catch (...) { 172 _VSTD::destroy(__first, __idx); 173 throw; 174 } 175 #endif 176 } 177 178 template <class _ForwardIterator, class _Size> 179 inline _LIBCPP_INLINE_VISIBILITY 180 _ForwardIterator uninitialized_value_construct_n(_ForwardIterator __first, _Size __n) { 181 using _Vt = typename iterator_traits<_ForwardIterator>::value_type; 182 auto __idx = __first; 183 #ifndef _LIBCPP_NO_EXCEPTIONS 184 try { 185 #endif 186 for (; __n > 0; ++__idx, (void) --__n) 187 ::new ((void*)_VSTD::addressof(*__idx)) _Vt(); 188 return __idx; 189 #ifndef _LIBCPP_NO_EXCEPTIONS 190 } catch (...) { 191 _VSTD::destroy(__first, __idx); 192 throw; 193 } 194 #endif 195 } 196 197 198 template <class _InputIt, class _ForwardIt> 199 inline _LIBCPP_INLINE_VISIBILITY 200 _ForwardIt uninitialized_move(_InputIt __first, _InputIt __last, _ForwardIt __first_res) { 201 using _Vt = typename iterator_traits<_ForwardIt>::value_type; 202 auto __idx = __first_res; 203 #ifndef _LIBCPP_NO_EXCEPTIONS 204 try { 205 #endif 206 for (; __first != __last; ++__idx, (void) ++__first) 207 ::new ((void*)_VSTD::addressof(*__idx)) _Vt(_VSTD::move(*__first)); 208 return __idx; 209 #ifndef _LIBCPP_NO_EXCEPTIONS 210 } catch (...) { 211 _VSTD::destroy(__first_res, __idx); 212 throw; 213 } 214 #endif 215 } 216 217 template <class _InputIt, class _Size, class _ForwardIt> 218 inline _LIBCPP_INLINE_VISIBILITY 219 pair<_InputIt, _ForwardIt> 220 uninitialized_move_n(_InputIt __first, _Size __n, _ForwardIt __first_res) { 221 using _Vt = typename iterator_traits<_ForwardIt>::value_type; 222 auto __idx = __first_res; 223 #ifndef _LIBCPP_NO_EXCEPTIONS 224 try { 225 #endif 226 for (; __n > 0; ++__idx, (void) ++__first, --__n) 227 ::new ((void*)_VSTD::addressof(*__idx)) _Vt(_VSTD::move(*__first)); 228 return {__first, __idx}; 229 #ifndef _LIBCPP_NO_EXCEPTIONS 230 } catch (...) { 231 _VSTD::destroy(__first_res, __idx); 232 throw; 233 } 234 #endif 235 } 236 237 #endif // _LIBCPP_STD_VER > 14 238 239 _LIBCPP_END_NAMESPACE_STD 240 241 #endif // _LIBCPP___MEMORY_UNINITIALIZED_ALGORITHMS_H 242