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 for (; result != cur; --cur) {
65 _NEFORCE destroy(&*cur);
66 }
67 NEFORCE_THROW_EXCEPTION(memory_exception("uninitialized copy failed."));
68 }
69 return cur;
70}
71
72NEFORCE_END_INNER__
74
88template <typename Iterator1, typename Iterator2, enable_if_t<is_ranges_fwd_iter_v<Iterator2>, int> = 0>
89NEFORCE_CONSTEXPR20 Iterator2 uninitialized_copy(Iterator1 first, Iterator1 last, Iterator2 result) {
90 if (first == last) {
91 return result;
92 }
93 return inner::__uninitialized_copy_aux(first, last, result);
94}
95
97NEFORCE_BEGIN_INNER__
98
109template <typename Iterator1, typename Iterator2, enable_if_t<!is_ranges_rnd_iter_v<Iterator1>, int> = 0>
110NEFORCE_CONSTEXPR20 pair<Iterator1, Iterator2> __uninitialized_copy_n_aux(Iterator1 first, size_t count,
111 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 NEFORCE_THROW_EXCEPTION(memory_exception("uninitialized copy n failed."));
122 }
123 return pair<Iterator1, Iterator2>(first, cur);
124}
125
135template <typename Iterator1, typename Iterator2, enable_if_t<is_ranges_rnd_iter_v<Iterator1>, int> = 0>
136NEFORCE_CONSTEXPR20 pair<Iterator1, Iterator2> __uninitialized_copy_n_aux(Iterator1 first, size_t count,
137 Iterator2 result) {
138 Iterator1 last = first + count;
139 return _NEFORCE make_pair(last, _NEFORCE uninitialized_copy(first, last, result));
140}
141
142NEFORCE_END_INNER__
144
157template <typename Iterator1, typename Iterator2, enable_if_t<is_ranges_fwd_iter_v<Iterator2>, int> = 0>
158NEFORCE_CONSTEXPR20 pair<Iterator1, Iterator2> uninitialized_copy_n(Iterator1 first, size_t count, Iterator2 result) {
159 return inner::__uninitialized_copy_n_aux(first, count, result);
160}
161
163NEFORCE_BEGIN_INNER__
164
173template <typename Iterator, typename T, enable_if_t<is_trivially_copy_assignable_v<iter_value_t<Iterator>>, int> = 0>
174NEFORCE_CONSTEXPR20 void __uninitialized_fill_aux(Iterator first, Iterator last, const T& x) {
175 _NEFORCE fill(first, last, x);
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 NEFORCE_THROW_EXCEPTION(memory_exception("uninitialized fill failed."));
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 return _NEFORCE fill_n(first, n, x);
240}
241
252template <typename Iterator, typename T, enable_if_t<!is_trivially_copy_assignable_v<iter_value_t<Iterator>>, int> = 0>
253NEFORCE_CONSTEXPR20 Iterator __uninitialized_fill_n_aux(Iterator first, size_t n, const T& x) {
254 Iterator cur = first;
255 try {
256 for (; n > 0; --n, ++cur) {
257 _NEFORCE construct(&*cur, x);
258 }
259 } catch (...) {
260 for (; cur != first; --cur) {
261 _NEFORCE destroy(&*cur);
262 }
263 NEFORCE_THROW_EXCEPTION(memory_exception("uninitialized fill n failed."));
264 }
265 return cur;
266}
267
268NEFORCE_END_INNER__
270
283template <typename Iterator, typename T, enable_if_t<is_ranges_fwd_iter_v<Iterator>, int> = 0>
284NEFORCE_CONSTEXPR20 Iterator uninitialized_fill_n(Iterator first, size_t n, const T& x) {
285 return inner::__uninitialized_fill_n_aux(first, n, x);
286}
287
289NEFORCE_BEGIN_INNER__
290
300template <typename Iterator1, typename Iterator2,
302NEFORCE_CONSTEXPR20 Iterator2 __uninitialized_move_aux(Iterator1 first, Iterator1 last, Iterator2 result) {
303 return _NEFORCE move(first, last, result);
304}
305
318template <typename Iterator1, typename Iterator2,
320NEFORCE_CONSTEXPR20 Iterator2 __uninitialized_move_aux(Iterator1 first, Iterator1 last, Iterator2 result) {
321 Iterator2 cur = result;
322 try {
323 for (; first != last; ++first, ++cur) {
324 _NEFORCE construct(&*cur, _NEFORCE move(*first));
325 }
326 } catch (...) {
327 for (; result != cur; --cur) {
328 _NEFORCE destroy(&*cur);
329 }
330 NEFORCE_THROW_EXCEPTION(memory_exception("uninitialized move failed."));
331 }
332 return cur;
333}
334NEFORCE_END_INNER__
336
350template <typename Iterator1, typename Iterator2,
352NEFORCE_CONSTEXPR20 Iterator2 uninitialized_move(Iterator1 first, Iterator1 last, Iterator2 result) {
353 if (first == last) {
354 return result;
355 }
356 return inner::__uninitialized_move_aux(first, last, result);
357}
358
360NEFORCE_BEGIN_INNER__
361
372template <typename Iterator1, typename Iterator2, enable_if_t<!is_ranges_rnd_iter_v<Iterator1>, int> = 0>
373NEFORCE_CONSTEXPR20 pair<Iterator1, Iterator2> __uninitialized_move_n_aux(Iterator1 first, size_t count,
374 Iterator2 result) {
375 Iterator2 cur = result;
376 try {
377 for (; count > 0; --count, ++first, ++cur) {
378 _NEFORCE construct(&*cur, _NEFORCE move(*first));
379 }
380 } catch (...) {
381 for (; result != cur; --cur) {
382 _NEFORCE destroy(&*cur);
383 }
384 NEFORCE_THROW_EXCEPTION(memory_exception("uninitialized move n failed."));
385 }
386 return pair<Iterator1, Iterator2>(first, cur);
387}
388
398template <typename Iterator1, typename Iterator2, enable_if_t<is_ranges_rnd_iter_v<Iterator1>, int> = 0>
399NEFORCE_CONSTEXPR20 pair<Iterator1, Iterator2> __uninitialized_move_n_aux(Iterator1 first, size_t count,
400 Iterator2 result) {
401 Iterator1 last = first + count;
402 return _NEFORCE make_pair(last, _NEFORCE uninitialized_move(first, last, result));
403}
404
405NEFORCE_END_INNER__
407
418template <typename Iterator1, typename Iterator2,
420NEFORCE_CONSTEXPR20 pair<Iterator1, Iterator2> uninitialized_move_n(Iterator1 first, size_t count, Iterator2 result) {
421 return inner::__uninitialized_move_n_aux(first, count, result);
422}
423 // UninitializedAlgorithms
425
426NEFORCE_END_NAMESPACE__
427#endif // NEFORCE_CORE_MEMORY_UNINITIALIZED_HPP__
内存构造和销毁函数
constexpr iter_difference_t< Iterator > count(Iterator first, Iterator last, const T &value)
统计范围内等于指定值的元素数量
NEFORCE_CONSTEXPR20 T * construct(T *ptr, Args &&... args) noexcept(is_nothrow_constructible_v< T, Args... >)
在指定内存位置构造对象
NEFORCE_CONSTEXPR20 void destroy(T *pointer) noexcept(is_nothrow_destructible_v< T >)
销毁单个对象
NEFORCE_INLINE17 constexpr bool is_ranges_fwd_iter_v
检查是否为范围前向迭代器
constexpr pair< unwrap_ref_decay_t< T1 >, unwrap_ref_decay_t< T2 > > make_pair(T1 &&x, T2 &&y) noexcept(conjunction< is_nothrow_constructible< unwrap_ref_decay_t< T1 >, T1 >, is_nothrow_constructible< unwrap_ref_decay_t< T2 >, T2 > >::value)
创建pair的辅助函数
constexpr void fill(Iterator first, Iterator last, const T &value) noexcept(is_nothrow_assignable_v< iter_value_t< Iterator >, T >)
填充范围元素
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)))
复制范围元素
constexpr Iterator fill_n(Iterator first, iter_difference_t< Iterator > n, const T &value) noexcept(is_nothrow_assignable_v< iter_value_t< Iterator >, T >)
填充指定数量的元素
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
NEFORCE_CONSTEXPR20 Iterator2 uninitialized_copy(Iterator1 first, Iterator1 last, Iterator2 result)
复制元素到未初始化内存
NEFORCE_CONSTEXPR20 void uninitialized_fill(Iterator first, Iterator last, const T &x)
在未初始化内存上填充值
NEFORCE_CONSTEXPR20 pair< Iterator1, Iterator2 > uninitialized_copy_n(Iterator1 first, size_t count, Iterator2 result)
复制指定数量的元素到未初始化内存
NEFORCE_CONSTEXPR20 pair< Iterator1, Iterator2 > uninitialized_move_n(Iterator1 first, size_t count, Iterator2 result)
在未初始化内存中移动指定数量的元素
NEFORCE_CONSTEXPR20 Iterator uninitialized_fill_n(Iterator first, size_t n, const T &x)
在未初始化内存中用指定值填充指定数量的元素
NEFORCE_CONSTEXPR20 Iterator2 uninitialized_move(Iterator1 first, Iterator1 last, Iterator2 result)
在未初始化内存中移动元素
移位和修改算法
内存操作异常
存储两个值的元组对