annotate foosdk/sdk/pfc/byte_order.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 void byteswap_raw(void * p_buffer,t_size p_bytes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 template<typename T> T byteswap_t(T p_source);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 template<> inline char byteswap_t<char>(char p_source) {return p_source;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 template<> inline unsigned char byteswap_t<unsigned char>(unsigned char p_source) {return p_source;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 template<> inline signed char byteswap_t<signed char>(signed char p_source) {return p_source;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 template<typename T> T byteswap_int_t(T p_source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 enum { width = sizeof(T) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 typedef typename sized_int_t<width>::t_unsigned tU;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 tU in = p_source, out = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 for(unsigned walk = 0; walk < width; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 out |= ((in >> (walk * 8)) & 0xFF) << ((width - 1 - walk) * 8);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 return out;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 #ifdef _MSC_VER//does this even help with performance/size?
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 template<> inline wchar_t byteswap_t<wchar_t>(wchar_t p_source) {return _byteswap_ushort(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 template<> inline short byteswap_t<short>(short p_source) {return _byteswap_ushort(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 template<> inline unsigned short byteswap_t<unsigned short>(unsigned short p_source) {return _byteswap_ushort(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 template<> inline int byteswap_t<int>(int p_source) {return _byteswap_ulong(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 template<> inline unsigned int byteswap_t<unsigned int>(unsigned int p_source) {return _byteswap_ulong(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 template<> inline long byteswap_t<long>(long p_source) {return _byteswap_ulong(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 template<> inline unsigned long byteswap_t<unsigned long>(unsigned long p_source) {return _byteswap_ulong(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 template<> inline long long byteswap_t<long long>(long long p_source) {return _byteswap_uint64(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 template<> inline unsigned long long byteswap_t<unsigned long long>(unsigned long long p_source) {return _byteswap_uint64(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 template<> inline wchar_t byteswap_t<wchar_t>(wchar_t p_source) {return byteswap_int_t(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 template<> inline short byteswap_t<short>(short p_source) {return byteswap_int_t(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 template<> inline unsigned short byteswap_t<unsigned short>(unsigned short p_source) {return byteswap_int_t(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 template<> inline int byteswap_t<int>(int p_source) {return byteswap_int_t(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 template<> inline unsigned int byteswap_t<unsigned int>(unsigned int p_source) {return byteswap_int_t(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 template<> inline long byteswap_t<long>(long p_source) {return byteswap_int_t(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 template<> inline unsigned long byteswap_t<unsigned long>(unsigned long p_source) {return byteswap_int_t(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 template<> inline long long byteswap_t<long long>(long long p_source) {return byteswap_int_t(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 template<> inline unsigned long long byteswap_t<unsigned long long>(unsigned long long p_source) {return byteswap_int_t(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 template<> inline float byteswap_t<float>(float p_source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 float ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 *(t_uint32*) &ret = byteswap_t(*(const t_uint32*)&p_source );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 template<> inline double byteswap_t<double>(double p_source) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 double ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 *(t_uint64*) &ret = byteswap_t(*(const t_uint64*)&p_source );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 //blargh at GUID byteswap issue
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 template<> inline GUID byteswap_t<GUID>(GUID p_guid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 GUID ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 ret.Data1 = pfc::byteswap_t(p_guid.Data1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 ret.Data2 = pfc::byteswap_t(p_guid.Data2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 ret.Data3 = pfc::byteswap_t(p_guid.Data3);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 ret.Data4[0] = p_guid.Data4[0];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 ret.Data4[1] = p_guid.Data4[1];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 ret.Data4[2] = p_guid.Data4[2];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 ret.Data4[3] = p_guid.Data4[3];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 ret.Data4[4] = p_guid.Data4[4];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 ret.Data4[5] = p_guid.Data4[5];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 ret.Data4[6] = p_guid.Data4[6];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 ret.Data4[7] = p_guid.Data4[7];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 #if ! defined(_MSC_VER) || _MSC_VER >= 1900
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 template<> inline char16_t byteswap_t<char16_t>(char16_t v) { return (char16_t)byteswap_t((uint16_t)v); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 template<> inline char32_t byteswap_t<char32_t>(char32_t v) { return (char32_t)byteswap_t((uint32_t)v); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 #ifdef _MSC_VER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 // No MSVC platform is ever big endian
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 #define PFC_BYTE_ORDER_IS_BIG_ENDIAN 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 #else//_MSC_VER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 #if defined(__APPLE__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 #include <architecture/byte_order.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 #include <endian.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 #if __BYTE_ORDER == __LITTLE_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 #define PFC_BYTE_ORDER_IS_BIG_ENDIAN 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 #define PFC_BYTE_ORDER_IS_BIG_ENDIAN 1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 #endif//_MSC_VER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 #ifdef PFC_BYTE_ORDER_IS_BIG_ENDIAN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 #define PFC_BYTE_ORDER_IS_LITTLE_ENDIAN (!(PFC_BYTE_ORDER_IS_BIG_ENDIAN))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 #error please update byte order #defines
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 static constexpr bool byte_order_is_big_endian = !!PFC_BYTE_ORDER_IS_BIG_ENDIAN;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 static constexpr bool byte_order_is_little_endian = !!PFC_BYTE_ORDER_IS_LITTLE_ENDIAN;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 template<typename T> T byteswap_if_be_t(T p_param) {return byte_order_is_big_endian ? byteswap_t(p_param) : p_param;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 template<typename T> T byteswap_if_le_t(T p_param) {return byte_order_is_little_endian ? byteswap_t(p_param) : p_param;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 namespace byte_order {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 #if PFC_BYTE_ORDER_IS_BIG_ENDIAN//big endian
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 template<typename T> inline void order_native_to_le_t(T& param) {param = pfc::byteswap_t(param);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 template<typename T> inline void order_native_to_be_t(T& param) { (void)param; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 template<typename T> inline void order_le_to_native_t(T& param) {param = pfc::byteswap_t(param);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 template<typename T> inline void order_be_to_native_t(T& param) { (void)param; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 #else//little endian
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 template<typename T> inline void order_native_to_le_t(T& param) { (void)param; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 template<typename T> inline void order_native_to_be_t(T& param) {param = pfc::byteswap_t(param);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 template<typename T> inline void order_le_to_native_t(T& param) { (void)param; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 template<typename T> inline void order_be_to_native_t(T& param) {param = pfc::byteswap_t(param);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 template<typename TInt,unsigned width,bool IsBigEndian>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 class __EncodeIntHelper {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 inline static void Run(TInt p_value,t_uint8 * p_out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 *p_out = (t_uint8)(p_value);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 __EncodeIntHelper<TInt,width-1,IsBigEndian>::Run(p_value >> 8,p_out + (IsBigEndian ? -1 : 1));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 template<typename TInt,bool IsBigEndian>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 class __EncodeIntHelper<TInt,1,IsBigEndian> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 inline static void Run(TInt p_value,t_uint8* p_out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 *p_out = (t_uint8)(p_value);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 template<typename TInt,bool IsBigEndian>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 class __EncodeIntHelper<TInt,0,IsBigEndian> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 inline static void Run(TInt,t_uint8*) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 template<typename TInt>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 inline void encode_little_endian(t_uint8 * p_buffer,TInt p_value) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 __EncodeIntHelper<TInt,sizeof(TInt),false>::Run(p_value,p_buffer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 template<typename TInt>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 inline void encode_big_endian(t_uint8 * p_buffer,TInt p_value) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 __EncodeIntHelper<TInt,sizeof(TInt),true>::Run(p_value,p_buffer + (sizeof(TInt) - 1));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 template<typename TInt,unsigned width,bool IsBigEndian>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 class __DecodeIntHelper {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 inline static TInt Run(const t_uint8 * p_in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 return (__DecodeIntHelper<TInt,width-1,IsBigEndian>::Run(p_in + (IsBigEndian ? -1 : 1)) << 8) + *p_in;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 template<typename TInt,bool IsBigEndian>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 class __DecodeIntHelper<TInt,1,IsBigEndian> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 inline static TInt Run(const t_uint8* p_in) {return *p_in;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 template<typename TInt,bool IsBigEndian>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 class __DecodeIntHelper<TInt,0,IsBigEndian> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 inline static TInt Run(const t_uint8*) {return 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 template<typename TInt>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 inline void decode_little_endian(TInt & p_out,const t_uint8 * p_buffer) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 p_out = __DecodeIntHelper<TInt,sizeof(TInt),false>::Run(p_buffer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 template<typename TInt>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 inline void decode_big_endian(TInt & p_out,const t_uint8 * p_buffer) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 p_out = __DecodeIntHelper<TInt,sizeof(TInt),true>::Run(p_buffer + (sizeof(TInt) - 1));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 template<typename TInt>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 inline TInt decode_little_endian(const t_uint8 * p_buffer) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 TInt temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 decode_little_endian(temp,p_buffer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 return temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 template<typename TInt>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 inline TInt decode_big_endian(const t_uint8 * p_buffer) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 TInt temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 decode_big_endian(temp,p_buffer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 return temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 template<bool IsBigEndian,typename TInt>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 inline void decode_endian(TInt & p_out,const t_uint8 * p_buffer) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 if (IsBigEndian) decode_big_endian(p_out,p_buffer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 else decode_little_endian(p_out,p_buffer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 template<bool IsBigEndian,typename TInt>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 inline void encode_endian(t_uint8 * p_buffer,TInt p_in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 if (IsBigEndian) encode_big_endian(p_in,p_buffer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 else encode_little_endian(p_in,p_buffer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 template<unsigned width>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 inline void reverse_bytes(t_uint8 * p_buffer) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 pfc::swap_t(p_buffer[0],p_buffer[width-1]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 reverse_bytes<width-2>(p_buffer+1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 template<> inline void reverse_bytes<1>(t_uint8 * ) { }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 template<> inline void reverse_bytes<0>(t_uint8 * ) { }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 inline int32_t readInt24(const void * mem) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 const uint8_t * p = (const uint8_t*) mem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 int32_t ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 if (byte_order_is_little_endian) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 ret = p[0];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 ret |= (uint32_t)p[1] << 8;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 ret |= (int32_t)(int8_t)p[2] << 16;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 ret = p[2];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 ret |= (uint32_t)p[1] << 8;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 ret |= (int32_t)(int8_t)p[0] << 16;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255