🛰️航天仿真算法库 SpaceAST
0.0.1
载入中...
搜索中...
未找到
ScopedPtr.hpp
浏览该文件的文档.
1
20
21
#pragma once
22
23
#include "AstGlobal.h"
24
#include <type_traits>
// for std::enable_if
25
#include <cstdio>
26
27
AST_NAMESPACE_BEGIN
28
29
30
template
<
typename
T,
typename
=
void
>
31
struct
ScopedPtrDeleter
32
{
33
static
void
cleanup(T* ptr)
34
{
35
delete
ptr;
36
}
37
};
38
39
template
<
typename
T>
40
struct
ScopedPtrDeleter
<T, typename std::enable_if<std::is_base_of<Object, T>::value>::type>
41
{
42
static
void
cleanup(T* ptr)
43
{
44
ptr->destruct();
45
}
46
};
47
48
template
<>
49
struct
ScopedPtrDeleter
<std::FILE>
50
{
51
static
void
cleanup(std::FILE* ptr)
52
{
53
fclose(ptr);
54
}
55
};
56
63
template
<
typename
T>
64
class
ScopedPtr
65
{
66
public
:
67
ScopedPtr
(T* ptr)
68
:m_pointer{ ptr }
69
{ }
70
ScopedPtr
()
71
:m_pointer{
nullptr
}
72
{}
73
ScopedPtr
(std::nullptr_t)
74
:m_pointer{
nullptr
}
75
{
76
}
78
ScopedPtr
(
ScopedPtr
&& other)
79
:m_pointer{ other.m_pointer }
80
{
81
other.m_pointer =
nullptr
;
82
}
84
ScopedPtr
&
operator=
(
ScopedPtr
&& other)
85
{
86
std::swap(m_pointer, other.m_pointer);
87
return
*
this
;
88
}
89
ScopedPtr
& operator=(T* ptr)
90
{
91
this->reset(ptr);
92
return
*
this
;
93
}
94
~ScopedPtr()
95
{
96
this->_delete();
97
}
98
void
reset(T* ptr)
99
{
100
auto
oldPtr = m_pointer;
101
m_pointer = ptr;
102
this->_delete(oldPtr);
103
}
104
T* get()
const
105
{
106
return
m_pointer;
107
}
108
T* operator->()
const
{
return
m_pointer;}
109
operator
T*()
const
{
return
m_pointer;}
110
T* release()
111
{
112
T* ptr = m_pointer;
113
m_pointer =
nullptr
;
114
return
ptr;
115
}
116
private
:
117
ScopedPtr(
const
ScopedPtr&) =
delete
;
118
ScopedPtr& operator =(
const
ScopedPtr&) =
delete
;
119
void
_delete()
120
{
121
this->_delete(m_pointer);
122
}
123
void
_delete(T* ptr)
124
{
125
if
(ptr)
126
ScopedPtrDeleter<T>::cleanup(ptr);
127
}
128
protected
:
129
T* m_pointer{
nullptr
};
130
};
131
132
AST_NAMESPACE_END
133
ast::ScopedPtr
作用域指针类
定义
ScopedPtr.hpp:65
ast::ScopedPtr::ScopedPtr
ScopedPtr(ScopedPtr &&other)
移动构造函数
定义
ScopedPtr.hpp:78
ast::ScopedPtr::operator=
ScopedPtr & operator=(ScopedPtr &&other)
移动赋值运算符
定义
ScopedPtr.hpp:84
ast::ScopedPtrDeleter
定义
ScopedPtr.hpp:32
src
AstUtil
RTTI
ScopedPtr.hpp
制作者
1.12.0