acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
auto_pointer.h
1#pragma once
2
3
4#include "acme/memory/del.h"
5
6struct create_new_t {};
7
8enum e_new_array
9{
10 new_array,
11
12};
13
14template < typename T >
15class auto_pointer
16{
17public:
18
19 T * m_p;
20 //bool m_bArray;
21
22 auto_pointer()
23 {
24
25 m_p = nullptr;
26 //m_bArray = false;
27
28 }
29 auto_pointer(create_new_t)
30 {
31
32 m_p = øraw_new T;
33 //m_bArray = false;
34
35 }
36
37 //auto_pointer(e_new_array, ::collection::count c)
38 //{
39 // m_bArray = true;
40 // m_p = allocateø< T[ >(size_t) c];
41
42 //}
43
44 //auto_pointer(e_new_array, T * p)
45 //{
46 // m_bArray = true;
47 // m_p = p;
48
49 //}
50
51
52 //template < typename TYPE >
53 //auto_pointer(TYPE * p, ::collection::count c)
54 //{
55 //
56 // m_bArray = true;
57
58 // m_p = allocateø< T[ >(size_t)c];
59
60 // for (::collection::index i = 0; i < c; i++)
61 // {
62 //
63 // ::copy(&m_p[(size_t)i], &p[(size_t) i]);
64
65 // }
66
67 //}
68
69
70 //template < typename TYPE, typename COPY >
71 //auto_pointer(TYPE * p, ::collection::count c, COPY copy)
72 //{
73
74 // m_bArray = true;
75
76 // m_p = allocateø< T[ >(size_t)c];
77
78 // for (::collection::index i = 0; i < c; i++)
79 // {
80
81 // copy(&m_p[(size_t)i], &p[(size_t)i]);
82
83 // }
84
85 //}
86
87
88 auto_pointer(T * p)
89 {
90
91 m_p = p;
92 //m_bArray = false;
93
94 }
95
96
97 auto_pointer(const auto_pointer & op)
98 {
99
100 m_p = op.m_p;
101 //m_bArray = op.m_bArray;
102
103 }
104
105
106 auto_pointer(auto_pointer && op)
107 {
108
109 m_p = op.m_p;
110 //m_bArray = op.m_bArray;
111 op.m_p = nullptr;
112
113
114 }
115
116
117 ~auto_pointer()
118 {
119
120 destroy();
121
122 }
123
124 //void create_array(::collection::count c)
125 //{
126 //
127 // destroy();
128 //
129 // m_bArray = true;
130 // m_p = allocateø< T[ >(size_t)c];
131
132 //}
133
134
135 void destroy()
136 {
137
138 //if (m_bArray)
139 //{
140
141 // if (m_p)
142 // {
143
144 // delete[] m_p;
145
146 // m_p = NULL;
147
148 // }
149
150 //}
151 //else
152 {
153
154 ::acme::del(m_p);
155
156 }
157
158 }
159
160
161 T * detach()
162 {
163
164 T * p = m_p;
165
166 m_p = nullptr;
167
168 return p;
169
170 }
171
172
173 T * release()
174 {
175
176 return detach();
177
178 }
179
180
181 T * get()
182 {
183
184 return m_p;
185
186 }
187
188
189 T * get() const
190 {
191
192 return m_p;
193
194 }
195
196 operator T *()
197 {
198
199 return m_p;
200
201 }
202
203
204 operator T *() const
205 {
206
207 return m_p;
208
209 }
210
211
212 T & operator *()
213 {
214
215 return*m_p;
216
217 }
218
219
220 const T & operator *() const
221 {
222
223 return*m_p;
224
225 }
226
227 void reset(T * p)
228 {
229
230 if (p == m_p)
231 {
232
233 return;
234
235 }
236
237 destroy();
238
239 m_p = p;
240
241 }
242
243
244 auto_pointer & operator = (T * p)
245 {
246
247 reset(p);
248
249 return *this;
250
251 }
252
253 auto_pointer & operator = (const auto_pointer & op)
254 {
255
256 reset(op.m_p);
257
258 return *this;
259
260 }
261
262
263 auto_pointer & operator = (auto_pointer && op)
264 {
265
266 if (op.m_p == m_p)
267 {
268
269 return *this;
270
271 }
272
273 destroy();
274
275 m_p = op.m_p;
276
277 op.m_p = nullptr;
278
279 return *this;
280
281 }
282
283
284 T * operator ->()
285 {
286
287 return m_p;
288
289 }
290
291
292 const T * operator ->() const
293 {
294
295 return m_p;
296
297 }
298
299 template < typename TYPE >
300 bool is()
301 {
302
303 return dynamic_cast < TYPE * > ((T *) this);
304
305 }
306
307};
308
312//#define __AP(x) ::auto_pointer < x >
313//#define ap(x) __AP(x)
314
315
316template <typename T>
317inline auto as_auto_pointer(T* p)
318{
319
320 return auto_pointer < T >(p);
321
322}
323
324
325
Definition auto_pointer.h:6