-
Notifications
You must be signed in to change notification settings - Fork 1
/
construct.h
42 lines (33 loc) · 1.28 KB
/
construct.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
#pragma once
#include <new> // placement new
#include "typeTraits.h"
namespace MiniSTL {
// 这里construct是用placement new,实际上是因为空间已经分配好了,只要在这个首地址上构造就行了
template <class T1, class T2>
inline void construct(T1 *p, T2 value) {
new (p) T1(value);
}
template <class T>
inline void destroy(T *p) {
p->~T();
}
// 设法利用traits批量析构对象
template <class ForwardIterator>
inline void destroy(ForwardIterator beg, ForwardIterator end) {
using is_POD_type = typename _type_traits<ForwardIterator>::is_POD_type;
_destroy_aux(beg, end, is_POD_type());
}
// 如果元素的value_type不存在non—trivial destructor
template <class ForwardIterator>
inline void _destroy_aux(ForwardIterator beg, ForwardIterator end,
_false_type) {
for (; beg != end; ++beg) destroy(&*beg); // 毕竟迭代器不是真正的地址
}
// 存在trivial destructor
// 如果对象的析构函数无关痛痒,那么反复调用它是一种效率上的巨大浪费
template <class ForwardIterator>
inline void _destroy_aux(ForwardIterator, ForwardIterator, _true_type) {}
// 针对char*、wchar_t*的特化
inline void destroy(char *, char *) {}
inline void destroy(wchar_t *, wchar_t *) {}
} // namespace MiniSTL