31#ifndef ETL_ALIGNMENT_INCLUDED
32#define ETL_ALIGNMENT_INCLUDED
36#include "static_assert.h"
86 template <
size_t Alignment>
90 return (address % Alignment) == 0
U;
99 return is_aligned<etl::alignment_of<T>::value>(p);
102 namespace private_alignment
108 template <
bool Is_Match,
size_t Alignment,
typename... TRest>
109 class type_with_alignment_matcher;
112 template <
size_t Alignment,
typename T1,
typename... TRest>
113 class type_with_alignment_matcher<true, Alignment, T1, TRest...>
121 template <
size_t Alignment,
typename T1,
typename T2,
typename... TRest>
122 class type_with_alignment_matcher <false, Alignment, T1, T2, TRest...>
126 typedef typename type_with_alignment_matcher < Alignment <= etl::alignment_of<T2>::value , Alignment, T2, TRest... > ::type type;
130 template <
size_t Alignment,
typename T1>
131 class type_with_alignment_matcher <false, Alignment, T1>
141 template <
size_t Alignment,
typename T1,
typename... T>
142 class type_with_alignment_helper
146 typedef typename type_with_alignment_matcher<Alignment <= etl::alignment_of<T1>::value, Alignment, T1, T...>::type type;
152 template <
bool Is_Match,
const size_t Alignment,
typename T1 = void,
typename T2 = void,
typename T3 = void,
typename T4 = void,
153 typename T5 = void,
typename T6 = void,
typename T7 = void,
typename T8 =
void>
157 template <
size_t Alignment,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6,
typename T7,
typename T8>
166 template <
size_t Alignment,
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6,
typename T7,
typename T8>
175 template <
size_t Alignment>
186 template <
size_t Alignment,
typename T1,
typename T2 =
void,
typename T3 =
void,
typename T4 =
void,
201 template <
size_t Alignment>
207 typedef struct {
alignas(Alignment)
char dummy; } type;
209 #if ETL_NOT_USING_64BIT_TYPES
220 template <
size_t Alignment>
229 template <
size_t Length, const
size_t Alignment>
240 template <
typename T>
249 template <
typename T>
250 operator const T& ()
const
258 template <
typename T>
262 return reinterpret_cast<T*
>(data);
266 template <
typename T>
267 operator const T* ()
const
270 return reinterpret_cast<const T*
>(data);
274 template <
typename T>
283 template <
typename T>
292 template <
typename T>
296 return reinterpret_cast<T*
>(data);
300 template <
typename T>
304 return reinterpret_cast<const T*
>(data);
307#if ETL_USING_CPP11 && !defined(ETL_COMPILER_ARM5)
308 alignas(Alignment)
char data[
Length];
313 typename etl::type_with_alignment<Alignment>::type etl_alignment_type;
320 template <
size_t Length, const
size_t Alignment>
321 using aligned_storage_t =
typename aligned_storage<Length, Alignment>::type;
328 template <
size_t Length,
typename T>
334 template <
size_t Length,
typename T>
Memory misalignment exception.
Definition alignment.h:65
Exception base for alignment.
Definition alignment.h:52
Definition alignment.h:189
Definition alignment.h:154
Definition alignment.h:203
Definition alignment.h:231
Definition alignment.h:330
Definition exception.h:47
add_rvalue_reference
Definition type_traits_generator.h:1322
is_same
Definition type_traits_generator.h:1036
bitset_ext
Definition absolute.h:38
bool is_aligned(void *p, size_t required_alignment)
Check that 'p' has 'required_alignment'.
Definition alignment.h:77
Definition alignment.h:233
const T * get_address() const
Get address as const T pointer.
Definition alignment.h:301
T * get_address()
Get address as T pointer.
Definition alignment.h:293
const T & get_reference() const
Get address as const T reference.
Definition alignment.h:284
T & get_reference()
Get address as T reference.
Definition alignment.h:275
pair holds two objects of arbitrary type
Definition utility.h:164