OpenBarnyard
 
Loading...
Searching...
No Matches
Endianness.h
Go to the documentation of this file.
1#pragma once
2#include <cstdint>
3#include <bit>
4
11
12inline constexpr Endianess CURRENT_ENDIANESS =
13#ifdef TOSHI_SKU_WINDOWS
15#endif
16
17TFORCEINLINE constexpr TUINT32 SWAP32( const TUINT8 bytes[ 4 ] )
18{
19 return ( bytes[ 3 ] << 0 ) | ( bytes[ 2 ] << 8 ) | ( bytes[ 1 ] << 16 ) | ( bytes[ 0 ] << 24 );
20}
21
22TFORCEINLINE constexpr TUINT16 SWAP16( const TUINT8 bytes[ 2 ] )
23{
24 return ( bytes[ 1 ] << 0 ) | ( bytes[ 0 ] << 8 );
25}
26
27TFORCEINLINE TFLOAT SWAPFLOAT( const TUINT8 bytes[ 4 ] )
28{
29 TUINT32 result = SWAP32( bytes );
30 return *(TFLOAT*)( &result );
31}
32
33TFORCEINLINE TUINT32 PARSEDWORD( const TUINT32 value )
34{
35 if constexpr ( std::endian::native == std::endian::little ) return value;
36 else return SWAP32( (const TUINT8*)&value );
37}
38
39TFORCEINLINE TUINT32 PARSEDWORD( const TUINT8* value )
40{
41 if constexpr ( std::endian::native == std::endian::little ) return *(TUINT32*)value;
42 else return SWAP32( value );
43}
44
45TFORCEINLINE TUINT32 PARSEDWORD_BIG( const TUINT32 value )
46{
47 if constexpr ( std::endian::native == std::endian::little ) return SWAP32( (const TUINT8*)&value );
48 else return value;
49}
50
51TFORCEINLINE TUINT32 PARSEDWORD_BIG( const TUINT8* value )
52{
53 if constexpr ( std::endian::native == std::endian::little ) return SWAP32( value );
54 else return *(TUINT32*)value;
55}
56
57TFORCEINLINE TUINT16 PARSEWORD( TUINT16 value )
58{
59 if constexpr ( std::endian::native == std::endian::little ) return value;
60 else return SWAP16( (const TUINT8*)&value );
61}
62
63TFORCEINLINE TUINT16 PARSEWORD( const TUINT8* value )
64{
65 if constexpr ( std::endian::native == std::endian::little ) return *(TUINT16*)value;
66 else return SWAP16( value );
67}
68
69TFORCEINLINE TUINT32 PARSEWORD_BIG( TUINT32 value )
70{
71 if constexpr ( std::endian::native == std::endian::little ) return SWAP16( (const TUINT8*)&value );
72 else return value;
73}
74
75TFORCEINLINE TUINT32 PARSEWORD_BIG( const TUINT8* value )
76{
77 if constexpr ( std::endian::native == std::endian::little ) return SWAP16( value );
78 else return *(TUINT16*)value;
79}
80
81TFORCEINLINE TFLOAT PARSEFLOAT( TFLOAT value )
82{
83 if constexpr ( std::endian::native == std::endian::little ) return value;
84 else return SWAPFLOAT( (const TUINT8*)&value );
85}
86
87TFORCEINLINE TFLOAT PARSEFLOAT( const TUINT8* value )
88{
89 if constexpr ( std::endian::native == std::endian::little ) return *(TFLOAT*)value;
90 else return SWAPFLOAT( value );
91}
92
93TFORCEINLINE TFLOAT PARSEFLOAT_BIG( TFLOAT value )
94{
95 if constexpr ( std::endian::native == std::endian::little ) return SWAPFLOAT( (const TUINT8*)&value );
96 else return value;
97}
98
99TFORCEINLINE TFLOAT PARSEFLOAT_BIG( const TUINT8* value )
100{
101 if constexpr ( std::endian::native == std::endian::little ) return SWAPFLOAT( value );
102 else return *(TFLOAT*)value;
103}
104
105template <typename T>
106TFORCEINLINE T CONVERTENDIANESS( Endianess a_eEndianess, T a_numValue )
107{
108 switch ( a_eEndianess )
109 {
110 case Endianess_Little:
111 if constexpr ( sizeof( T ) == 4 )
112 return (T)PARSEDWORD( *(TUINT32*)( TREINTERPRETCAST( void*, &a_numValue ) ) );
113 else if constexpr ( sizeof( T ) == 2 )
114 return (T)PARSEWORD( *(TUINT16*)( TREINTERPRETCAST( void*, &a_numValue ) ) );
115 break;
116 case Endianess_Big:
117 if constexpr ( sizeof( T ) == 4 )
118 return (T)PARSEDWORD_BIG( *(TUINT32*)( TREINTERPRETCAST( void*, &a_numValue ) ) );
119 else if constexpr ( sizeof( T ) == 2 )
120 return (T)PARSEWORD_BIG( *(TUINT16*)( TREINTERPRETCAST( void*, &a_numValue ) ) );
121 break;
122 }
123
124 return a_numValue;
125}
#define TREINTERPRETCAST(TYPE, VALUE)
Definition Defines.h:68
#define TFORCEINLINE
Definition Defines.h:74
Endianess_
Definition Endianness.h:7
@ Endianess_Big
Definition Endianness.h:9
@ Endianess_Little
Definition Endianness.h:8
TUINT8 Endianess
Definition Endianness.h:5
uint16_t TUINT16
Definition Typedefs.h:15
uint8_t TUINT8
Definition Typedefs.h:17
float TFLOAT
Definition Typedefs.h:4
uint32_t TUINT32
Definition Typedefs.h:13