]>
Commit | Line | Data |
---|---|---|
1 | ///////////////////////////////////////////////////////////////////////////// | |
2 | // Name: buffer.h | |
3 | // Purpose: interface of wxMemoryBuffer | |
4 | // Author: wxWidgets team | |
5 | // RCS-ID: $Id$ | |
6 | // Licence: wxWindows licence | |
7 | ///////////////////////////////////////////////////////////////////////////// | |
8 | ||
9 | ||
10 | /** | |
11 | wxScopedCharTypeBuffer<T> is a template class for storing characters. | |
12 | ||
13 | Data are stored in reference-counted buffer. In other words, making a copy | |
14 | of wxScopedCharTypeBuffer<T> will @em not make another copy of the stored | |
15 | string data, it will still point to the same location in memory. | |
16 | ||
17 | wxScopedCharTypeBuffer<T> supports two storage modes: owned and non-owned. | |
18 | "Owned" data buffer (created with CreateOwned() or wxCharTypeBuffer<T> | |
19 | derived class) owns the data and frees them when the last buffer pointing | |
20 | to them is destroyed. | |
21 | ||
22 | "Non-owned" buffer (created with CreateNonOwned()), on the other hand, | |
23 | references data owned by somebody else -- typical use is by | |
24 | wxString::mb_str() or wxString::wc_str(), which may return non-owned buffer | |
25 | pointing to wxString's internal store. | |
26 | ||
27 | Because of this, the validity of data stored in wxScopedCharTypeBuffer<T> | |
28 | is limited by the lifetime of the "parent" object that created the | |
29 | buffer (e.g. the wxString on which mb_str() was called). | |
30 | ||
31 | If you need to preserve the data for longer, assign it to | |
32 | wxCharTypeBuffer<T> instead of wxScopedCharTypeBuffer<T>. On the other | |
33 | hand, use wxScopedCharTypeBuffer<T> if the buffer is to be destroyed before | |
34 | the "parent" object -- typical use would be creating it on the stack and | |
35 | destroying when it goes out of scope (hence the class' name). | |
36 | ||
37 | @tparam T | |
38 | The type of the characters stored in this class. | |
39 | ||
40 | @since 2.9.0 | |
41 | ||
42 | @nolibrary | |
43 | @category{data} | |
44 | */ | |
45 | template <typename T> | |
46 | class wxScopedCharTypeBuffer | |
47 | { | |
48 | public: | |
49 | /// Stored characters type. | |
50 | typedef T CharType; | |
51 | ||
52 | /// Default constructor, creates NULL buffer. | |
53 | wxScopedCharTypeBuffer(); | |
54 | ||
55 | /** | |
56 | Creates non-owned buffer from string data @a str. | |
57 | ||
58 | The buffer's destructor will not destroy @a str. The returned buffer's | |
59 | data is valid only as long as @a str is valid. | |
60 | ||
61 | @param str String data. | |
62 | @param len If specified, length of the string, otherwise the string | |
63 | is considered to be NUL-terminated. | |
64 | */ | |
65 | static const wxScopedCharTypeBuffer CreateNonOwned(const CharType *str, size_t len = wxNO_LEN); | |
66 | ||
67 | /** | |
68 | Creates owned buffer from @a str and takes ownership of it. | |
69 | ||
70 | The buffer's destructor will free @a str when its reference count | |
71 | reaches zero (initial count is 1). | |
72 | ||
73 | @param str String data. | |
74 | @param len If specified, length of the string, otherwise the string | |
75 | is considered to be NUL-terminated. | |
76 | */ | |
77 | static const wxScopedCharTypeBuffer CreateOwned(CharType *str, size_t len = wxNO_LEN); | |
78 | ||
79 | /** | |
80 | Copy constructor. | |
81 | ||
82 | Increases reference count on the data, does @em not make wxStrdup() | |
83 | copy of the data. | |
84 | */ | |
85 | wxScopedCharTypeBuffer(const wxScopedCharTypeBuffer& src); | |
86 | ||
87 | /// Assignment operator behaves in the same way as the copy constructor. | |
88 | wxScopedCharTypeBuffer& operator=(const wxScopedCharTypeBuffer& src); | |
89 | ||
90 | /** | |
91 | Destructor. Frees stored data if it is in "owned" mode and data's | |
92 | reference count reaches zero. | |
93 | */ | |
94 | ~wxScopedCharTypeBuffer(); | |
95 | ||
96 | /// Resets the buffer to NULL, freeing the data if necessary. | |
97 | void reset(); | |
98 | ||
99 | /// Returns pointer to the stored data. | |
100 | CharType *data(); | |
101 | ||
102 | /// Returns const pointer to the stored data. | |
103 | const CharType *data() const; | |
104 | ||
105 | /// Returns length of the string stored. | |
106 | size_t length() const; | |
107 | ||
108 | /// Implicit conversion to C string. | |
109 | operator const CharType *() const; | |
110 | ||
111 | /// Random access to the stored C string. | |
112 | CharType operator[](size_t n) const; | |
113 | }; | |
114 | ||
115 | /// Scoped char buffer. | |
116 | typedef wxScopedCharTypeBuffer<char> wxScopedCharBuffer; | |
117 | ||
118 | /// Scoped wchar_t buffer. | |
119 | typedef wxScopedCharTypeBuffer<wchar_t> wxScopedWCharBuffer; | |
120 | ||
121 | /** | |
122 | wxCharTypeBuffer<T> is a template class for storing characters. | |
123 | ||
124 | The difference from wxScopedCharTypeBuffer<T> is that this class | |
125 | doesn't have non-owned mode and the data stored in it are valid for | |
126 | as long as the buffer instance exists. Other than that, this class' | |
127 | behaviour is the same as wxScopedCharTypeBuffer<T>'s -- in particular, | |
128 | the data are reference-counted and copying the buffer is cheap. | |
129 | ||
130 | wxScopedCharTypeBuffer<T> buffers can be converted into wxCharTypeBuffer<T>. | |
131 | ||
132 | @tparam T | |
133 | The type of the characters stored in this class. | |
134 | ||
135 | @since 2.9.0 | |
136 | ||
137 | @nolibrary | |
138 | @category{data} | |
139 | */ | |
140 | template <typename T> | |
141 | class wxCharTypeBuffer : public wxScopedCharTypeBuffer<T> | |
142 | { | |
143 | public: | |
144 | /** | |
145 | Creates (owned) buffer from @a str and takes ownership of it. | |
146 | ||
147 | @param str String data. | |
148 | @param len If specified, length of the string, otherwise the string | |
149 | is considered to be NUL-terminated. | |
150 | ||
151 | @see wxScopedCharTypeBuffer<T>::CreateOwned() | |
152 | */ | |
153 | wxCharTypeBuffer(const CharType *str = NULL, size_t len = wxNO_LEN); | |
154 | ||
155 | ||
156 | /** | |
157 | Creates (owned) buffer of size @a len. | |
158 | ||
159 | @see wxScopedCharTypeBuffer<T>::CreateOwned() | |
160 | */ | |
161 | wxCharTypeBuffer(size_t len); | |
162 | ||
163 | /** | |
164 | Copy constructor. | |
165 | ||
166 | Increases reference count on the data, does @em not make wxStrdup() | |
167 | copy of the data. | |
168 | */ | |
169 | wxCharTypeBuffer(const wxCharTypeBuffer& src); | |
170 | ||
171 | /** | |
172 | Makes a copy of scoped buffer @a src. | |
173 | ||
174 | If @a src is a non-owned buffer, a copy of its data is made using | |
175 | wxStrdup(). If @a src is an owned buffer, this constructor behaves | |
176 | in the usual way (reference count on buffer data is incremented). | |
177 | */ | |
178 | wxCharTypeBuffer(const wxScopedCharTypeBuffer<T>& src); | |
179 | ||
180 | /** | |
181 | Assigns @a str to this buffer and takes ownership of it (i.e. the | |
182 | buffer becomes "owned"). | |
183 | */ | |
184 | wxCharTypeBuffer& operator=(const CharType *str); | |
185 | ||
186 | /// Assignment operator behaves in the same way as the copy constructor. | |
187 | wxCharTypeBuffer& operator=(const wxCharTypeBuffer& src); | |
188 | ||
189 | /** | |
190 | Assigns a scoped buffer to this buffer. | |
191 | ||
192 | If @a src is a non-owned buffer, a copy of its data is made using | |
193 | wxStrdup(). If @a src is an owned buffer, the assignment behaves | |
194 | in the usual way (reference count on buffer data is incremented). | |
195 | */ | |
196 | wxCharTypeBuffer& operator=(const wxScopedCharTypeBuffer<T>& src); | |
197 | ||
198 | /** | |
199 | Extends the buffer to have size @a len. | |
200 | ||
201 | Can only be called on buffers that don't share data with another | |
202 | buffer (i.e. reference count of the data is 1). | |
203 | ||
204 | @see shrink() | |
205 | */ | |
206 | bool extend(size_t len); | |
207 | ||
208 | /** | |
209 | Shrinks the buffer to have size @a len and NUL-terminates the string | |
210 | at this length. | |
211 | ||
212 | Can only be called on buffers that don't share data with another | |
213 | buffer (i.e. reference count of the data is 1). | |
214 | ||
215 | @param len Length to shrink to. Must not be larger than current length. | |
216 | ||
217 | @note The string is not reallocated to take less memory. | |
218 | ||
219 | @since 2.9.0 | |
220 | ||
221 | @see extend() | |
222 | */ | |
223 | bool shrink(size_t len); | |
224 | }; | |
225 | ||
226 | /** | |
227 | This is a specialization of wxCharTypeBuffer<T> for @c char type. | |
228 | ||
229 | @nolibrary | |
230 | @category{data} | |
231 | */ | |
232 | class wxCharBuffer : public wxCharTypeBuffer<char> | |
233 | { | |
234 | public: | |
235 | typedef wxCharTypeBuffer<char> wxCharTypeBufferBase; | |
236 | typedef wxScopedCharTypeBuffer<char> wxScopedCharTypeBufferBase; | |
237 | ||
238 | wxCharBuffer(const wxCharTypeBufferBase& buf); | |
239 | wxCharBuffer(const wxScopedCharTypeBufferBase& buf); | |
240 | wxCharBuffer(const CharType *str = NULL); | |
241 | wxCharBuffer(size_t len); | |
242 | wxCharBuffer(const wxCStrData& cstr); | |
243 | }; | |
244 | ||
245 | /** | |
246 | This is a specialization of wxCharTypeBuffer<T> for @c wchar_t type. | |
247 | ||
248 | @nolibrary | |
249 | @category{data} | |
250 | */ | |
251 | class wxWCharBuffer : public wxCharTypeBuffer<wchar_t> | |
252 | { | |
253 | public: | |
254 | typedef wxCharTypeBuffer<wchar_t> wxCharTypeBufferBase; | |
255 | typedef wxScopedCharTypeBuffer<wchar_t> wxScopedCharTypeBufferBase; | |
256 | ||
257 | wxWCharBuffer(const wxCharTypeBufferBase& buf); | |
258 | wxWCharBuffer(const wxScopedCharTypeBufferBase& buf); | |
259 | wxWCharBuffer(const CharType *str = NULL); | |
260 | wxWCharBuffer(size_t len); | |
261 | wxWCharBuffer(const wxCStrData& cstr); | |
262 | }; | |
263 | ||
264 | /** | |
265 | @class wxMemoryBuffer | |
266 | ||
267 | A @b wxMemoryBuffer is a useful data structure for storing arbitrary sized | |
268 | blocks of memory. wxMemoryBuffer guarantees deletion of the memory block when | |
269 | the object is destroyed. | |
270 | ||
271 | @library{wxbase} | |
272 | @category{data} | |
273 | */ | |
274 | class wxMemoryBuffer | |
275 | { | |
276 | public: | |
277 | /** | |
278 | Copy constructor, refcounting is used for performance, but wxMemoryBuffer | |
279 | is not a copy-on-write structure so changes made to one buffer effect all | |
280 | copies made from it. | |
281 | ||
282 | @see @ref overview_refcount | |
283 | */ | |
284 | wxMemoryBuffer(const wxMemoryBuffer& src); | |
285 | ||
286 | /** | |
287 | Create a new buffer. | |
288 | ||
289 | @param size | |
290 | size of the new buffer. | |
291 | */ | |
292 | wxMemoryBuffer(size_t size = DefBufSize); | |
293 | ||
294 | /** | |
295 | Append a single byte to the buffer. | |
296 | ||
297 | @param data | |
298 | New byte to append to the buffer. | |
299 | */ | |
300 | void AppendByte(char data); | |
301 | ||
302 | /** | |
303 | Single call to append a data block to the buffer. | |
304 | ||
305 | @param data | |
306 | Pointer to block to append to the buffer. | |
307 | @param len | |
308 | Length of data to append. | |
309 | */ | |
310 | void AppendData(const void *data, size_t len); | |
311 | ||
312 | /** | |
313 | Ensure that the buffer is big enough and return a pointer to the start | |
314 | of the empty space in the buffer. This pointer can be used to directly | |
315 | write data into the buffer, this new data will be appended to the | |
316 | existing data. | |
317 | ||
318 | @param sizeNeeded | |
319 | Amount of extra space required in the buffer for | |
320 | the append operation | |
321 | */ | |
322 | void* GetAppendBuf(size_t sizeNeeded); | |
323 | ||
324 | /** | |
325 | Returns the size of the buffer. | |
326 | */ | |
327 | size_t GetBufSize() const; | |
328 | ||
329 | /** | |
330 | Return a pointer to the data in the buffer. | |
331 | */ | |
332 | void* GetData() const; | |
333 | ||
334 | /** | |
335 | Returns the length of the valid data in the buffer. | |
336 | */ | |
337 | size_t GetDataLen() const; | |
338 | ||
339 | /** | |
340 | Ensure the buffer is big enough and return a pointer to the | |
341 | buffer which can be used to directly write into the buffer | |
342 | up to @a sizeNeeded bytes. | |
343 | */ | |
344 | void* GetWriteBuf(size_t sizeNeeded); | |
345 | ||
346 | /** | |
347 | Ensures the buffer has at least @a size bytes available. | |
348 | */ | |
349 | void SetBufSize(size_t size); | |
350 | ||
351 | /** | |
352 | Sets the length of the data stored in the buffer. | |
353 | Mainly useful for truncating existing data. | |
354 | ||
355 | @param size | |
356 | New length of the valid data in the buffer. This is | |
357 | distinct from the allocated size | |
358 | */ | |
359 | void SetDataLen(size_t size); | |
360 | ||
361 | /** | |
362 | Update the length after completing a direct append, which | |
363 | you must have used GetAppendBuf() to initialise. | |
364 | ||
365 | @param sizeUsed | |
366 | This is the amount of new data that has been | |
367 | appended. | |
368 | */ | |
369 | void UngetAppendBuf(size_t sizeUsed); | |
370 | ||
371 | /** | |
372 | Update the buffer after completing a direct write, which | |
373 | you must have used GetWriteBuf() to initialise. | |
374 | ||
375 | @param sizeUsed | |
376 | The amount of data written in to buffer | |
377 | by the direct write | |
378 | */ | |
379 | void UngetWriteBuf(size_t sizeUsed); | |
380 | }; | |
381 |