🛰️航天仿真算法库 SpaceAST
0.3.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
:pointer_{ ptr }
69
{ }
70
ScopedPtr
()
71
:pointer_{
nullptr
}
72
{}
73
ScopedPtr
(std::nullptr_t)
74
:pointer_{
nullptr
}
75
{
76
}
78
ScopedPtr
(
ScopedPtr
&& other)
79
:pointer_{ other.pointer_ }
80
{
81
other.pointer_ =
nullptr
;
82
}
84
ScopedPtr
&
operator=
(
ScopedPtr
&& other)
85
{
86
std::swap(pointer_, other.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 = pointer_;
101
pointer_ = ptr;
102
this->_delete(oldPtr);
103
}
105
void
reset
()
106
{
107
this->reset(
nullptr
);
108
}
109
T
* get()
const
110
{
111
return
pointer_;
112
}
113
T* operator->()
const
{
return
pointer_;}
114
operator
T
*()
const
{
return
pointer_;}
115
118
T
*
release
()
119
{
120
T
* ptr = pointer_;
121
pointer_ =
nullptr
;
122
return
ptr;
123
}
124
private
:
125
ScopedPtr
(
const
ScopedPtr
&) =
delete
;
126
ScopedPtr
& operator =(
const
ScopedPtr
&) =
delete
;
127
void
_delete()
128
{
129
this->_delete(pointer_);
130
}
131
void
_delete(T* ptr)
132
{
133
if
(ptr)
134
ScopedPtrDeleter<T>::cleanup(ptr);
135
}
136
protected
:
137
T
* pointer_{
nullptr
};
138
};
139
140
AST_NAMESPACE_END
141
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::ScopedPtr::release
T * release()
释放绑定:取消对本指针所接管对象的所有权
定义
ScopedPtr.hpp:118
ast::ScopedPtr::reset
void reset()
释放所接管对象所有权并置空指针
定义
ScopedPtr.hpp:105
ast::units::T
Unit T
特斯拉
定义
Unit.cpp:492
ast::ScopedPtrDeleter
定义
ScopedPtr.hpp:32
src
AstUtil
RTTI
ScopedPtr.hpp
制作者
1.12.0