31#ifndef ETL_ENDIAN_INCLUDED
32#define ETL_ENDIAN_INCLUDED
40#if ETL_USING_CPP20 && ETL_USING_STL
49#if !defined(ETL_ENDIAN_NATIVE)
51 #if ETL_USING_CPP20 && ETL_USING_STL
52 #define ETL_ENDIAN_LITTLE std::endian::little
53 #define ETL_ENDIAN_BIG std::endian::big
54 #define ETL_ENDIAN_NATIVE std::endian::native
56 #elif defined(ETL_COMPILER_IAR) && defined(__LITTLE_ENDIAN__)
57 #define ETL_ENDIAN_LITTLE 0
58 #define ETL_ENDIAN_BIG 1
59 #if __LITTLE_ENDIAN__ == 1
60 #define ETL_ENDIAN_NATIVE ETL_ENDIAN_LITTLE
61 #elif __LITTLE_ENDIAN__ == 0
62 #define ETL_ENDIAN_NATIVE ETL_ENDIAN_BIG
65 #elif defined(__BYTE_ORDER__)
67 #if defined(__ORDER_LITTLE_ENDIAN__)
68 #define ETL_ENDIAN_LITTLE __ORDER_LITTLE_ENDIAN__
69 #define ETL_ENDIAN_BIG __ORDER_BIG_ENDIAN__
70 #define ETL_ENDIAN_NATIVE __BYTE_ORDER__
71 #elif defined(__LITTLE_ENDIAN__)
72 #define ETL_ENDIAN_LITTLE __LITTLE_ENDIAN__
73 #define ETL_ENDIAN_BIG __BIG_ENDIAN__
74 #define ETL_ENDIAN_NATIVE __BYTE_ORDER__
78 #error Unable to determine native endianness at compile time. ETL_ENDIAN_NATIVE must be defined either as 0 for 'little endian' or 1 for 'big endian'.
82 #define ETL_ENDIAN_LITTLE 0
83 #define ETL_ENDIAN_BIG 1
87#if (ETL_USING_CPP11 && defined(ETL_ENDIAN_NATIVE))
88 #define ETL_HAS_CONSTEXPR_ENDIANNESS 1
90 #define ETL_HAS_CONSTEXPR_ENDIANNESS 0
103 little =
static_cast<int>(ETL_ENDIAN_LITTLE),
104 big =
static_cast<int>(ETL_ENDIAN_BIG),
105 native =
static_cast<int>(ETL_ENDIAN_NATIVE),
108 ETL_DECLARE_ENUM_TYPE(
endian,
int)
109 ETL_ENUM_TYPE(little,
"little")
110 ETL_ENUM_TYPE(big,
"big")
125#if ETL_HAS_CONSTEXPR_ENDIANNESS
133#if ETL_HAS_CONSTEXPR_ENDIANNESS
144#if ETL_HAS_CONSTEXPR_ENDIANNESS
147 return etl::endian::native;
152 static const uint32_t i = 0xFFFF0000;
154 return (*
reinterpret_cast<const unsigned char*
>(&i) == 0) ? etl::endian::little : etl::endian::big;
160 template <
typename T>
165 if (endianness::value() == endian::little)
176 template <
typename T>
181 if (endianness::value() == endian::little)
ETL_CONSTEXPR14 etl::enable_if< etl::is_integral< T >::value &&etl::is_unsigned< T >::value &&(etl::integral_limits< T >::bits==16U), T >::type reverse_bytes(T value)
Definition: binary.h:773
Definition: endianness.h:100
Definition: endianness.h:119
enable_if
Definition: type_traits_generator.h:1191
bitset_ext
Definition: absolute.h:38