acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
holder.h
1// Created by camilo on 2021-01-16 03:42 BRT <3ThomasBorregaardSorensen!!
2#pragma once
3
4
5template < typename TYPE >
6void destroy_pointer(TYPE * p)
7{
8
9 delete p;
10 //cairo_surface_destroy(p);
11
12}
13template < typename TYPE >
14TYPE * copy_pointer(const TYPE * p)
15{
16
17 return new TYPE(*p);
18
19}
20
21
22template < typename TYPE >
23class holder
24{
25
26 TYPE * m_p;
27
28public:
29
30
31
32 holder() :
33 m_p(nullptr)
34 {
35
36 }
37
38
39 holder(TYPE * p) :
40 m_p(p)
41 {
42
43 }
44
45 holder(const holder & holder)
46 {
47
48 m_p = copy_pointer(holder.m_p);
49
50 }
51
52 holder(holder&& holder) :
53 m_p(holder.m_p)
54 {
55
56 holder.m_p = nullptr;
57
58 }
59
60 ~holder()
61 {
62
63 destroy();
64
65 }
66
67
68 void destroy()
69 {
70
71 if (m_p)
72 {
73
74 destroy_pointer(m_p);
75
76 m_p = nullptr;
77
78 }
79
80 }
81
82
83 holder& operator = (TYPE * p)
84 {
85
86 if (m_p != p)
87 {
88
89 destroy();
90
91 m_p = p;
92
93 }
94
95 return *this;
96
97 }
98
99 holder& operator = (holder && holder)
100 {
101
102 if (m_p != holder.m_p)
103 {
104
105 m_p = holder.m_p;
106
107 holder.m_p = nullptr;
108
109 }
110
111 return *this;
112
113 }
114
115 holder & operator = (const holder & holder)
116 {
117
118 destroy();
119
120 m_p = copy_pointer(holder.m_p);
121
122 return *this;
123
124 }
125
126 operator TYPE *() { return m_p; }
127
128 operator const TYPE * () const { return m_p; }
129
130 TYPE * operator -> () { return m_p; }
131
132 const TYPE * operator -> () const { return m_p; }
133
134 TYPE & operator *() { return *m_p; }
135
136 const TYPE & operator *() const { return *m_p; }
137
138};
139
140
141template < typename TYPE >
142holder < TYPE > hold(TYPE * p)
143{
144
145 return {p};
146
147}
148
149//using cairo_surface_holder = pointer_holder < cairo_surface_t* >;
150
151
152
153//template < typename TYPE >
154//class heap_object
155//{
156// TYPE m_p;
157//
158//
159//public:
160//
161// heap_object(nullptr_t)
162// {
163// m_p = nullptr;
164// }
165//
166// heap_object()
167// {
168// m_p = new TYPE;
169// }
170//
171//
172// heap_object(TYPE * p)
173// {
174//
175// m_p = p;
176//
177// }
178//
179// heap_object(const heap_object & object)
180// {
181//
182// m_p = new heap_object(object);
183//
184// }
185//
186//
187// heap_object(heap_object && object) :
188// m_p(object.m_p)
189// {
190//
191// object.m_p = nullptr;
192//
193// }
194//
195// ~heap_object()
196// {
197//
198// destroy();
199//
200// }
201//
202//
203// void destroy()
204// {
205//
206// if (m_p)
207// {
208//
209// delete m_p;
210//
211// m_p = nullptr;
212//
213// }
214//
215// }
216//
217//
218// heap_object & operator = (TYPE * p)
219// {
220//
221// if (m_p != p)
222// {
223//
224// destroy();
225//
226// m_p = p;
227//
228// }
229//
230// return *this;
231//
232// }
233//
234// heap_object & operator = (heap_object && object)
235// {
236//
237// if (m_p != holder.m_p)
238// {
239//
240// m_p = holder.m_p;
241//
242// holder.m_p = nullptr;
243//
244// }
245//
246// return *this;
247//
248// }
249//
250// operator TYPE *() { return m_p; }
251//
252//};
253//
254//
255//
256
257//
258//template < typename TYPE >
259//class pointer_object
260//{
261//
262// TYPE * m_p;
263//
264//public:
265//
266//
267// pointer_object() :
268// m_p(nullptr)
269// {
270//
271// }
272//
273//
274// pointer_object(TYPE * p) :
275// m_p(p)
276// {
277//
278// }
279//
280// pointer_object(const pointer_object & pointerobject)
281// {
282//
283// m_p = copy_pointer(pointerobject.m_p);
284//
285// }
286//
287// pointer_object(pointer_object && pointerobject) :
288// m_p(pointerobject.m_p)
289// {
290//
291// pointerobject.m_p = nullptr;
292//
293// }
294//
295// ~pointer_object()
296// {
297//
298// destroy();
299//
300// }
301//
302//
303// void destroy()
304// {
305//
306// if (m_p)
307// {
308//
309// destroy_pointer(m_p);
310//
311// m_p = nullptr;
312//
313// }
314//
315// }
316//
317//
318// pointer_object & operator = (TYPE * p)
319// {
320//
321// if (m_p != p)
322// {
323//
324// destroy();
325//
326// m_p = p;
327//
328// }
329//
330// return *this;
331//
332// }
333//
334// pointer_object & operator = (pointer_object && pointerobject)
335// {
336//
337// if (m_p != pointerobject.m_p)
338// {
339//
340// m_p = pointerobject.m_p;
341//
342// pointerobject.m_p = nullptr;
343//
344// }
345//
346// return *this;
347//
348// }
349//
350// pointer_object & operator = (const pointer_object & pointerobject)
351// {
352//
353// destroy();
354//
355// m_p = copy_pointer(pointerobject.m_p);
356//
357// return *this;
358//
359// }
360//
361// operator TYPE & () { return *m_p; }
362//
363// operator const TYPE & () const { return *m_p; }
364//
365//};
366
367
368//using cairo_surface_holder = pointer_holder < cairo_surface_t* >;
369
370
371
372//template < typename TYPE >
373//class heap_object
374//{
375// TYPE m_p;
376//
377//
378//public:
379//
380// heap_object(nullptr_t)
381// {
382// m_p = nullptr;
383// }
384//
385// heap_object()
386// {
387// m_p = new TYPE;
388// }
389//
390//
391// heap_object(TYPE * p)
392// {
393//
394// m_p = p;
395//
396// }
397//
398// heap_object(const heap_object & object)
399// {
400//
401// m_p = new heap_object(object);
402//
403// }
404//
405//
406// heap_object(heap_object && object) :
407// m_p(object.m_p)
408// {
409//
410// object.m_p = nullptr;
411//
412// }
413//
414// ~heap_object()
415// {
416//
417// destroy();
418//
419// }
420//
421//
422// void destroy()
423// {
424//
425// if (m_p)
426// {
427//
428// delete m_p;
429//
430// m_p = nullptr;
431//
432// }
433//
434// }
435//
436//
437// heap_object & operator = (TYPE * p)
438// {
439//
440// if (m_p != p)
441// {
442//
443// destroy();
444//
445// m_p = p;
446//
447// }
448//
449// return *this;
450//
451// }
452//
453// heap_object & operator = (heap_object && object)
454// {
455//
456// if (m_p != holder.m_p)
457// {
458//
459// m_p = holder.m_p;
460//
461// holder.m_p = nullptr;
462//
463// }
464//
465// return *this;
466//
467// }
468//
469// operator TYPE *() { return m_p; }
470//
471//};
472//
473//
474//