31#ifndef ETL_MEM_CAST_INCLUDED
32#define ETL_MEM_CAST_INCLUDED
36#include "static_assert.h"
57 mem_cast_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
58 :
exception(reason_, file_name_, line_number_)
71 :
mem_cast_exception(ETL_ERROR_TEXT(
"mem_cast:size", ETL_MEM_CAST_FILE_ID
"A"), file_name_, line_number_)
84 :
mem_cast_exception(ETL_ERROR_TEXT(
"mem_cast:null pointer", ETL_MEM_CAST_FILE_ID
"B"), file_name_, line_number_)
92 template <
size_t Size_,
size_t Alignment_>
97 static ETL_CONSTANT
size_t Size = Size_;
98 static ETL_CONSTANT
size_t Alignment = Alignment_;
113 template <
size_t Other_Size,
size_t Other_Alignment>
116 ETL_STATIC_ASSERT(Size >= Other_Size,
"Other size is too large");
118 memcpy(buffer, other.buffer, Size_);
124 template <
size_t Other_Size,
size_t Other_Alignment>
127 ETL_STATIC_ASSERT(Size >= Other_Size,
"RHS size is too large");
129 memcpy(buffer, rhs.buffer, Size_);
137 template <
typename T>
140 ETL_STATIC_ASSERT(Size >=
sizeof(T),
"Type size is too large");
142 ::new (
static_cast<void*
>(buffer)) T(value);
148 template <
typename T>
151 char* p =
static_cast<char*
>(buffer) + offset;
160 template <
typename T,
size_t Offset>
163 char* p =
static_cast<char*
>(buffer) + Offset;
164 ETL_STATIC_ASSERT(
sizeof(T) <= (Size - Offset),
"Type size is too large");
173 template <
typename T,
typename... TArgs>
174 void emplace(TArgs... args)
176 ETL_STATIC_ASSERT(Size >=
sizeof(T),
"Type size is too large");
178 ::new (
static_cast<void*
>(buffer)) T(etl::forward<TArgs>(args)...);
184 template <
typename T,
typename... TArgs>
185 void emplace_at_offset(
size_t offset, TArgs... args)
187 char* p =
static_cast<char*
>(buffer) + offset;
190 ::new (p) T(etl::forward<TArgs>(args)...);
196 template <
typename T,
size_t Offset,
typename... TArgs>
197 void emplace_at_offset(TArgs... args)
199 char* p =
static_cast<char*
>(buffer) + Offset;
200 ETL_STATIC_ASSERT(
sizeof(T) <= (Size - Offset),
"Type size is too large");
202 ::new (p) T(etl::forward<TArgs>(args)...);
209 template <
typename T>
212 ETL_STATIC_ASSERT(
sizeof(T) <= Size,
"Size of T is too large");
214 return *
static_cast<T*
>(buffer);
220 template <
typename T>
221 ETL_NODISCARD
const T&
ref()
const
223 ETL_STATIC_ASSERT(
sizeof(T) <= Size,
"Size of T is too large");
225 return *
static_cast<const T*
>(buffer);
231 template <
typename T>
236 char* p = buffer + offset;
238 return *
static_cast<T*
>(p);
244 template <
typename T>
249 char* p = buffer + offset;
251 return *
static_cast<const T*
>(p);
257 template <
typename T,
size_t Offset>
260 ETL_STATIC_ASSERT(
sizeof(T) <= (Size - Offset),
"Size of T is too large");
262 char* p = buffer + Offset;
264 return *
static_cast<T*
>(p);
270 template <
typename T,
size_t Offset>
273 ETL_STATIC_ASSERT(
sizeof(T) <= (Size - Offset),
"Size of T is too large");
275 char* p = buffer + Offset;
277 return *
static_cast<const T*
>(p);
283 ETL_NODISCARD
static ETL_CONSTEXPR
size_t size()
307 ETL_NODISCARD
const char*
data()
const
318 template <
size_t Size_,
size_t Alignment_>
319 ETL_CONSTANT
size_t mem_cast<Size_, Alignment_>::Size;
321 template <
size_t Size_,
size_t Alignment_>
322 ETL_CONSTANT
size_t mem_cast<Size_, Alignment_>::Alignment;
337 : pbuffer(ETL_NULLPTR)
338 , buffer_size(Undefined_Size)
347 , buffer_size(buffer_size_)
355 : pbuffer(other.pbuffer)
356 , buffer_size(other.buffer_size)
365 pbuffer = rhs.pbuffer;
366 buffer_size = rhs.buffer_size;
374 template <
typename T>
380 ::new (pbuffer) T(value);
386 template <
typename T>
390 char* p = pbuffer + offset;
399 template <
typename T,
size_t Offset>
403 char* p = pbuffer + Offset;
413 template <
typename T,
typename... TArgs>
414 void emplace(TArgs... args)
419 ::new (pbuffer) T(etl::forward<TArgs>(args)...);
425 template <
typename T,
typename... TArgs>
426 void emplace_at_offset(
size_t offset, TArgs... args)
429 char* p = pbuffer + offset;
432 ::new (p) T(etl::forward<TArgs>(args)...);
438 template <
typename T,
size_t Offset,
typename... TArgs>
439 void emplace_at_offset(TArgs... args)
442 char* p = pbuffer + Offset;
445 ::new (p) T(etl::forward<TArgs>(args)...);
452 template <
typename T>
458 return *
reinterpret_cast<T*
>(pbuffer);
464 template <
typename T>
465 ETL_NODISCARD
const T&
ref()
const
470 return *
reinterpret_cast<const T*
>(pbuffer);
476 template <
typename T>
480 char* p = pbuffer + offset;
483 return *
reinterpret_cast<T*
>(p);
489 template <
typename T>
493 char* p = pbuffer + offset;
496 return *
reinterpret_cast<const T*
>(p);
502 template <
typename T,
size_t Offset>
506 char* p = pbuffer + Offset;
509 return *
reinterpret_cast<T*
>(p);
515 template <
typename T,
size_t Offset>
519 char* p = pbuffer + Offset;
522 return *
reinterpret_cast<const T*
>(p);
528 ETL_NODISCARD
size_t size()
const
540 const type p =
reinterpret_cast<type
>(pbuffer);
548 void data(
char* pbuffer_,
size_t buffer_size_ = Undefined_Size)
551 buffer_size = buffer_size_;
565 ETL_NODISCARD
const char*
data()
const
581#if ETL_USING_CPP11 && !defined(ETL_MEM_CAST_FORCE_CPP03_IMPLEMENTATION)
582 template <
typename... TTypes>
585 template <
typename T1,
typename T2 = char,
typename T3 = char,
typename T4 = char,
586 typename T5 = char,
typename T6 = char,
typename T7 = char,
typename T8 = char,
587 typename T9 = char,
typename T10 = char,
typename T11 = char,
typename T12 = char,
588 typename T13 = char,
typename T14 = char,
typename T15 = char,
typename T16 =
char>
589 struct mem_cast_types :
public etl::mem_cast<etl::largest<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>::size,
590 etl::largest<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>::alignment>
The base class for array_wrapper exceptions.
Definition: mem_cast.h:54
The exception thrown when the pointer is null.
Definition: mem_cast.h:80
mem_cast_ptr
Definition: mem_cast.h:328
ETL_NODISCARD T & ref_at_offset()
Get a reference to T at offset (static)
Definition: mem_cast.h:503
ETL_NODISCARD size_t size() const
Get the size of the buffer.
Definition: mem_cast.h:528
ETL_NODISCARD char * data()
Get a pointer to the external buffer.
Definition: mem_cast.h:557
void assign_at_offset(size_t offset, const T &value)
Assign from value at offset.
Definition: mem_cast.h:387
mem_cast_ptr & operator=(const mem_cast_ptr &rhs)
Assignment operator.
Definition: mem_cast.h:363
ETL_NODISCARD T & ref()
Get a reference to T.
Definition: mem_cast.h:453
mem_cast_ptr(const mem_cast_ptr &other)
Copy construct.
Definition: mem_cast.h:354
mem_cast_ptr(char *pbuffer_, size_t buffer_size_=Undefined_Size)
Construct with pointer to buffer and optional size.
Definition: mem_cast.h:345
void assign(const T &value)
Assign from value.
Definition: mem_cast.h:375
ETL_NODISCARD size_t alignment() const
Get the alignment of the buffer.
Definition: mem_cast.h:536
void data(char *pbuffer_, size_t buffer_size_=Undefined_Size)
Set the pointer to the external buffer.
Definition: mem_cast.h:548
void assign_at_offset(const T &value)
Assign from value at offset.
Definition: mem_cast.h:400
mem_cast_ptr()
Default constructor.
Definition: mem_cast.h:336
The exception thrown when the type size is too large.
Definition: mem_cast.h:67
mem_cast
Definition: mem_cast.h:94
void assign_at_offset(size_t offset, const T &value)
Assign from value at offset.
Definition: mem_cast.h:149
mem_cast(const mem_cast< Other_Size, Other_Alignment > &other)
Copy constructor.
Definition: mem_cast.h:114
void assign_at_offset(const T &value)
Assign from value at offset.
Definition: mem_cast.h:161
mem_cast()
Default constructor.
Definition: mem_cast.h:105
void assign(const T &value)
Assign from value.
Definition: mem_cast.h:138
ETL_NODISCARD char * data()
Get a pointer to the internal buffer.
Definition: mem_cast.h:299
ETL_NODISCARD T & ref()
Get a reference to T.
Definition: mem_cast.h:210
static ETL_NODISCARD ETL_CONSTEXPR size_t alignment()
Get the alignment of the buffer.
Definition: mem_cast.h:291
ETL_NODISCARD T & ref_at_offset()
Get a reference to T at offset (static)
Definition: mem_cast.h:258
static ETL_NODISCARD ETL_CONSTEXPR size_t size()
Get the size of the buffer.
Definition: mem_cast.h:283
mem_cast & operator=(const mem_cast< Other_Size, Other_Alignment > &rhs)
Assignment operator.
Definition: mem_cast.h:125
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), uint_least8_t >::type count_trailing_zeros(T value)
Definition: binary.h:1175
#define ETL_ASSERT(b, e)
Definition: error_handler.h:316
ETL_CONSTEXPR exception(string_type reason_, string_type, numeric_type line_)
Constructor.
Definition: exception.h:69
Definition: exception.h:47
Definition: integral_limits.h:468
Definition: largest.h:367
Template to determine the smallest unsigned int type that can contain a value with the specified numb...
Definition: smallest_generator.h:323
bitset_ext
Definition: absolute.h:38
Definition: mem_cast.h:591