🛰️航天仿真算法库 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
57
template
<
typename
T>
58
class
ScopedPtr
59
{
60
public
:
61
ScopedPtr
(T* ptr)
62
:m_pointer{ ptr }
63
{ }
64
ScopedPtr
()
65
:m_pointer{
nullptr
}
66
{}
67
ScopedPtr
(std::nullptr_t)
68
:m_pointer{
nullptr
}
69
{
70
}
71
ScopedPtr
& operator=(T* ptr)
72
{
73
this->reset(ptr);
74
return
*
this
;
75
}
76
~ScopedPtr
()
77
{
78
this->_delete();
79
}
80
void
reset(T* ptr)
81
{
82
auto
oldPtr = m_pointer;
83
m_pointer = ptr;
84
this->_delete(oldPtr);
85
}
86
T* get()
const
87
{
88
return
m_pointer;
89
}
90
T* operator->()
const
{
return
m_pointer;}
91
operator
T*()
const
{
return
m_pointer;}
92
T* release()
93
{
94
T* ptr = m_pointer;
95
m_pointer =
nullptr
;
96
return
ptr;
97
}
98
private
:
99
ScopedPtr
(
const
ScopedPtr
&) =
delete
;
100
ScopedPtr
& operator =(
const
ScopedPtr
&) =
delete
;
101
void
_delete()
102
{
103
this->_delete(m_pointer);
104
}
105
void
_delete(T* ptr)
106
{
107
if
(ptr)
108
ScopedPtrDeleter<T>::cleanup
(ptr);
109
}
110
protected
:
111
T* m_pointer{
nullptr
};
112
};
113
114
AST_NAMESPACE_END
115
ast::ScopedPtr
定义
ScopedPtr.hpp:59
ast::ScopedPtrDeleter
定义
ScopedPtr.hpp:32
src
AstUtil
RTTI
ScopedPtr.hpp
制作者
1.12.0