11#include "platforms/is_platform.h"
26 #define FL_ALIGNAS(N) __attribute__((aligned(4)))
27#elif defined(__GNUC__) && !defined(__clang__) && (__GNUC__ * 100 + __GNUC_MINOR__) < 500
29 #define FL_ALIGNAS(N) __attribute__((aligned(N)))
32 #define FL_ALIGNAS(N) alignas(N)
39 #define FL_ALIGN_BYTES 8
40 #define FL_ALIGN FL_ALIGNAS(FL_ALIGN_BYTES)
42 #define FL_ALIGN_BYTES 1
53 #define FL_ALIGN_AS(T)
54#elif defined(__EMSCRIPTEN__)
56 #define FL_ALIGN_AS(T)
59 #define FL_ALIGN_AS(T) __attribute__((aligned(4)))
60#elif defined(__GNUC__) && !defined(__clang__) && (__GNUC__ * 100 + __GNUC_MINOR__) < 500
63 #define FL_ALIGN_AS(T) __attribute__((aligned(__alignof__(T))))
66 #define FL_ALIGN_AS(T) alignas(alignof(T))
80 #define FL_ALIGN_MAX __attribute__((aligned(4)))
81#elif defined(__GNUC__) && !defined(__clang__) && (__GNUC__ * 100 + __GNUC_MINOR__) < 500
84 #define FL_ALIGN_MAX __attribute__((aligned(8)))
87 #define FL_ALIGN_MAX alignas(max_align_t)
100 #define FL_ALIGN_AS_T(expr)
101#elif defined(__EMSCRIPTEN__)
103 #define FL_ALIGN_AS_T(expr)
104#elif defined(ESP8266)
106 #define FL_ALIGN_AS_T(expr) __attribute__((aligned(4)))
107#elif defined(__GNUC__) && !defined(__clang__) && (__GNUC__ * 100 + __GNUC_MINOR__) < 500
110 #define FL_ALIGN_AS_T(expr) __attribute__((aligned(8)))
113 #define FL_ALIGN_AS_T(expr) alignas(expr)
125template <fl::
size_t N,
typename T>
127#if defined(FL_IS_AVR)
129#elif defined(FL_IS_CLANG) || defined(FL_IS_GCC)
130 return static_cast<T *
>(__builtin_assume_aligned(ptr, N));
131#elif defined(FL_IS_WIN_MSVC)
134 __assume(((
char *)ptr - (
char *)0) % N == 0);
141template <fl::
size_t N,
typename T>
143#if defined(FL_IS_AVR)
145#elif defined(FL_IS_CLANG) || defined(FL_IS_GCC)
146 return static_cast<const T *
>(__builtin_assume_aligned(ptr, N));
147#elif defined(FL_IS_WIN_MSVC)
148 __assume(((
const char *)ptr - (
const char *)0) % N == 0);
161template <
typename T, fl::
size_t N>
T & operator[](fl::size_t i) const FL_NOEXCEPT
aligned_ptr() FL_NOEXCEPT
aligned_ptr(T *p) FL_NOEXCEPT
T * get() const FL_NOEXCEPT
T * assume_aligned(T *ptr) FL_NOEXCEPT
Base definition for an LED controller.