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 while (cur != result) {
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) {
94 return inner::__uninitialized_copy_aux(first, last, result);
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;
118 for (; result != cur; --cur) {
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);
155template <
typename Iterator1,
typename Iterator2, enable_if_t<is_ranges_fwd_iter_v<Iterator2>,
int> = 0>
157 return inner::__uninitialized_copy_n_aux(first,
count, result);
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) {
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 Iterator cur = first;
240 for (
size_t i = 0; i != n; ++i, ++cur) {
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;
260 for (; n > 0; --n, ++cur) {
264 for (; cur != first; --cur) {
287template <
typename Iterator,
typename T, enable_if_t<is_ranges_fwd_iter_v<Iterator>,
int> = 0>
289 return inner::__uninitialized_fill_n_aux(first, n, x);
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);
310 return _NEFORCE
next(result, n);
325template <
typename Iterator1,
typename Iterator2,
327NEFORCE_CONSTEXPR20 Iterator2 __uninitialized_move_aux(Iterator1 first, Iterator1 last, Iterator2 result) {
328 Iterator2 cur = result;
330 for (; first != last; ++first, ++cur) {
334 for (; result != cur; --cur) {
357template <
typename Iterator1,
typename Iterator2,
363 return inner::__uninitialized_move_aux(first, last, result);
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;
387 for (; result != cur; --cur) {
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);
422template <
typename Iterator1,
typename Iterator2,
425 return inner::__uninitialized_move_n_aux(first,
count, result);
430NEFORCE_END_NAMESPACE__
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)
在未初始化内存中用指定值填充指定数量的元素