-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathArxClosePointer.hpp
63 lines (49 loc) · 1.46 KB
/
ArxClosePointer.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#ifndef ARXCLOSEPOINTER_HPP
#define ARXCLOSEPOINTER_HPP
namespace sstd {
/**
class AcDbSymbolTablePointer;
class AcDbSymbolTableRecordPointer;
**/
template<typename T>
class ArxClosePointer {
T * $pointer;
inline void _p_close() {
if ($pointer) {
if ($pointer->objectId().isNull()) {
delete $pointer;
}
else {
$pointer->close();
}
}
}
public:
ArxClosePointer() :$pointer(nullptr) {}
template<typename U>
inline ArxClosePointer(U *arg) : $pointer{ arg } {}
inline ~ArxClosePointer() { _p_close(); }
inline T * operator->()const { return $pointer; }
inline T * & operator ->() { return $pointer; }
inline operator T *&() { return $pointer; }
inline operator T * ()const { return $pointer; }
inline T* pointer() const { return $pointer; }
inline T*&pointer() { return $pointer; }
inline operator bool() const { return bool($pointer); }
ArxClosePointer(const ArxClosePointer &) = delete;
ArxClosePointer&operator=(const ArxClosePointer &) = delete;
inline ArxClosePointer(ArxClosePointer && arg)
:$pointer(arg.$pointer) {
arg.$pointer = nullptr;
}
inline ArxClosePointer&operator=(ArxClosePointer && arg) {
if (this == &arg) { return *this; }
ArxClosePointer varTmp;
std::swap(varTmp.$pointer, arg.$pointer);
std::swap(this->$pointer, varTmp.$pointer);
return *this;
}
inline void close() { _p_close(); $pointer = nullptr; }
};
}/*namespace sstd*/
#endif // ARXCLOSEPOINTER_HPP