1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
| #pragma once
#include "Inline.h"
#include "Casting.h"
#ifndef COMPILE_TIME_ASSERT
#define COMPILE_TIME_ASSERT(name, cond) typedef char COMPILE_TIME_ASSERT_ ## name [ (cond) ? 1 : -1 ]
#endif
/*
"Standard" XtoYS functions :
Always work, regardless of current host endianness.
But, they may seem kind of slow, especially on big-endian hosts.
*/
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable: 4204)//Non-constant agregate initializer (MS extension)
#endif
/*--- Big-Endian ---*/
#pragma region Big-Endian
static CCPP_INLINE UINT16 HtoBES(UINT16 h)
{
UINT8 const c[2] = { HIBYTE(h), LOBYTE(h) };
COMPILE_TIME_ASSERT(SIZE, sizeof(c)==sizeof(h));
UINT16 const n = * REINTERPRET_CAST(UINT16 const *, &c);
return n;
}
static CCPP_INLINE UINT16 BEtoHS(UINT16 n)
{
UINT8 const * const c = REINTERPRET_CAST(UINT8 const *, &n);
UINT16 const h_high = c[0];
UINT16 const h_low = c[1];
return ((h_high << 8) | h_low);
}
static CCPP_INLINE UINT32 HtoBEL(UINT32 h)
{
UINT8 const c[4] = { HIBYTE(HIWORD(h)), LOBYTE(HIWORD(h)), HIBYTE(LOWORD(h)), LOBYTE(LOWORD(h)) };
COMPILE_TIME_ASSERT(SIZE, sizeof(c)==sizeof(h));
UINT32 const n = * REINTERPRET_CAST(UINT32 const *, &c);
return n;
}
static CCPP_INLINE UINT32 NtoBEL(UINT32 n)
{
UINT8 const * const c = REINTERPRET_CAST(UINT8 const *, &n);
UINT32 const h_highhigh = c[0];
UINT32 const h_highlow = c[1];
UINT32 const h_lowhigh = c[2];
UINT32 const h_lowlow = c[3];
return ((h_highhigh << 24) | (h_highlow << 16) | (h_lowhigh << 8) | h_lowlow);
}
#pragma endregion
/*--- Little-Endian ---*/
#pragma region Little-Endian
static CCPP_INLINE UINT16 HtoLES(UINT16 h)
{
UINT8 const c[2] = { LOBYTE(h), HIBYTE(h) };
COMPILE_TIME_ASSERT(SIZE, sizeof(c)==sizeof(h));
UINT16 const n = * REINTERPRET_CAST(UINT16 const *, &c);
return n;
}
static CCPP_INLINE UINT16 LEtoHS(UINT16 n)
{
UINT8 const * c = REINTERPRET_CAST(UINT8 const *, &n);
UINT16 const h_high = c[1];
UINT16 const h_low = c[0];
return ((h_high << 8) | h_low);
}
static CCPP_INLINE UINT32 HtoLEL(UINT32 h)
{
UINT8 const c[4] = { LOBYTE(LOWORD(h)), HIBYTE(LOWORD(h)), LOBYTE(HIWORD(h)), HIBYTE(HIWORD(h)) };
COMPILE_TIME_ASSERT(SIZE, sizeof(c)==sizeof(h));
UINT32 const n = * REINTERPRET_CAST(UINT32 const *, &c);
return n;
}
static CCPP_INLINE UINT32 NtoLEL(UINT32 n)
{
UINT8 const * c = REINTERPRET_CAST(UINT8 const *, &n);
UINT32 const h_highhigh = c[3];
UINT32 const h_highlow = c[2];
UINT32 const h_lowhigh = c[1];
UINT32 const h_lowlow = c[0];
return ((h_highhigh << 24) | (h_highlow << 16) | (h_lowhigh << 8) | h_lowlow);
}
#pragma endregion
#ifdef _MSC_VER
#pragma warning(pop)
#endif
/*Macros from "Network" byte order*/
#define HtoNS HtoBES
#define NtoHS BEtoHS
#define HtoNL HtoBEL
#define NtoHL BEtoHL |
Partager