1#ifndef MSTL_CORE_MEMORY_UNINITIALIZED_HPP__
2#define MSTL_CORE_MEMORY_UNINITIALIZED_HPP__
36template <
typename Iterator1,
typename Iterator2,
enable_if_t<
37 is_trivially_copy_assignable_v<iter_value_t<Iterator1>>,
int> = 0>
38MSTL_CONSTEXPR20 Iterator2 __uninitialized_copy_aux(Iterator1 first, Iterator1 last, Iterator2 result) {
55template <
typename Iterator1,
typename Iterator2,
enable_if_t<
56 !is_trivially_copy_assignable_v<iter_value_t<Iterator1>>,
int> = 0>
57MSTL_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>
89MSTL_CONSTEXPR20 Iterator2
uninitialized_copy(Iterator1 first, Iterator1 last, Iterator2 result) {
90 if (first == last)
return result;
91 return _INNER __uninitialized_copy_aux(first, last, result);
107template <
typename Iterator1,
typename Iterator2, enable_if_t<!is_ranges_rnd_iter_v<Iterator1>,
int> = 0>
109 Iterator1 first,
size_t count, Iterator2 result) {
110 Iterator2 cur = result;
116 for (; result != cur; --cur) {
133template <
typename Iterator1,
typename Iterator2, enable_if_t<is_ranges_rnd_iter_v<Iterator1>,
int> = 0>
135 Iterator1 first,
size_t count, Iterator2 result) {
136 Iterator1 last = first +
count;
155template <
typename Iterator1,
typename Iterator2, enable_if_t<is_ranges_fwd_iter_v<Iterator2>,
int> = 0>
157 Iterator1 first,
size_t count, Iterator2 result) {
158 return _INNER __uninitialized_copy_n_aux(first,
count, result);
172template <
typename Iterator,
typename T,
enable_if_t<
173 is_trivially_copy_assignable_v<iter_value_t<Iterator>>,
int> = 0>
174MSTL_CONSTEXPR20
void __uninitialized_fill_aux(Iterator first, Iterator last,
const T& x) {
187template <
typename Iterator,
typename T,
enable_if_t<
188 !is_trivially_copy_assignable_v<iter_value_t<Iterator>>,
int> = 0>
189MSTL_CONSTEXPR20
void __uninitialized_fill_aux(Iterator first, Iterator last,
const T& x) {
190 Iterator cur = first;
192 for (; cur != last; ++cur) {
196 for (; cur != first; --cur) {
218template <
typename Iterator,
typename T, enable_if_t<is_ranges_fwd_iter_v<Iterator>,
int> = 0>
220 if (first == last)
return;
221 _INNER __uninitialized_fill_aux(first, last, x);
236template <
typename Iterator,
typename T,
enable_if_t<
237 is_trivially_copy_assignable_v<iter_value_t<Iterator>>,
int> = 0>
238MSTL_CONSTEXPR20 Iterator __uninitialized_fill_n_aux(Iterator first,
size_t n,
const T& x) {
252template <
typename Iterator,
typename T,
enable_if_t<
253 !is_trivially_copy_assignable_v<iter_value_t<Iterator>>,
int> = 0>
254MSTL_CONSTEXPR20 Iterator __uninitialized_fill_n_aux(Iterator first,
size_t n,
const T& x) {
255 Iterator cur = first;
257 for (; n > 0; --n, ++cur) {
261 for (; cur != first; --cur) {
284template <
typename Iterator,
typename T, enable_if_t<is_ranges_fwd_iter_v<Iterator>,
int> = 0>
286 return _INNER __uninitialized_fill_n_aux(first, n, x);
301template <
typename Iterator1,
typename Iterator2,
enable_if_t<
302 is_trivially_copy_assignable_v<iter_value_t<Iterator1>>,
int> = 0>
303MSTL_CONSTEXPR20 Iterator2 __uninitialized_move_aux(Iterator1 first, Iterator1 last, Iterator2 result) {
319template <
typename Iterator1,
typename Iterator2,
enable_if_t<
320 !is_trivially_copy_assignable_v<iter_value_t<Iterator1>>,
int> = 0>
321MSTL_CONSTEXPR20 Iterator2 __uninitialized_move_aux(Iterator1 first, Iterator1 last, Iterator2 result) {
322 Iterator2 cur = result;
324 for (; first != last; ++first, ++cur) {
328 for (; result != cur; --cur) {
351template <
typename Iterator1,
typename Iterator2,
enable_if_t<
354 if (first == last)
return result;
355 return _INNER __uninitialized_move_aux(first, last, result);
371template <
typename Iterator1,
typename Iterator2, enable_if_t<!is_ranges_rnd_iter_v<Iterator1>,
int> = 0>
373 Iterator1 first,
size_t count, Iterator2 result) {
374 Iterator2 cur = result;
380 for (; result != cur; --cur) {
397template <
typename Iterator1,
typename Iterator2, enable_if_t<is_ranges_rnd_iter_v<Iterator1>,
int> = 0>
399 Iterator1 first,
size_t count, Iterator2 result) {
400 Iterator1 last = first +
count;
417template <
typename Iterator1,
typename Iterator2,
enable_if_t<
420 Iterator1 first,
size_t count, Iterator2 result) {
421 return _INNER __uninitialized_move_n_aux(first,
count, result);
constexpr iter_difference_t< Iterator > count(Iterator first, Iterator last, const T &value)
统计范围内等于指定值的元素数量
MSTL_CONSTEXPR20 enable_if_t< is_constructible_v< T, Args... >, void * > construct(T *ptr, Args &&... args) noexcept(is_nothrow_constructible_v< T, Args... >)
在指定内存位置构造对象
MSTL_CONSTEXPR20 void destroy(T *pointer) noexcept(is_nothrow_destructible_v< T >)
销毁单个对象
MSTL_INLINE17 constexpr bool is_ranges_fwd_iter_v
检查是否为范围前向迭代器
MSTL_INLINE17 constexpr bool is_ranges_input_iter_v
检查是否为范围输入迭代器
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_INNER__
结束inner命名空间
#define _INNER
inner命名空间前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
#define MSTL_BEGIN_INNER__
开始inner命名空间
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)
填充范围元素
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result)
移动范围元素
constexpr Iterator2 copy(Iterator1 first, Iterator1 last, Iterator2 result)
复制范围元素
constexpr Iterator fill_n(Iterator first, size_t n, const T &value)
填充指定数量的元素
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
MSTL_CONSTEXPR20 pair< Iterator1, Iterator2 > uninitialized_copy_n(Iterator1 first, size_t count, Iterator2 result)
复制指定数量的元素到未初始化内存
MSTL_CONSTEXPR20 Iterator2 uninitialized_move(Iterator1 first, Iterator1 last, Iterator2 result)
在未初始化内存中移动元素
MSTL_CONSTEXPR20 Iterator uninitialized_fill_n(Iterator first, size_t n, const T &x)
在未初始化内存中用指定值填充指定数量的元素
MSTL_CONSTEXPR20 pair< Iterator1, Iterator2 > uninitialized_move_n(Iterator1 first, size_t count, Iterator2 result)
在未初始化内存中移动指定数量的元素
MSTL_CONSTEXPR20 void uninitialized_fill(Iterator first, Iterator last, const T &x)
在未初始化内存上填充值
MSTL_CONSTEXPR20 Iterator2 uninitialized_copy(Iterator1 first, Iterator1 last, Iterator2 result)
复制元素到未初始化内存