-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathml_uninitialized.h
157 lines (118 loc) · 3.89 KB
/
ml_uninitialized.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/**
* @file ml_uninitialized.h
* @brief
* @author malin [email protected]
* @date 2015年04月02日 星期四 14时27分38秒
* @version
* @note
*/
#ifndef __ML_INTERNAL_UNINITIALIZED_H
#define __ML_INTERNAL_UNINITIALIZED_H
#include <cstring>
#include "ml_config.h"
#include "type_traits.h"
#include "ml_algobase.h"
#include "ml_iterator_base.h"
__ML_BEGIN_NAMESPACE
// definition for uninitialized_copy
template<typename InputIterator, typename ForwardIterator>
inline ForwardIterator __uninitialized_copy_aux(InputIterator first, InputIterator last, ForwardIterator dest, __false_type)
{
ForwardIterator cur = dest;
__ML_TRY
{
while (first != last)
{
constructor(&*cur, *first); ++first; ++cur;
}
}
__ML_UNWIND(destroy(dest, cur))
return dest;
}
template<typename InputIterator, typename ForwardIterator>
inline ForwardIterator __uninitialized_copy_aux(InputIterator first, InputIterator last, ForwardIterator dest, __true_type)
{
return copy(first, last, dest);
}
template<typename InputIterator, typename ForwardIterator, typename T>
inline ForwardIterator __uninitialized_copy(InputIterator first, InputIterator last, ForwardIterator dest, T*)
{
typedef typename __type_traits<T>::is_POD_type is_POD;
return __uninitialized_copy_aux(first, last, dest, is_POD());
}
template<typename InputIterator, typename ForwardIterator>
inline ForwardIterator uninitialized_copy(InputIterator first, InputIterator last, ForwardIterator dest)
{
return __uninitialized_copy(first, last, dest, value_type(dest));
}
///< @todo why just partial specialist for char?
inline char *uninitialized_copy(char *first, char *last, char *dest)
{
memmove(dest, first, last - first);
return dest + (last - first);
}
// end of definition for uninitialized_copy
// definition for uninitialized_fill
template<typename ForwardIterator, typename T>
inline void __uninitialized_fill_aux(ForwardIterator first, ForwardIterator last, const T &x, __false_type)
{
ForwardIterator cur = first;
__ML_TRY
{
while (cur != last)
{
constructor(&*cur, x); ++cur;
}
}
__ML_UNWIND(destroy(first, cur));
}
template<typename ForwardIterator, typename T>
inline void __uninitialized_fill_aux(ForwardIterator first, ForwardIterator last, const T &x, __true_type)
{
fill(first, last, x);
}
template<typename ForwardIterator, typename T1, typename T2>
inline void __uninitialized_fill(ForwardIterator first, ForwardIterator last, const T1 &x, T2*)
{
typedef typename __type_traits<T1>::is_POD_type is_POD;
__uninitialized_fill_aux(first, last, x, is_POD());
}
template<typename ForwardIterator, typename T>
inline void uninitialized_fill(ForwardIterator first, ForwardIterator last, const T &x)
{
__uninitialized_fill(first, last, x, value_type(first));
}
// end of definition for uninitialized_fill
// definition for uninitialized_fill_n
template<typename ForwardIterator, typename Size, typename T>
inline ForwardIterator __uninitialized_fill_n_aux(ForwardIterator first, Size n, const T &x, __false_type)
{
ForwardIterator cur = first;
__ML_TRY
{
while (n-- > 0)
{
constructor(&*cur, x); ++cur;
}
}
__ML_UNWIND(destroy(first, cur));
return cur;
}
template<typename ForwardIterator, typename Size, typename T>
inline ForwardIterator __uninitialized_fill_n_aux(ForwardIterator first, Size n, const T &x, __true_type)
{
return fill_n(first, n, x);
}
template<typename ForwardIterator, typename Size, typename T1, typename T2>
inline ForwardIterator __uninitialized_fill_n(ForwardIterator first, Size n, const T1 &x, T2*)
{
typedef typename __type_traits<T2>::is_POD_type is_POD;
return __uninitialized_fill_n_aux(first, n, x, is_POD());
}
template<typename ForwardIterator, typename Size, typename T>
inline ForwardIterator uninitialized_fill_n(ForwardIterator first, Size n, const T &x)
{
return __uninitialized_fill_n(first, n, x, value_type(first));
}
__ML_END_NAMESPACE
#endif // __ML_INTERNAL_UNINITIALIZED_H