-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathTemplateSmartPtr.h
135 lines (124 loc) · 2.45 KB
/
TemplateSmartPtr.h
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/***************************************************************************
TemplateSmartPtr.h: header file
Header of smart ptr template class
****************************************************************************/
#ifndef TEMPLATESMARTPTR_H
#define TEMPLATESMARTPTR_H
#define bTEMPLATESMARTPTR_NOTOWNED false
template <typename TYPE> class CTemplateSmartPtrArray
{
public:
CTemplateSmartPtrArray()
{
m_pBuffer = NULL;/* For later construction*/;
m_bOwnObject = true;
}
CTemplateSmartPtrArray(IN const int nArrayLength)
{
m_bOwnObject = true;
InitBuffer(nArrayLength);
}
CTemplateSmartPtrArray(TYPE* pBuffer, IN const bool bOwned=true)
{
m_pBuffer = NULL;
Assign(pBuffer, bOwned);
}
virtual ~CTemplateSmartPtrArray()
{
// Auto-delete, but only if we own it!
if (m_pBuffer && m_bOwnObject)
{
delete [] m_pBuffer;
}
}
void InitBuffer(IN const int nArrayLength)
{
m_pBuffer = new TYPE[nArrayLength];
}
void Assign(TYPE* pBuffer, IN const bool bOwned=true)
{
if (m_pBuffer && m_bOwnObject)
{
delete []m_pBuffer;
}
m_pBuffer = pBuffer;
m_bOwnObject = bOwned;
}
TYPE* GetBuffer()
{
ASSERT(m_pBuffer);
return m_pBuffer;
}
bool IsNull()
{
return (m_pBuffer == NULL);
}
// Determine who gets to delete the buffer
void SetBufferOwnership(IN const bool bOwnObject)
{
m_bOwnObject = bOwnObject;
}
TYPE* m_pBuffer;
bool m_bOwnObject;
};
template <typename TYPE> class CTemplateSmartPtr
{
public:
CTemplateSmartPtr()
{
m_bOwnObject = true;
Init();
}
CTemplateSmartPtr(TYPE* pThing) // also permits NULL initialisation for later assigment
{
m_bOwnObject = true;
m_pThing = NULL;
Assign(pThing);
}
virtual ~CTemplateSmartPtr()
{
// Auto-delete, but only if we own it!
if (m_pThing && m_bOwnObject)
{
delete m_pThing;
}
}
void Init()
{
m_pThing = new TYPE;
}
void Assign(TYPE* pThing)
{
if (m_pThing)
{
delete m_pThing;
}
m_pThing = pThing;
}
void Detach()
{
// Stop the smart pointer managing the object
m_pThing = NULL;
}
bool IsNull()
{
return (m_pThing == NULL);
}
TYPE* GetPtr()
{
ASSERT(m_pThing);
return GetPtrSafe();
}
TYPE* GetPtrSafe()
{
// Don't assert. That's the only "safe" thing about it
return m_pThing;
}
void SetOwnObject(IN const bool bOwnObject)
{
m_bOwnObject = bOwnObject;
}
TYPE* m_pThing;
bool m_bOwnObject;
};
#endif