xref: /freebsd-src/contrib/llvm-project/libcxx/include/__memory/uninitialized_algorithms.h (revision 5e801ac66d24704442eba426ed13c3effb8a34e7)
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