ReactOS 0.4.16-dev-1041-g8b6907f
__crt_win32_buffer< Character, ResizePolicy > Class Template Reference

#include <corecrt_internal_win32_buffer.h>

Inheritance diagram for __crt_win32_buffer< Character, ResizePolicy >:
Collaboration diagram for __crt_win32_buffer< Character, ResizePolicy >:

Public Types

using char_type = Character
 
using debug_info_type = typename ResizePolicy::debug_info_type
 

Public Member Functions

 __crt_win32_buffer ()
 
 __crt_win32_buffer (debug_info_type const &debug_info)
 
template<size_t N>
 __crt_win32_buffer (Character(&buffer)[N])
 
template<size_t N>
 __crt_win32_buffer (Character(&buffer)[N], debug_info_type const &debug_info)
 
 __crt_win32_buffer (Character *const buffer, size_t const buffer_capacity)
 
 __crt_win32_buffer (Character *const buffer, size_t const buffer_capacity, debug_info_type const &debug_info)
 
 ~__crt_win32_buffer ()
 
 __crt_win32_buffer (__crt_win32_buffer const &)=delete
 
__crt_win32_bufferoperator= (__crt_win32_buffer const &)=delete
 
 __crt_win32_buffer (__crt_win32_buffer &&)=delete
 
__crt_win32_bufferoperator= (__crt_win32_buffer &&)=delete
 
char_typedata ()
 
char_type constdata () const
 
size_t size () const
 
void size (size_t new_size)
 
size_t capacity () const
 
void reset ()
 
char_typedetach ()
 
template<typename Win32Function >
errno_t call_win32_function (Win32Function const &win32_function)
 
debug_info_type constdebug_info () const
 
errno_t allocate (size_t requested_size)
 
void set_to_nullptr ()
 

Private Member Functions

void _reset_no_dealloc ()
 
void _deallocate ()
 

Private Attributes

char_type *const _initial_string
 
size_t _initial_capacity
 
char_type_string
 
size_t _capacity
 
size_t _size
 
bool _is_dynamic
 

Detailed Description

template<typename Character, typename ResizePolicy>
class __crt_win32_buffer< Character, ResizePolicy >

Definition at line 151 of file corecrt_internal_win32_buffer.h.

Member Typedef Documentation

◆ char_type

template<typename Character , typename ResizePolicy >
using __crt_win32_buffer< Character, ResizePolicy >::char_type = Character

Definition at line 155 of file corecrt_internal_win32_buffer.h.

◆ debug_info_type

template<typename Character , typename ResizePolicy >
using __crt_win32_buffer< Character, ResizePolicy >::debug_info_type = typename ResizePolicy::debug_info_type

Definition at line 156 of file corecrt_internal_win32_buffer.h.

Constructor & Destructor Documentation

◆ __crt_win32_buffer() [1/8]

template<typename Character , typename ResizePolicy >
__crt_win32_buffer< Character, ResizePolicy >::__crt_win32_buffer ( )
inline

Definition at line 158 of file corecrt_internal_win32_buffer.h.

◆ __crt_win32_buffer() [2/8]

template<typename Character , typename ResizePolicy >
__crt_win32_buffer< Character, ResizePolicy >::__crt_win32_buffer ( debug_info_type const debug_info)
inlineexplicit

Definition at line 170 of file corecrt_internal_win32_buffer.h.

172 _initial_string(nullptr),
174 _string(nullptr),
175 _capacity(0),
176 _size(0),
177 _is_dynamic(false)
178
179 {
180 }
debug_info_type const & debug_info() const

◆ __crt_win32_buffer() [3/8]

template<typename Character , typename ResizePolicy >
template<size_t N>
__crt_win32_buffer< Character, ResizePolicy >::__crt_win32_buffer ( Character(&)  buffer[N])
inline

Definition at line 183 of file corecrt_internal_win32_buffer.h.

184 : debug_info_type(),
188 _capacity(N),
189 _size(0),
190 _is_dynamic(false)
191 {
192 }
#define N
Definition: crc32.c:57
GLuint buffer
Definition: glext.h:5915

◆ __crt_win32_buffer() [4/8]

template<typename Character , typename ResizePolicy >
template<size_t N>
__crt_win32_buffer< Character, ResizePolicy >::__crt_win32_buffer ( Character(&)  buffer[N],
debug_info_type const debug_info 
)
inline

Definition at line 195 of file corecrt_internal_win32_buffer.h.

200 _capacity(N),
201 _size(0),
202 _is_dynamic(false)
203 {
204 }

◆ __crt_win32_buffer() [5/8]

template<typename Character , typename ResizePolicy >
__crt_win32_buffer< Character, ResizePolicy >::__crt_win32_buffer ( Character *const  buffer,
size_t const  buffer_capacity 
)
inline

Definition at line 206 of file corecrt_internal_win32_buffer.h.

210 : debug_info_type(),
212 _initial_capacity(buffer_capacity),
214 _capacity(buffer_capacity),
215 _size(0),
216 _is_dynamic(false)
217 {
218 }

◆ __crt_win32_buffer() [6/8]

template<typename Character , typename ResizePolicy >
__crt_win32_buffer< Character, ResizePolicy >::__crt_win32_buffer ( Character *const  buffer,
size_t const  buffer_capacity,
debug_info_type const debug_info 
)
inline

Definition at line 220 of file corecrt_internal_win32_buffer.h.

227 _initial_capacity(buffer_capacity),
229 _capacity(buffer_capacity),
230 _size(0),
231 _is_dynamic(false)
232 {
233 }

◆ ~__crt_win32_buffer()

template<typename Character , typename ResizePolicy >
__crt_win32_buffer< Character, ResizePolicy >::~__crt_win32_buffer ( )
inline

Definition at line 235 of file corecrt_internal_win32_buffer.h.

236 {
237 _deallocate();
238 }

◆ __crt_win32_buffer() [7/8]

template<typename Character , typename ResizePolicy >
__crt_win32_buffer< Character, ResizePolicy >::__crt_win32_buffer ( __crt_win32_buffer< Character, ResizePolicy > const )
delete

◆ __crt_win32_buffer() [8/8]

template<typename Character , typename ResizePolicy >
__crt_win32_buffer< Character, ResizePolicy >::__crt_win32_buffer ( __crt_win32_buffer< Character, ResizePolicy > &&  )
delete

Member Function Documentation

◆ _deallocate()

◆ _reset_no_dealloc()

template<typename Character , typename ResizePolicy >
void __crt_win32_buffer< Character, ResizePolicy >::_reset_no_dealloc ( )
inlineprivate

◆ allocate()

template<typename Character , typename ResizePolicy >
errno_t __crt_win32_buffer< Character, ResizePolicy >::allocate ( size_t  requested_size)
inline

Definition at line 344 of file corecrt_internal_win32_buffer.h.

345 {
346 _deallocate();
347
348 errno_t err = ResizePolicy::allocate(
349 reinterpret_cast<void **>(&_string),
350 requested_size * sizeof(Character),
351 debug_info()
352 );
353
354 if (err) {
355 _is_dynamic = false;
356 _capacity = 0;
357 return err;
358 }
359
360 _is_dynamic = true;
362 return 0;
363 }
size_t const requested_size
Definition: debug_heap.cpp:751
#define err(...)
int errno_t
Definition: corecrt.h:615

Referenced by __acrt_convert_wcs_mbs(), __acrt_convert_wcs_mbs_cp(), and __crt_win32_buffer< Character, ResizePolicy >::call_win32_function().

◆ call_win32_function()

template<typename Character , typename ResizePolicy >
template<typename Win32Function >
errno_t __crt_win32_buffer< Character, ResizePolicy >::call_win32_function ( Win32Function const win32_function)
inline

Definition at line 303 of file corecrt_internal_win32_buffer.h.

304 { // Suitable for more Win32 calls, where a size is returned
305 // if there is not enough space.
306
307 size_t const required_size = win32_function(_string, static_cast<DWORD>(_capacity));
308 if (required_size == 0) {
310 return errno;
311 }
312
313 if (required_size <= _capacity) {
314 // Had enough space, data was written, save size and return
315 _size = required_size;
316 return 0;
317 }
318
319 size_t const required_size_plus_null_terminator = required_size + 1;
320
321 errno_t const alloc_err = allocate(required_size_plus_null_terminator);
322 if (alloc_err)
323 {
324 return alloc_err;
325 }
326
327 // Upon success, return value is number of characters written, minus the null terminator.
328 size_t const required_size2 = win32_function(_string, static_cast<DWORD>(_capacity));
329 if (required_size2 == 0) {
331 return errno;
332 }
333
334 // Capacity should be large enough at this point.
335 _size = required_size2;
336 return 0;
337 }
errno_t allocate(size_t requested_size)
void __cdecl __acrt_errno_map_os_error(unsigned long)
Definition: errno.cpp:91
unsigned long DWORD
Definition: ntddk_ex.h:95
#define errno
Definition: errno.h:18
static const char alloc_err[]
Definition: svc_dg.c:382
DWORD WINAPI GetLastError(void)
Definition: except.c:1042

Referenced by __acrt_get_current_directory_wide(), and __acrt_get_full_path_name_wide().

◆ capacity()

template<typename Character , typename ResizePolicy >
size_t __crt_win32_buffer< Character, ResizePolicy >::capacity ( ) const
inline

Definition at line 266 of file corecrt_internal_win32_buffer.h.

267 {
268 return _capacity;
269 }

Referenced by __acrt_convert_wcs_mbs(), and __acrt_convert_wcs_mbs_cp().

◆ data() [1/2]

◆ data() [2/2]

template<typename Character , typename ResizePolicy >
char_type const * __crt_win32_buffer< Character, ResizePolicy >::data ( ) const
inline

Definition at line 251 of file corecrt_internal_win32_buffer.h.

252 {
253 return _string;
254 }

◆ debug_info()

template<typename Character , typename ResizePolicy >
debug_info_type const & __crt_win32_buffer< Character, ResizePolicy >::debug_info ( ) const
inline

◆ detach()

template<typename Character , typename ResizePolicy >
char_type * __crt_win32_buffer< Character, ResizePolicy >::detach ( )
inline

Definition at line 277 of file corecrt_internal_win32_buffer.h.

278 {
279 if (_string == nullptr || _size == 0) {
280 return nullptr;
281 }
282
283 char_type * return_val{};
284
285 if (!_is_dynamic && _size > 0) {
286 // This pointer needs to live longer than the stack buffer
287 // Allocate + Copy
288 ResizePolicy::allocate(
289 reinterpret_cast<void **>(&return_val),
290 _size * sizeof(Character),
291 debug_info()
292 );
293 memcpy_s(return_val, _size, _string, _capacity);
294 } else {
295 return_val = _string;
296 }
297
299 return return_val;
300 }
int CDECL memcpy_s(void *dest, size_t numberOfElements, const void *src, size_t count)
Definition: heap.c:800

◆ operator=() [1/2]

template<typename Character , typename ResizePolicy >
__crt_win32_buffer & __crt_win32_buffer< Character, ResizePolicy >::operator= ( __crt_win32_buffer< Character, ResizePolicy > &&  )
delete

◆ operator=() [2/2]

template<typename Character , typename ResizePolicy >
__crt_win32_buffer & __crt_win32_buffer< Character, ResizePolicy >::operator= ( __crt_win32_buffer< Character, ResizePolicy > const )
delete

◆ reset()

template<typename Character , typename ResizePolicy >
void __crt_win32_buffer< Character, ResizePolicy >::reset ( )
inline

Definition at line 271 of file corecrt_internal_win32_buffer.h.

272 {
273 _deallocate();
275 }

◆ set_to_nullptr()

template<typename Character , typename ResizePolicy >
void __crt_win32_buffer< Character, ResizePolicy >::set_to_nullptr ( )
inline

Definition at line 365 of file corecrt_internal_win32_buffer.h.

366 {
367 _deallocate();
368
369 _string = nullptr;
370 _capacity = 0;
371 _size = 0;
372 }

Referenced by __acrt_convert_wcs_mbs(), and __acrt_convert_wcs_mbs_cp().

◆ size() [1/2]

◆ size() [2/2]

template<typename Character , typename ResizePolicy >
void __crt_win32_buffer< Character, ResizePolicy >::size ( size_t  new_size)
inline

Definition at line 261 of file corecrt_internal_win32_buffer.h.

262 {
263 _size = new_size;
264 }
size_t const new_size
Definition: expand.cpp:66

Member Data Documentation

◆ _capacity

◆ _initial_capacity

template<typename Character , typename ResizePolicy >
size_t __crt_win32_buffer< Character, ResizePolicy >::_initial_capacity
private

◆ _initial_string

template<typename Character , typename ResizePolicy >
char_type* const __crt_win32_buffer< Character, ResizePolicy >::_initial_string
private

◆ _is_dynamic

◆ _size

◆ _string


The documentation for this class was generated from the following file: