forked from Bananymous/banan-os
45 lines
714 B
C
45 lines
714 B
C
|
#pragma once
|
||
|
|
||
|
#include <BAN/Traits.h>
|
||
|
|
||
|
#include <stddef.h>
|
||
|
|
||
|
namespace BAN
|
||
|
{
|
||
|
|
||
|
template<integral T>
|
||
|
struct LittleEndian
|
||
|
{
|
||
|
constexpr operator T() const
|
||
|
{
|
||
|
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
||
|
return raw;
|
||
|
#else
|
||
|
T result { 0 };
|
||
|
for (size_t i = 0; i < sizeof(T); i++)
|
||
|
result = (result << 8) | ((raw >> (sizeof(T) - i - 1) * 8) & 0xFF);
|
||
|
return result;
|
||
|
#endif
|
||
|
}
|
||
|
T raw;
|
||
|
};
|
||
|
|
||
|
template<integral T>
|
||
|
struct BigEndian
|
||
|
{
|
||
|
constexpr operator T() const
|
||
|
{
|
||
|
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
||
|
return raw;
|
||
|
#else
|
||
|
T result { 0 };
|
||
|
for (size_t i = 0; i < sizeof(T); i++)
|
||
|
result = (result << 8) | ((raw >> (i * 8)) & 0xFF);
|
||
|
return result;
|
||
|
#endif
|
||
|
}
|
||
|
private:
|
||
|
T raw;
|
||
|
};
|
||
|
|
||
|
}
|