NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
uninitialized.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_MEMORY_UNINITIALIZED_HPP__
2#define NEFORCE_CORE_MEMORY_UNINITIALIZED_HPP__
3
11
14NEFORCE_BEGIN_NAMESPACE__
15
21
23NEFORCE_BEGIN_INNER__
24
36template <typename Iterator1, typename Iterator2,
38NEFORCE_CONSTEXPR20 Iterator2 __uninitialized_copy_aux(Iterator1 first, Iterator1 last, Iterator2 result) {
39 return _NEFORCE copy(first, last, result);
40}
41
55template <typename Iterator1, typename Iterator2,
57NEFORCE_CONSTEXPR20 Iterator2 __uninitialized_copy_aux(Iterator1 first, Iterator1 last, Iterator2 result) {
58 Iterator2 cur = result;
59 try {
60 for (; first != last; ++first, ++cur) {
61 _NEFORCE construct(&*cur, *first);
62 }
63 } catch (...) {
64 while (cur != result) {
65 --cur;
66 _NEFORCE destroy(&*cur);
67 }
68 throw;
69 }
70 return cur;
71}
72
73NEFORCE_END_INNER__
75
89template <typename Iterator1, typename Iterator2, enable_if_t<is_ranges_fwd_iter_v<Iterator2>, int> = 0>
90NEFORCE_CONSTEXPR20 Iterator2 uninitialized_copy(Iterator1 first, Iterator1 last, Iterator2 result) {
91 if (first == last) {
92 return result;
93 }
94 return inner::__uninitialized_copy_aux(first, last, result);
95}
96
98NEFORCE_BEGIN_INNER__
99
110template <typename Iterator1, typename Iterator2, enable_if_t<!is_ranges_rnd_iter_v<Iterator1>, int> = 0>
111NEFORCE_CONSTEXPR20 Iterator2 __uninitialized_copy_n_aux(Iterator1 first, size_t count, Iterator2 result) {
112 Iterator2 cur = result;
113 try {
114 for (; count > 0; --count, ++first, ++cur) {
115 _NEFORCE construct(&*cur, *first);
116 }
117 } catch (...) {
118 for (; result != cur; --cur) {
119 _NEFORCE destroy(&*cur);
120 }
121 throw;
122 }
123 return cur;
124}
125
135template <typename Iterator1, typename Iterator2, enable_if_t<is_ranges_rnd_iter_v<Iterator1>, int> = 0>
136NEFORCE_CONSTEXPR20 Iterator2 __uninitialized_copy_n_aux(Iterator1 first, size_t count, Iterator2 result) {
137 return inner::__uninitialized_copy_aux(first, first + count, result);
138}
139
140NEFORCE_END_INNER__
142
155template <typename Iterator1, typename Iterator2, enable_if_t<is_ranges_fwd_iter_v<Iterator2>, int> = 0>
156NEFORCE_CONSTEXPR20 Iterator2 uninitialized_copy_n(Iterator1 first, size_t count, Iterator2 result) {
157 return inner::__uninitialized_copy_n_aux(first, count, result);
158}
159
161NEFORCE_BEGIN_INNER__
162
171template <typename Iterator, typename T, enable_if_t<is_trivially_copy_assignable_v<iter_value_t<Iterator>>, int> = 0>
172NEFORCE_CONSTEXPR20 void __uninitialized_fill_aux(Iterator first, Iterator last, const T& x) {
173 for (; first != last; ++first) {
174 _NEFORCE construct(&*first, x);
175 }
176}
177
187template <typename Iterator, typename T, enable_if_t<!is_trivially_copy_assignable_v<iter_value_t<Iterator>>, int> = 0>
188NEFORCE_CONSTEXPR20 void __uninitialized_fill_aux(Iterator first, Iterator last, const T& x) {
189 Iterator cur = first;
190 try {
191 for (; cur != last; ++cur) {
192 _NEFORCE construct(&*cur, x);
193 }
194 } catch (...) {
195 for (; cur != first; --cur) {
196 _NEFORCE destroy(&*cur);
197 }
198 throw;
199 }
200}
201
202NEFORCE_END_INNER__
204
217template <typename Iterator, typename T, enable_if_t<is_ranges_fwd_iter_v<Iterator>, int> = 0>
218NEFORCE_CONSTEXPR20 void uninitialized_fill(Iterator first, Iterator last, const T& x) {
219 if (first == last) {
220 return;
221 }
222 inner::__uninitialized_fill_aux(first, last, x);
223}
224
226NEFORCE_BEGIN_INNER__
227
237template <typename Iterator, typename T, enable_if_t<is_trivially_copy_assignable_v<iter_value_t<Iterator>>, int> = 0>
238NEFORCE_CONSTEXPR20 Iterator __uninitialized_fill_n_aux(Iterator first, size_t n, const T& x) {
239 Iterator cur = first;
240 for (size_t i = 0; i != n; ++i, ++cur) {
241 _NEFORCE construct(&*cur, x);
242 }
243 return cur;
244}
245
256template <typename Iterator, typename T, enable_if_t<!is_trivially_copy_assignable_v<iter_value_t<Iterator>>, int> = 0>
257NEFORCE_CONSTEXPR20 Iterator __uninitialized_fill_n_aux(Iterator first, size_t n, const T& x) {
258 Iterator cur = first;
259 try {
260 for (; n > 0; --n, ++cur) {
261 _NEFORCE construct(&*cur, x);
262 }
263 } catch (...) {
264 for (; cur != first; --cur) {
265 _NEFORCE destroy(&*cur);
266 }
267 throw;
268 }
269 return cur;
270}
271
272NEFORCE_END_INNER__
274
287template <typename Iterator, typename T, enable_if_t<is_ranges_fwd_iter_v<Iterator>, int> = 0>
288NEFORCE_CONSTEXPR20 Iterator uninitialized_fill_n(Iterator first, size_t n, const T& x) {
289 return inner::__uninitialized_fill_n_aux(first, n, x);
290}
291
293NEFORCE_BEGIN_INNER__
294
304template <typename Iterator1, typename Iterator2,
306NEFORCE_CONSTEXPR20 Iterator2 __uninitialized_move_aux(Iterator1 first, Iterator1 last, Iterator2 result) {
307 const auto n = static_cast<size_t>(last - first);
308 const auto bytes = n * sizeof(iter_value_t<Iterator1>);
309 _NEFORCE memory_move(_NEFORCE addressof(*result), _NEFORCE addressof(*first), bytes);
310 return _NEFORCE next(result, n);
311}
312
325template <typename Iterator1, typename Iterator2,
327NEFORCE_CONSTEXPR20 Iterator2 __uninitialized_move_aux(Iterator1 first, Iterator1 last, Iterator2 result) {
328 Iterator2 cur = result;
329 try {
330 for (; first != last; ++first, ++cur) {
331 _NEFORCE construct(&*cur, _NEFORCE move(*first));
332 }
333 } catch (...) {
334 for (; result != cur; --cur) {
335 _NEFORCE destroy(&*cur);
336 }
337 throw;
338 }
339 return cur;
340}
341NEFORCE_END_INNER__
343
357template <typename Iterator1, typename Iterator2,
359NEFORCE_CONSTEXPR20 Iterator2 uninitialized_move(Iterator1 first, Iterator1 last, Iterator2 result) {
360 if (first == last) {
361 return result;
362 }
363 return inner::__uninitialized_move_aux(first, last, result);
364}
365
367NEFORCE_BEGIN_INNER__
368
379template <typename Iterator1, typename Iterator2, enable_if_t<!is_ranges_rnd_iter_v<Iterator1>, int> = 0>
380NEFORCE_CONSTEXPR20 Iterator2 __uninitialized_move_n_aux(Iterator1 first, size_t count, Iterator2 result) {
381 Iterator2 cur = result;
382 try {
383 for (; count > 0; --count, ++first, ++cur) {
384 _NEFORCE construct(&*cur, _NEFORCE move(*first));
385 }
386 } catch (...) {
387 for (; result != cur; --cur) {
388 _NEFORCE destroy(&*cur);
389 }
390 throw;
391 }
392 return cur;
393}
394
404template <typename Iterator1, typename Iterator2, enable_if_t<is_ranges_rnd_iter_v<Iterator1>, int> = 0>
405NEFORCE_CONSTEXPR20 Iterator2 __uninitialized_move_n_aux(Iterator1 first, size_t count, Iterator2 result) {
406 return inner::__uninitialized_move_aux(first, first + count, result);
407}
408
409NEFORCE_END_INNER__
411
422template <typename Iterator1, typename Iterator2,
424NEFORCE_CONSTEXPR20 Iterator2 uninitialized_move_n(Iterator1 first, size_t count, Iterator2 result) {
425 return inner::__uninitialized_move_n_aux(first, count, result);
426}
427 // UninitializedAlgorithms
429
430NEFORCE_END_NAMESPACE__
431#endif // NEFORCE_CORE_MEMORY_UNINITIALIZED_HPP__
内存构造和销毁函数
constexpr T * addressof(T &x) noexcept
获取对象的地址
constexpr iter_difference_t< Iterator > count(Iterator first, Iterator last, const T &value)
统计范围内等于指定值的元素数量
constexpr void destroy(T *pointer) noexcept(is_nothrow_destructible_v< T >)
销毁单个对象
constexpr T * construct(T *ptr, Args &&... args) noexcept(is_nothrow_constructible_v< T, Args... >)
在指定内存位置构造对象
constexpr bool is_ranges_fwd_iter_v
检查是否为范围前向迭代器
constexpr Iterator next(Iterator iter, iter_difference_t< Iterator > n=1)
获取迭代器的后一个位置
typename iterator_traits< Iterator >::value_type iter_value_t
获取迭代器的值类型
constexpr void * memory_move(void *dest, const void *src, size_t count) noexcept
从源内存移动数据到目标内存
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
constexpr Iterator2 copy(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__copy_aux(first, last, result)))
复制范围元素
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
constexpr void uninitialized_fill(Iterator first, Iterator last, const T &x)
在未初始化内存上填充值
constexpr Iterator2 uninitialized_copy(Iterator1 first, Iterator1 last, Iterator2 result)
复制元素到未初始化内存
constexpr Iterator2 uninitialized_copy_n(Iterator1 first, size_t count, Iterator2 result)
复制指定数量的元素到未初始化内存
constexpr Iterator2 uninitialized_move(Iterator1 first, Iterator1 last, Iterator2 result)
在未初始化内存中移动元素
constexpr Iterator2 uninitialized_move_n(Iterator1 first, size_t count, Iterator2 result)
在未初始化内存中移动指定数量的元素
constexpr Iterator uninitialized_fill_n(Iterator first, size_t n, const T &x)
在未初始化内存中用指定值填充指定数量的元素
移位和修改算法