1#ifndef NEFORCE_CORE_MEMORY_UNINITIALIZED_HPP__
2#define NEFORCE_CORE_MEMORY_UNINITIALIZED_HPP__
14NEFORCE_BEGIN_NAMESPACE__
36template <
typename Iterator1,
typename Iterator2,
38NEFORCE_CONSTEXPR20 Iterator2 __uninitialized_copy_aux(Iterator1 first, Iterator1 last, Iterator2 result) {
39 return _NEFORCE
copy(first, last, result);
55template <
typename Iterator1,
typename Iterator2,
57NEFORCE_CONSTEXPR20 Iterator2 __uninitialized_copy_aux(Iterator1 first, Iterator1 last, Iterator2 result) {
58 Iterator2 cur = result;
60 for (; first != last; ++first, ++cur) {
64 for (; result != cur; --cur) {
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) {
93 return inner::__uninitialized_copy_aux(first, last, result);
109template <
typename Iterator1,
typename Iterator2, enable_if_t<!is_ranges_rnd_iter_v<Iterator1>,
int> = 0>
112 Iterator2 cur = result;
118 for (; result != cur; --cur) {
135template <
typename Iterator1,
typename Iterator2, enable_if_t<is_ranges_rnd_iter_v<Iterator1>,
int> = 0>
138 Iterator1 last = first +
count;
157template <
typename Iterator1,
typename Iterator2, enable_if_t<is_ranges_fwd_iter_v<Iterator2>,
int> = 0>
159 return inner::__uninitialized_copy_n_aux(first,
count, result);
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);
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;
191 for (; cur != last; ++cur) {
195 for (; cur != first; --cur) {
217template <
typename Iterator,
typename T, enable_if_t<is_ranges_fwd_iter_v<Iterator>,
int> = 0>
222 inner::__uninitialized_fill_aux(first, last, x);
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);
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;
256 for (; n > 0; --n, ++cur) {
260 for (; cur != first; --cur) {
283template <
typename Iterator,
typename T, enable_if_t<is_ranges_fwd_iter_v<Iterator>,
int> = 0>
285 return inner::__uninitialized_fill_n_aux(first, n, x);
300template <
typename Iterator1,
typename Iterator2,
302NEFORCE_CONSTEXPR20 Iterator2 __uninitialized_move_aux(Iterator1 first, Iterator1 last, Iterator2 result) {
303 return _NEFORCE
move(first, last, result);
318template <
typename Iterator1,
typename Iterator2,
320NEFORCE_CONSTEXPR20 Iterator2 __uninitialized_move_aux(Iterator1 first, Iterator1 last, Iterator2 result) {
321 Iterator2 cur = result;
323 for (; first != last; ++first, ++cur) {
327 for (; result != cur; --cur) {
350template <
typename Iterator1,
typename Iterator2,
356 return inner::__uninitialized_move_aux(first, last, result);
372template <
typename Iterator1,
typename Iterator2, enable_if_t<!is_ranges_rnd_iter_v<Iterator1>,
int> = 0>
375 Iterator2 cur = result;
381 for (; result != cur; --cur) {
398template <
typename Iterator1,
typename Iterator2, enable_if_t<is_ranges_rnd_iter_v<Iterator1>,
int> = 0>
401 Iterator1 last = first +
count;
418template <
typename Iterator1,
typename Iterator2,
421 return inner::__uninitialized_move_n_aux(first,
count, result);
426NEFORCE_END_NAMESPACE__
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)
在未初始化内存中移动元素