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_PUSH_MACROS
24 #include <__undef_macros>
25 
26 _LIBCPP_BEGIN_NAMESPACE_STD
27 
28 template <class _InputIterator, class _ForwardIterator>
29 _ForwardIterator
30 uninitialized_copy(_InputIterator __f, _InputIterator __l, _ForwardIterator __r)
31 {
32     typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
33 #ifndef _LIBCPP_NO_EXCEPTIONS
34     _ForwardIterator __s = __r;
35     try
36     {
37 #endif
38         for (; __f != __l; ++__f, (void) ++__r)
39             ::new ((void*)_VSTD::addressof(*__r)) value_type(*__f);
40 #ifndef _LIBCPP_NO_EXCEPTIONS
41     }
42     catch (...)
43     {
44         for (; __s != __r; ++__s)
45             __s->~value_type();
46         throw;
47     }
48 #endif
49     return __r;
50 }
51 
52 template <class _InputIterator, class _Size, class _ForwardIterator>
53 _ForwardIterator
54 uninitialized_copy_n(_InputIterator __f, _Size __n, _ForwardIterator __r)
55 {
56     typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
57 #ifndef _LIBCPP_NO_EXCEPTIONS
58     _ForwardIterator __s = __r;
59     try
60     {
61 #endif
62         for (; __n > 0; ++__f, (void) ++__r, (void) --__n)
63             ::new ((void*)_VSTD::addressof(*__r)) value_type(*__f);
64 #ifndef _LIBCPP_NO_EXCEPTIONS
65     }
66     catch (...)
67     {
68         for (; __s != __r; ++__s)
69             __s->~value_type();
70         throw;
71     }
72 #endif
73     return __r;
74 }
75 
76 template <class _ForwardIterator, class _Tp>
77 void
78 uninitialized_fill(_ForwardIterator __f, _ForwardIterator __l, const _Tp& __x)
79 {
80     typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
81 #ifndef _LIBCPP_NO_EXCEPTIONS
82     _ForwardIterator __s = __f;
83     try
84     {
85 #endif
86         for (; __f != __l; ++__f)
87             ::new ((void*)_VSTD::addressof(*__f)) value_type(__x);
88 #ifndef _LIBCPP_NO_EXCEPTIONS
89     }
90     catch (...)
91     {
92         for (; __s != __f; ++__s)
93             __s->~value_type();
94         throw;
95     }
96 #endif
97 }
98 
99 template <class _ForwardIterator, class _Size, class _Tp>
100 _ForwardIterator
101 uninitialized_fill_n(_ForwardIterator __f, _Size __n, const _Tp& __x)
102 {
103     typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
104 #ifndef _LIBCPP_NO_EXCEPTIONS
105     _ForwardIterator __s = __f;
106     try
107     {
108 #endif
109         for (; __n > 0; ++__f, (void) --__n)
110             ::new ((void*)_VSTD::addressof(*__f)) value_type(__x);
111 #ifndef _LIBCPP_NO_EXCEPTIONS
112     }
113     catch (...)
114     {
115         for (; __s != __f; ++__s)
116             __s->~value_type();
117         throw;
118     }
119 #endif
120     return __f;
121 }
122 
123 #if _LIBCPP_STD_VER > 14
124 
125 template <class _ForwardIterator>
126 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
127 void destroy(_ForwardIterator __first, _ForwardIterator __last) {
128     for (; __first != __last; ++__first)
129         _VSTD::destroy_at(_VSTD::addressof(*__first));
130 }
131 
132 template <class _ForwardIterator, class _Size>
133 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
134 _ForwardIterator destroy_n(_ForwardIterator __first, _Size __n) {
135     for (; __n > 0; (void)++__first, --__n)
136         _VSTD::destroy_at(_VSTD::addressof(*__first));
137     return __first;
138 }
139 
140 template <class _ForwardIterator>
141 inline _LIBCPP_INLINE_VISIBILITY
142 void uninitialized_default_construct(_ForwardIterator __first, _ForwardIterator __last) {
143     using _Vt = typename iterator_traits<_ForwardIterator>::value_type;
144     auto __idx = __first;
145 #ifndef _LIBCPP_NO_EXCEPTIONS
146     try {
147 #endif
148     for (; __idx != __last; ++__idx)
149         ::new ((void*)_VSTD::addressof(*__idx)) _Vt;
150 #ifndef _LIBCPP_NO_EXCEPTIONS
151     } catch (...) {
152         _VSTD::destroy(__first, __idx);
153         throw;
154     }
155 #endif
156 }
157 
158 template <class _ForwardIterator, class _Size>
159 inline _LIBCPP_INLINE_VISIBILITY
160 _ForwardIterator uninitialized_default_construct_n(_ForwardIterator __first, _Size __n) {
161     using _Vt = typename iterator_traits<_ForwardIterator>::value_type;
162     auto __idx = __first;
163 #ifndef _LIBCPP_NO_EXCEPTIONS
164     try {
165 #endif
166     for (; __n > 0; (void)++__idx, --__n)
167         ::new ((void*)_VSTD::addressof(*__idx)) _Vt;
168     return __idx;
169 #ifndef _LIBCPP_NO_EXCEPTIONS
170     } catch (...) {
171         _VSTD::destroy(__first, __idx);
172         throw;
173     }
174 #endif
175 }
176 
177 
178 template <class _ForwardIterator>
179 inline _LIBCPP_INLINE_VISIBILITY
180 void uninitialized_value_construct(_ForwardIterator __first, _ForwardIterator __last) {
181     using _Vt = typename iterator_traits<_ForwardIterator>::value_type;
182     auto __idx = __first;
183 #ifndef _LIBCPP_NO_EXCEPTIONS
184     try {
185 #endif
186     for (; __idx != __last; ++__idx)
187         ::new ((void*)_VSTD::addressof(*__idx)) _Vt();
188 #ifndef _LIBCPP_NO_EXCEPTIONS
189     } catch (...) {
190         _VSTD::destroy(__first, __idx);
191         throw;
192     }
193 #endif
194 }
195 
196 template <class _ForwardIterator, class _Size>
197 inline _LIBCPP_INLINE_VISIBILITY
198 _ForwardIterator uninitialized_value_construct_n(_ForwardIterator __first, _Size __n) {
199     using _Vt = typename iterator_traits<_ForwardIterator>::value_type;
200     auto __idx = __first;
201 #ifndef _LIBCPP_NO_EXCEPTIONS
202     try {
203 #endif
204     for (; __n > 0; (void)++__idx, --__n)
205         ::new ((void*)_VSTD::addressof(*__idx)) _Vt();
206     return __idx;
207 #ifndef _LIBCPP_NO_EXCEPTIONS
208     } catch (...) {
209         _VSTD::destroy(__first, __idx);
210         throw;
211     }
212 #endif
213 }
214 
215 
216 template <class _InputIt, class _ForwardIt>
217 inline _LIBCPP_INLINE_VISIBILITY
218 _ForwardIt uninitialized_move(_InputIt __first, _InputIt __last, _ForwardIt __first_res) {
219     using _Vt = typename iterator_traits<_ForwardIt>::value_type;
220     auto __idx = __first_res;
221 #ifndef _LIBCPP_NO_EXCEPTIONS
222     try {
223 #endif
224     for (; __first != __last; (void)++__idx, ++__first)
225         ::new ((void*)_VSTD::addressof(*__idx)) _Vt(_VSTD::move(*__first));
226     return __idx;
227 #ifndef _LIBCPP_NO_EXCEPTIONS
228     } catch (...) {
229         _VSTD::destroy(__first_res, __idx);
230         throw;
231     }
232 #endif
233 }
234 
235 template <class _InputIt, class _Size, class _ForwardIt>
236 inline _LIBCPP_INLINE_VISIBILITY
237 pair<_InputIt, _ForwardIt>
238 uninitialized_move_n(_InputIt __first, _Size __n, _ForwardIt __first_res) {
239     using _Vt = typename iterator_traits<_ForwardIt>::value_type;
240     auto __idx = __first_res;
241 #ifndef _LIBCPP_NO_EXCEPTIONS
242     try {
243 #endif
244     for (; __n > 0; ++__idx, (void)++__first, --__n)
245         ::new ((void*)_VSTD::addressof(*__idx)) _Vt(_VSTD::move(*__first));
246     return {__first, __idx};
247 #ifndef _LIBCPP_NO_EXCEPTIONS
248     } catch (...) {
249         _VSTD::destroy(__first_res, __idx);
250         throw;
251     }
252 #endif
253 }
254 
255 #endif // _LIBCPP_STD_VER > 14
256 
257 _LIBCPP_END_NAMESPACE_STD
258 
259 _LIBCPP_POP_MACROS
260 
261 #endif // _LIBCPP___MEMORY_UNINITIALIZED_ALGORITHMS_H
262