25 auto rv = ::malloc(sz);
35 auto rv = ::realloc(p, sz);
55template<
typename Alloc = Allocator>
82 void reserve(
size_t sz,
bool shrink =
false);
90 void resize(
size_t sz,
bool shrink =
false);
110 [[nodiscard]]
size_t size()
const;
125 [[nodiscard]]
const void*
data()
const;
135 [[nodiscard]]
const char*
c_str()
const;
143 return reinterpret_cast<T*
>(
static_cast<char*
>(_reference->_data) + (
offset + _reference->_offset));
152 return reinterpret_cast<T*
>(
static_cast<char*
>(_reference->_data) + (
offset + _reference->_offset));
184 explicit operator void*();
189 explicit operator const char*()
const;
194 explicit operator char*();
199 explicit operator const void*()
const;
222 typename Alloc::handle_t Handle;
236template<
typename Alloc>
239 return _reference->_size - _reference->_offset;
242template<
typename Alloc>
245 return _reference->_size - _reference->_offset;
248template<
typename Alloc>
251 return static_cast<char*
>(_reference->_data) + _reference->_offset;
254template<
typename Alloc>
257 return static_cast<char*
>(_reference->_data) + _reference->_offset;
260template<
typename Alloc>
263 return static_cast<char*
>(_reference->_data) + _reference->_offset;
266template<
typename Alloc>
269 return static_cast<char*
>(_reference->_data) + _reference->_offset;
272template<
typename Alloc>
276 offset += _reference->_offset;
277 return &(
static_cast<char*
>(_reference->_data))[offset];
280template<
typename Alloc>
284 offset += _reference->_offset;
285 return &(
static_cast<char*
>(_reference->_data))[offset];
288template<
typename Alloc>
292 i += _reference->_offset;
293 if (i > _reference->_size)
295 throw std::out_of_range(
"Index out of range!");
298 return (
static_cast<char*
>(_reference->_data))[i];
301template<
typename Alloc>
304 if (i > _reference->_size)
306 throw std::out_of_range(
"Index out of range!");
309 return (
static_cast<char*
>(_reference->_data))[i];
312template<
typename Alloc>
321 if (_reference == db._reference)
326 _reference->_usage--;
328 if (_reference->_usage == 0)
330 Alloc::freemem(_reference->Handle, _reference->_data);
334 _reference = db._reference;
336 _reference->_usage++;
341template<
typename Alloc>
344 return _reference->_data;
347template<
typename Alloc>
350 return _reference->_data;
353template<
typename Alloc>
356 return _reference->_data;
359template<
typename Alloc>
362 return _reference->_data;
365template<
typename Alloc>
368 _reference =
new Reference;
369 _reference->_size = 0;
370 _reference->_allocated = 0;
371 _reference->_offset = 0;
372 _reference->_data =
nullptr;
373 _reference->_usage = 1;
376template<
typename Alloc>
379 _reference = db._reference;
380 _reference->_usage++;
383template<
typename Alloc>
386 _reference =
new Reference;
387 _reference->_size = 0;
388 _reference->_allocated = 0;
389 _reference->_offset = 0;
390 _reference->_data =
nullptr;
391 _reference->_usage = 1;
395template<
typename Alloc>
398 _reference->_usage--;
400 if (_reference->_usage == 0)
402 if (_reference->_data)
404 Alloc::freemem(_reference->Handle, _reference->_data);
410template<
typename Alloc>
417 _reference->_allocated = 0;
418 _reference->_offset = 0;
419 if (_reference->_data)
421 Alloc::freemem(_reference->Handle, _reference->_data);
428 sz += _reference->_offset;
431 if ((sz > _reference->_allocated) || (sz < _reference->_allocated && shrink))
433 if (_reference->_data)
435 _reference->_data = Alloc::reallocmem(_reference->Handle, _reference->_data, sz);
439 _reference->_data = Alloc::allocmem(_reference->Handle, sz);
442 _reference->_allocated = sz;
447template<
typename Alloc>
451 _reference->_offset = ofs;
454template<
typename Alloc>
457 return _reference->_offset;
460template<
typename Alloc>
466 sz += _reference->_offset;
470 _reference->_offset = 0;
475 _reference->_size = sz;
478template<
typename Alloc>
482 sz += _reference->_offset;
484 if (sz != _reference->_size)
487 if (sz <= _reference->_allocated)
490 _reference->_size = sz;
495 Reference ref = *_reference;
497 _reference->_size = 0;
498 _reference->_allocated = 0;
499 _reference->_offset = 0;
500 _reference->_data =
nullptr;
503 resize(sz - _reference->_offset);
506 memcpy_s(_reference->_data, ref._size, ref._data, ref._size);
508 memcpy(_reference->_data, ref._data, ref._size);
513 Alloc::freemem(ref.Handle, ref._data);
519template<
typename Alloc>
522 memset(_reference->_data, c, reserved ? _reference->_allocated : _reference->_size);
525template<
typename Alloc>
531template<
typename Alloc>
534 return _reference->_allocated - _reference->_offset;
Template for creating a dynamic buffer using an allocator.
Definition TDynamicBuffer.h:57
TDynamicBuffer(size_t sz)
Initializing constructor.
Definition TDynamicBuffer.h:384
char & operator[](size_t i)
Character array operator to access a single byte element.
Definition TDynamicBuffer.h:302
TDynamicBuffer(const TDynamicBuffer &db)
Copy constructor.
Definition TDynamicBuffer.h:377
void * data()
Gets a void pointer to the start of the buffer.
Definition TDynamicBuffer.h:249
void reserve(size_t sz, bool shrink=false)
Reserves the array but does leave the data in tact.
Definition TDynamicBuffer.h:411
const char * c_str() const
Gets a const character pointer to the start of the buffer.
Definition TDynamicBuffer.h:267
TDynamicBuffer()
Default constructor.
Definition TDynamicBuffer.h:366
T * ptr(size_t offset=0)
Gets a typed pointer to the specified given offset the start of the buffer.
Definition TDynamicBuffer.h:141
void grow(size_t sz)
Grows the array to the specified size but keeps the current data intact.
Definition TDynamicBuffer.h:479
TDynamicBuffer & operator=(const TDynamicBuffer &db)
Assignment operators.
Definition TDynamicBuffer.h:313
void offset(size_t ofs)
Sets an virtual offset to the buffer.
Definition TDynamicBuffer.h:448
char * c_str()
Gets a character pointer to the start of the buffer.
Definition TDynamicBuffer.h:261
size_t size() const
Returns the byte size of the buffer.
Definition TDynamicBuffer.h:243
const T * ptr(size_t offset=0) const
Gets a typed pointer to the specified given offset the start of the buffer.
Definition TDynamicBuffer.h:150
void * data(size_t offset)
Gets a void pointer with a byte offset from the start.
Definition TDynamicBuffer.h:273
const void * data() const
Definition TDynamicBuffer.h:255
void resize(size_t sz, bool shrink=false)
Resizes the array but does leave the data in tact.
Definition TDynamicBuffer.h:461
char operator[](size_t i) const
Const character array operator to access a single byte element.
Definition TDynamicBuffer.h:289
void set(int c=0, bool reserved=false)
Sets all memory to the given character. When reserved is true not only the current size but all of it...
Definition TDynamicBuffer.h:520
const void * data(size_t offset) const
Gets a const void pointer with a byte offset from the start.
Definition TDynamicBuffer.h:281
~TDynamicBuffer()
Destructor.
Definition TDynamicBuffer.h:396
void zero(bool reserved=false)
Definition TDynamicBuffer.h:526
size_t reserved() const
Gets the reserved size of this instance.
Definition TDynamicBuffer.h:532
size_t size()
Returns the byte size of the buffer.
Definition TDynamicBuffer.h:237
size_t offset() const
Returns the current offset.
Definition TDynamicBuffer.h:455
Definition Application.h:10
TDynamicBuffer< Allocator > DynamicBuffer
Actual specialized dynamic buffer type using the default allocator.
Definition TDynamicBuffer.h:540
Memory allocator class.
Definition TDynamicBuffer.h:14
int handle_t
Dummy type for allocators which need handles.
Definition TDynamicBuffer.h:18
static void * allocmem(handle_t &, size_t sz)
Allocates the memory for a dynamic buffer.
Definition TDynamicBuffer.h:23
static void * reallocmem(handle_t &, void *p, size_t sz)
Reallocates the memory for a dynamic buffer.
Definition TDynamicBuffer.h:33
static void freemem(handle_t, void *&p)
Frees the memory for a dynamic buffer.
Definition TDynamicBuffer.h:43