🛰️航天仿真算法库 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
27AST_NAMESPACE_BEGIN
28
29
30template<typename T, typename = void>
32{
33 static void cleanup(T* ptr)
34 {
35 delete ptr;
36 }
37};
38
39template<typename T>
40struct 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
48template<>
49struct ScopedPtrDeleter<std::FILE>
50{
51 static void cleanup(std::FILE* ptr)
52 {
53 fclose(ptr);
54 }
55};
56
63template<typename T>
65{
66public:
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 }
79 :m_pointer{ other.m_pointer }
80 {
81 other.m_pointer = nullptr;
82 }
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 }
116private:
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 }
128protected:
129 T* m_pointer{nullptr};
130};
131
132AST_NAMESPACE_END
133
作用域指针类
定义 ScopedPtr.hpp:65
ScopedPtr(ScopedPtr &&other)
移动构造函数
定义 ScopedPtr.hpp:78
ScopedPtr & operator=(ScopedPtr &&other)
移动赋值运算符
定义 ScopedPtr.hpp:84
定义 ScopedPtr.hpp:32