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))
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>
176 ETL_STATIC_ASSERT(Size >=
sizeof(
T),
"Type size is too large");
184 template <
typename T,
typename... TArgs>
185 void emplace_at_offset(
size_t offset, TArgs... args)
187 char* p =
static_cast<char*
>(buffer) + offset;
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");
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)
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>
425 template <
typename T,
typename... TArgs>
426 void emplace_at_offset(
size_t offset, TArgs... args)
429 char* p = pbuffer + offset;
438 template <
typename T,
size_t Offset,
typename... TArgs>
439 void emplace_at_offset(TArgs... args)
442 char* p = pbuffer + Offset;
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);
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
ETL_NODISCARD const char * data() const
Get const a pointer to the external buffer.
Definition mem_cast.h:565
void assign_at_offset(size_t offset, const T &value)
Assign from value at offset.
Definition mem_cast.h:387
ETL_NODISCARD const T & ref_at_offset(size_t offset) const
Get a const reference to T at offset (dynamic)
Definition mem_cast.h:490
ETL_NODISCARD const T & ref_at_offset() const
Get a const reference to T at offset (static)
Definition mem_cast.h:516
ETL_NODISCARD T & ref_at_offset(size_t offset)
Get a reference to T at offset (dynamic)
Definition mem_cast.h:477
ETL_NODISCARD const T & ref() const
Get a const reference to T.
Definition mem_cast.h:465
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
ETL_NODISCARD const T & ref_at_offset(size_t offset) const
Get a const reference to T at offset (dynamic)
Definition mem_cast.h:245
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_at_offset(size_t offset)
Get a reference to T at offset (dynamic)
Definition mem_cast.h:232
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
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:307
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_NODISCARD const T & ref() const
Get a const reference to T.
Definition mem_cast.h:221
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:316
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
ETL_CONSTEXPR TContainer::size_type size(const TContainer &container)
Definition iterator.h:1187
Definition mem_cast.h:591
pair holds two objects of arbitrary type
Definition utility.h:164