31#ifndef ETL_MEM_CAST_INCLUDED
32#define ETL_MEM_CAST_INCLUDED
42#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>
219 ETL_STATIC_ASSERT(
sizeof(T) <= Size,
"Size of type too large for storage");
221 return *
reinterpret_cast<T*
>(buffer.raw);
227 template <
typename T>
231 ETL_STATIC_ASSERT(
sizeof(T) <= Size,
"Size of type too large for storage");
233 return *
reinterpret_cast<const T*
>(buffer.raw);
239 template <
typename T>
245 return *
reinterpret_cast<T*
>(buffer.raw + offset);
251 template <
typename T>
257 return *
reinterpret_cast<const T*
>(buffer.raw + offset);
263 template <
typename T,
size_t Offset>
267 ETL_STATIC_ASSERT(
sizeof(T) <= (Size - Offset),
"Size of type too large for storage");
269 return *
reinterpret_cast<T*
>(buffer.raw + Offset);
275 template <
typename T,
size_t Offset>
279 ETL_STATIC_ASSERT(
sizeof(T) <= (Size - Offset),
"Size of type too large for storage");
281 return *
reinterpret_cast<const T*
>(buffer.raw + Offset);
288 static ETL_CONSTEXPR
size_t size()
326 template <
size_t Size_,
size_t Alignment_>
327 ETL_CONSTANT
size_t mem_cast<Size_, Alignment_>::Size;
329 template <
size_t Size_,
size_t Alignment_>
330 ETL_CONSTANT
size_t mem_cast<Size_, Alignment_>::Alignment;
345 : pbuffer(ETL_NULLPTR)
346 , buffer_size(Undefined_Size)
355 , buffer_size(buffer_size_)
363 : pbuffer(other.pbuffer)
364 , buffer_size(other.buffer_size)
373 pbuffer = rhs.pbuffer;
374 buffer_size = rhs.buffer_size;
382 template <
typename T>
388 ::new (pbuffer) T(value);
394 template <
typename T>
398 char* p = pbuffer + offset;
407 template <
typename T,
size_t Offset>
411 char* p = pbuffer + Offset;
421 template <
typename T,
typename... TArgs>
422 T& emplace(TArgs... args)
427 ::new (pbuffer) T(etl::forward<TArgs>(args)...);
435 template <
typename T,
typename... TArgs>
436 T& emplace_at_offset(
size_t offset, TArgs... args)
439 char* p = pbuffer + offset;
442 ::new (p) T(etl::forward<TArgs>(args)...);
444 return ref_at_offset<T>(offset);
450 template <
typename T,
size_t Offset,
typename... TArgs>
451 T& emplace_at_offset(TArgs... args)
453 ETL_ASSERT((pbuffer != ETL_NULLPTR), ETL_ERROR(etl::mem_cast_nullptr_exception));
454 char* p = pbuffer + Offset;
455 ETL_ASSERT(
sizeof(T) <= (buffer_size - Offset), ETL_ERROR(etl::mem_cast_size_exception));
457 ::new (p) T(etl::forward<TArgs>(args)...);
459 return ref_at_offset<T, Offset>();
466 template <
typename T>
473 T* p =
reinterpret_cast<T*
>(pbuffer);
481 template <
typename T>
488 const T* p =
reinterpret_cast<const T*
>(pbuffer);
496 template <
typename T>
503 T* p =
reinterpret_cast<T*
>(pbuffer + offset);
511 template <
typename T>
518 const T* p =
reinterpret_cast<const T*
>(pbuffer + offset);
526 template <
typename T,
size_t Offset>
533 T* p =
reinterpret_cast<T*
>(pbuffer + Offset);
541 template <
typename T,
size_t Offset>
548 const T* p =
reinterpret_cast<const T*
>(pbuffer + Offset);
570 const type p =
reinterpret_cast<type>(pbuffer);
578 void data(
char* pbuffer_,
size_t buffer_size_ = Undefined_Size)
581 buffer_size = buffer_size_;
613#if ETL_USING_CPP11 && !defined(ETL_MEM_CAST_FORCE_CPP03_IMPLEMENTATION)
614 template <
typename... TTypes>
617 template <
typename T1,
typename T2 = char,
typename T3 = char,
typename T4 = char,
typename T5 = char,
typename T6 = char,
typename T7 = char,
618 typename T8 = char,
typename T9 = char,
typename T10 = char,
typename T11 = char,
typename T12 = char,
typename T13 = char,
619 typename T14 = char,
typename T15 = char,
typename T16 =
char>
621 :
public etl::mem_cast< etl::largest<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>::size,
622 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:528
ETL_NODISCARD size_t size() const
Get the size of the buffer.
Definition mem_cast.h:557
ETL_NODISCARD char * data()
Get a pointer to the external buffer.
Definition mem_cast.h:588
ETL_NODISCARD const char * data() const
Get const a pointer to the external buffer.
Definition mem_cast.h:597
void assign_at_offset(size_t offset, const T &value)
Assign from value at offset.
Definition mem_cast.h:395
ETL_NODISCARD const T & ref_at_offset(size_t offset) const
Get a const reference to T at offset (dynamic).
Definition mem_cast.h:513
ETL_NODISCARD const T & ref_at_offset() const
Get a const reference to T at offset (static).
Definition mem_cast.h:543
ETL_NODISCARD T & ref_at_offset(size_t offset)
Get a reference to T at offset (dynamic).
Definition mem_cast.h:498
ETL_NODISCARD const T & ref() const
Get a const reference to T.
Definition mem_cast.h:483
mem_cast_ptr & operator=(const mem_cast_ptr &rhs)
Assignment operator.
Definition mem_cast.h:371
ETL_NODISCARD T & ref()
Get a reference to T.
Definition mem_cast.h:468
mem_cast_ptr(const mem_cast_ptr &other)
Copy construct.
Definition mem_cast.h:362
mem_cast_ptr(char *pbuffer_, size_t buffer_size_=Undefined_Size)
Construct with pointer to buffer and optional size.
Definition mem_cast.h:353
void assign(const T &value)
Assign from value.
Definition mem_cast.h:383
ETL_NODISCARD size_t alignment() const
Get the alignment of the buffer.
Definition mem_cast.h:566
void data(char *pbuffer_, size_t buffer_size_=Undefined_Size)
Set the pointer to the external buffer.
Definition mem_cast.h:578
void assign_at_offset(const T &value)
Assign from value at offset.
Definition mem_cast.h:408
mem_cast_ptr()
Default constructor.
Definition mem_cast.h:344
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:253
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:306
ETL_NODISCARD T & ref_at_offset(size_t offset)
Get a reference to T at offset (dynamic).
Definition mem_cast.h:241
ETL_NODISCARD T & ref()
Get a reference to T.
Definition mem_cast.h:217
static ETL_NODISCARD ETL_CONSTEXPR size_t alignment()
Get the alignment of the buffer.
Definition mem_cast.h:297
ETL_NODISCARD T & ref_at_offset()
Get a reference to T at offset (static).
Definition mem_cast.h:265
ETL_NODISCARD const T & ref_at_offset() const
Get a const reference to T at offset (static).
Definition mem_cast.h:277
ETL_NODISCARD const char * data() const
Get a const pointer to the internal buffer.
Definition mem_cast.h:315
static ETL_NODISCARD ETL_CONSTEXPR size_t size()
Get the size of the buffer.
Definition mem_cast.h:288
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:229
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:1133
#define ETL_ASSERT(b, e)
Definition error_handler.h:511
ETL_EXCEPTION_CONSTEXPR exception(string_type reason_, string_type, numeric_type)
Constructor.
Definition exception.h:81
Definition exception.h:59
Definition integral_limits.h:518
Definition smallest.h:205
bitset_ext
Definition absolute.h:40
Definition mem_cast.h:623