acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
cotaskptr.h
1#pragma once
2
3
4#include "acme/prototype/string/string.h"
5
6
7template < typename POINTER_TYPE >
8class cotaskptr
9{
10public:
11
12
13 POINTER_TYPE m_p;
14
15 cotaskptr()
16 {
17
18 m_p = nullptr;
19
20 }
21
22
23 ~cotaskptr()
24 {
25
26 free();
27
28 }
29
30 void alloc(SIZE_T size)
31 {
32
33 if (m_p != nullptr)
34 {
35
36 m_p = (POINTER_TYPE) CoTaskMemRealloc(m_p, size);
37
38 }
39 else
40 {
41
42 m_p = (POINTER_TYPE) CoTaskMemAlloc(size);
43
44 }
45
46 }
47
48 bool is_null() const
49 {
50
51 return m_p == nullptr;
52
53 }
54
55 bool is_set() const
56 {
57
58 return m_p != nullptr;
59
60 }
61
62 void free()
63 {
64
65 if (m_p != nullptr)
66 {
67
68 ::CoTaskMemFree(m_p);
69
70 m_p = nullptr;
71
72 }
73
74 }
75
76
77 operator POINTER_TYPE()
78 {
79
80 return m_p;
81
82 }
83
84 operator const POINTER_TYPE() const
85 {
86
87 return m_p;
88
89 }
90
91
92 POINTER_TYPE operator ->()
93 {
94
95 return m_p;
96
97 }
98
99
100 const POINTER_TYPE operator ->() const
101 {
102
103 return m_p;
104
105 }
106
107 POINTER_TYPE * operator &()
108 {
109
110 free();
111
112 return &m_p;
113
114 }
115
116 const POINTER_TYPE * operator &() const
117 {
118
119 return &m_p;
120
121 }
122
123
124};
125
126
127template < typename POINTER_TYPE >
128class sec_cotaskptr :
129 public cotaskptr < POINTER_TYPE >
130{
131public:
132
133
134 DWORD m_size;
135
136
137 sec_cotaskptr(DWORD size = 0)
138 {
139
140 m_size = size;
141
142 }
143
144
145 ~sec_cotaskptr()
146 {
147
148 free();
149
150 }
151
152 using cotaskptr < POINTER_TYPE > ::alloc;
153 void alloc()
154 {
155
156 alloc(m_size);
157
158 }
159
160 void free()
161 {
162
163 if (this->m_p != nullptr)
164 {
165
166 if (m_size > 0)
167 {
168
169 SecureZeroMemory(this->m_p, m_size);
170
171 m_size = 0;
172
173 }
174
175 ::cotaskptr < POINTER_TYPE > ::free();
176
177 }
178
179 }
180
181};
182
183
184
185
186
187
188#define cotaskp(POINTER_TYPE) cotaskptr < POINTER_TYPE >
189
190
191
192 template < typename POINTER_TYPE >
193 inline auto as_string(const cotaskptr < POINTER_TYPE >& ptr)
194 {
195
196 return ::as_string((const POINTER_TYPE)ptr);
197
198 }
199
200
201
202 //namespace str
203 //{
204 //
205
206 inline ansi_string& assign(ansi_string& ansistrDst, const cotaskptr < PWSTR >& pwidesz)
207 {
208
209 ansistrDst.assign(pwidesz.operator const PWSTR());
210
211 return ansistrDst;
212
213 }
214
215
216 inline wide_string& assign(wide_string& widestrDst, const cotaskptr < PSTR >& pansisz)
217 {
218
219 widestrDst.assign(pansisz.operator const PSTR());
220
221 return widestrDst;
222
223 }
224
225
226 inline ansi_string& assign(ansi_string& ansistrDst, const cotaskptr < PSTR >& pansisz)
227 {
228
229 ansistrDst.assign(pansisz.operator const PSTR());
230
231 return ansistrDst;
232
233 }
234
235
236 inline wide_string& assign(wide_string& widestrDst, const cotaskptr < PWSTR >& pwidesz)
237 {
238
239 widestrDst.assign(pwidesz.operator const PWSTR());
240
241 return widestrDst;
242
243 }
244 //
245 //
246 //} // namespace str
247
248
249
Definition ptr.h:18