31#ifndef ETL_MEM_CAST_INCLUDED
32#define ETL_MEM_CAST_INCLUDED
36#include "static_assert.h"
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");
124 template <
size_t Other_Size,
size_t Other_Alignment>
127 ETL_STATIC_ASSERT(Size >=
Other_Size,
"RHS size is too large");
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>
176 ETL_STATIC_ASSERT(Size >=
sizeof(
T),
"Type size is too large");
189 char* p =
static_cast<char*
>(buffer.raw) + offset;
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");
208 return ref_at_offset<T, Offset>();
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)
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>
425 template <
typename T,
typename... TArgs>
426 T& emplace_at_offset(
size_t offset, TArgs... args)
429 char* p = pbuffer + offset;
434 return ref_at_offset<T>(offset);
440 template <
typename T,
size_t Offset,
typename... TArgs>
441 T& emplace_at_offset(TArgs... args)
444 char* p = pbuffer + Offset;
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);
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 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:326
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:1141
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
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:38
Definition mem_cast.h:603
pair holds two objects of arbitrary type
Definition utility.h:164