I would change this:
static constexpr uint8_t endianValues[4] = {0, 1, 2, 3};
To this:
static const uint32_t value = HL_LITTLE_ENDIAN; // 0x03020100
static const uint8_t* endianValues = (uint8_t*)&value;
Alternatively, you can change the getEndianOrder
function to read the endianValues
array as a uint32
, but you will have to add a preprocessor directive (#pragma
) to make sure that it is placed in a memory address aligned to 4 bytes (and that by itself might yield some platform-dependency issues, which is pretty much in contrast with your goal here to begin with):
constexpr hl_endianness getEndianOrder()
{
switch (*(uint32_t*)endianValues))
{
case HL_LITTLE_ENDIAN: return HL_LITTLE_ENDIAN;
case HL_BIG_ENDIAN: return HL_BIG_ENDIAN;
case HL_PDP_ENDIAN: return HL_PDP_ENDIAN;
}
return HL_UNKNOWN_ENDIAN;
}