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_)
70 mem_cast_size_exception(string_type file_name_, numeric_type line_number_)
71 : mem_cast_exception(ETL_ERROR_TEXT(
"mem_cast:size", ETL_MEM_CAST_FILE_ID
"A"), file_name_, line_number_)
83 mem_cast_nullptr_exception(string_type file_name_, numeric_type 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_;
100 ETL_STATIC_ASSERT((Alignment == 1) || etl::is_power_of_2<Alignment>::value,
"Alignment must be a power of 2");
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.raw)) T(value);
148 template <
typename T>
151 char* p =
static_cast<char*
>(buffer.raw) + offset;
160 template <
typename T,
size_t Offset>
163 char* p =
static_cast<char*
>(buffer.raw) + Offset;
164 ETL_STATIC_ASSERT(
sizeof(T) <= (Size - Offset),
"Type size is too large");
173 template <
typename T,
typename... TArgs>
174 T& emplace(TArgs... args)
176 ETL_STATIC_ASSERT(Size >=
sizeof(T),
"Type size is too large");
178 ::new (
static_cast<void*
>(buffer.raw)) T(
etl::forward<TArgs>(args)...);
186 template <typename T, typename... TArgs>
187 T& emplace_at_offset(
size_t offset, TArgs... args)
189 char* p =
static_cast<char*
>(buffer.raw) + offset;
192 ::new (p) T(etl::forward<TArgs>(args)...);
200 template <
typename T,
size_t Offset,
typename... TArgs>
201 T& emplace_at_offset(TArgs... args)
203 char* p =
static_cast<char*
>(buffer.raw) + Offset;
204 ETL_STATIC_ASSERT(
sizeof(T) <= (Size - Offset),
"Type size is too large");
206 ::new (p) T(etl::forward<TArgs>(args)...);
215 template <
typename T>
218 ETL_STATIC_ASSERT(
sizeof(T) <= Size,
"Size of type too large for storage");
220 return *
reinterpret_cast<T*
>(buffer.raw);
226 template <
typename T>
227 ETL_NODISCARD
const T&
ref()
const
229 ETL_STATIC_ASSERT(
sizeof(T) <= Size,
"Size of type too large for storage");
231 return *
reinterpret_cast<const T*
>(buffer.raw);
237 template <
typename T>
242 return *
reinterpret_cast<T*
>(buffer.raw + offset);
248 template <
typename T>
253 return *
reinterpret_cast<const T*
>(buffer.raw + offset);
259 template <
typename T,
size_t Offset>
262 ETL_STATIC_ASSERT(
sizeof(T) <= (Size - Offset),
"Size of type too large for storage");
264 return *
reinterpret_cast<T*
>(buffer.raw + Offset);
270 template <
typename T,
size_t Offset>
273 ETL_STATIC_ASSERT(
sizeof(T) <= (Size - Offset),
"Size of type too large for storage");
275 return *
reinterpret_cast<const T*
>(buffer.raw + Offset);
281 ETL_NODISCARD
static ETL_CONSTEXPR
size_t size()
305 ETL_NODISCARD
const char*
data()
const
316 template <
size_t Size_,
size_t Alignment_>
317 ETL_CONSTANT
size_t mem_cast<Size_, Alignment_>::Size;
319 template <
size_t Size_,
size_t Alignment_>
320 ETL_CONSTANT
size_t mem_cast<Size_, Alignment_>::Alignment;
335 : pbuffer(ETL_NULLPTR)
336 , buffer_size(Undefined_Size)
345 , buffer_size(buffer_size_)
353 : pbuffer(other.pbuffer)
354 , buffer_size(other.buffer_size)
363 pbuffer = rhs.pbuffer;
364 buffer_size = rhs.buffer_size;
372 template <
typename T>
378 ::new (pbuffer) T(value);
384 template <
typename T>
388 char* p = pbuffer + offset;
397 template <
typename T,
size_t Offset>
401 char* p = pbuffer + Offset;
411 template <
typename T,
typename... TArgs>
412 T& emplace(TArgs... args)
417 ::new (pbuffer) T(etl::forward<TArgs>(args)...);
425 template <
typename T,
typename... TArgs>
426 T& emplace_at_offset(
size_t offset, TArgs... args)
429 char* p = pbuffer + offset;
432 ::new (p) T(etl::forward<TArgs>(args)...);
434 return ref_at_offset<T>(offset);
440 template <
typename T,
size_t Offset,
typename... TArgs>
441 T& emplace_at_offset(TArgs... args)
443 ETL_ASSERT((pbuffer != ETL_NULLPTR), ETL_ERROR(etl::mem_cast_nullptr_exception));
444 char* p = pbuffer + Offset;
445 ETL_ASSERT(
sizeof(T) <= (buffer_size - Offset), ETL_ERROR(etl::mem_cast_size_exception));
447 ::new (p) T(etl::forward<TArgs>(args)...);
449 return ref_at_offset<T, Offset>();
456 template <
typename T>
462 T* p =
reinterpret_cast<T*
>(pbuffer);
470 template <
typename T>
471 ETL_NODISCARD
const T&
ref()
const
476 const T* p =
reinterpret_cast<const T*
>(pbuffer);
484 template <
typename T>
490 T* p =
reinterpret_cast<T*
>(pbuffer + offset);
498 template <
typename T>
504 const T* p =
reinterpret_cast<const T*
>(pbuffer + offset);
512 template <
typename T,
size_t Offset>
518 T* p =
reinterpret_cast<T*
>(pbuffer + Offset);
526 template <
typename T,
size_t Offset>
532 const T* p =
reinterpret_cast<const T*
>(pbuffer + Offset);
540 ETL_NODISCARD
size_t size()
const
552 const type p =
reinterpret_cast<type>(pbuffer);
560 void data(
char* pbuffer_,
size_t buffer_size_ = Undefined_Size)
563 buffer_size = buffer_size_;
577 ETL_NODISCARD
const char*
data()
const
593#if ETL_USING_CPP11 && !defined(ETL_MEM_CAST_FORCE_CPP03_IMPLEMENTATION)
594 template <
typename... TTypes>
597 template <
typename T1,
typename T2 = char,
typename T3 = char,
typename T4 = char,
598 typename T5 = char,
typename T6 = char,
typename T7 = char,
typename T8 = char,
599 typename T9 = char,
typename T10 = char,
typename T11 = char,
typename T12 = char,
600 typename T13 = char,
typename T14 = char,
typename T15 = char,
typename T16 =
char>
601 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,
602 etl::largest<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>::alignment>
The base class for mem_cast exceptions.
Definition mem_cast.h:54
The exception thrown when the pointer is null.
Definition mem_cast.h:80
ETL_NODISCARD T & ref_at_offset()
Get a reference to T at offset (static).
Definition mem_cast.h:513
ETL_NODISCARD size_t size() const
Get the size of the buffer.
Definition mem_cast.h:540
ETL_NODISCARD char * data()
Get a pointer to the external buffer.
Definition mem_cast.h:569
ETL_NODISCARD const char * data() const
Get const a pointer to the external buffer.
Definition mem_cast.h:577
void assign_at_offset(size_t offset, const T &value)
Assign from value at offset.
Definition mem_cast.h:385
ETL_NODISCARD const T & ref_at_offset(size_t offset) const
Get a const reference to T at offset (dynamic).
Definition mem_cast.h:499
ETL_NODISCARD const T & ref_at_offset() const
Get a const reference to T at offset (static).
Definition mem_cast.h:527
ETL_NODISCARD T & ref_at_offset(size_t offset)
Get a reference to T at offset (dynamic).
Definition mem_cast.h:485
ETL_NODISCARD const T & ref() const
Get a const reference to T.
Definition mem_cast.h:471
ETL_NODISCARD T & ref()
Get a reference to T.
Definition mem_cast.h:457
mem_cast_ptr(const mem_cast_ptr &other)
Copy construct.
Definition mem_cast.h:352
mem_cast_ptr(char *pbuffer_, size_t buffer_size_=Undefined_Size)
Construct with pointer to buffer and optional size.
Definition mem_cast.h:343
void assign(const T &value)
Assign from value.
Definition mem_cast.h:373
ETL_NODISCARD size_t alignment() const
Get the alignment of the buffer.
Definition mem_cast.h:548
void data(char *pbuffer_, size_t buffer_size_=Undefined_Size)
Set the pointer to the external buffer.
Definition mem_cast.h:560
void assign_at_offset(const T &value)
Assign from value at offset.
Definition mem_cast.h:398
mem_cast_ptr()
Default constructor.
Definition mem_cast.h:334
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
ETL_NODISCARD const T & ref_at_offset(size_t offset) const
Get a const reference to T at offset (dynamic).
Definition mem_cast.h:249
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:297
ETL_NODISCARD T & ref_at_offset(size_t offset)
Get a reference to T at offset (dynamic).
Definition mem_cast.h:238
ETL_NODISCARD T & ref()
Get a reference to T.
Definition mem_cast.h:216
static ETL_NODISCARD ETL_CONSTEXPR size_t alignment()
Get the alignment of the buffer.
Definition mem_cast.h:289
ETL_NODISCARD T & ref_at_offset()
Get a reference to T at offset (static).
Definition mem_cast.h:260
ETL_NODISCARD const T & ref_at_offset() const
Get a const reference to T at offset (static).
Definition mem_cast.h:271
ETL_NODISCARD const char * data() const
Get a const pointer to the internal buffer.
Definition mem_cast.h:305
static ETL_NODISCARD ETL_CONSTEXPR size_t size()
Get the size of the buffer.
Definition mem_cast.h:281
mem_cast & operator=(const mem_cast< Other_Size, Other_Alignment > &rhs)
Assignment operator.
Definition mem_cast.h:125
ETL_NODISCARD const T & ref() const
Get a const reference to T.
Definition mem_cast.h:227
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:1142
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
ETL_CONSTEXPR exception(string_type reason_, string_type, numeric_type line_)
Constructor.
Definition exception.h:69
Definition exception.h:47
Definition integral_limits.h:516
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:39
Definition mem_cast.h:603