🛰️航天仿真算法库 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
57template<typename T>
59{
60public:
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 }
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 }
98private:
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)
109 }
110protected:
111 T* m_pointer{nullptr};
112};
113
114AST_NAMESPACE_END
115
定义 ScopedPtr.hpp:59
定义 ScopedPtr.hpp:32