36 #define MARK_USED(X) ((void)(&(X)))
38 template <const
bool mustBeTrue>
39 inline void COMPILATION_REQUIREMENT()
41 typedef char errorIfFalse[mustBeTrue == 0 ? -1 : 1];
52 inline u64 HexU64(
const u32 hi,
const u32 lo) {
53 return ((((u64) hi)<<32)|lo);
63 inline u64 DecU64(
const u32 billions,
const u32 millions) {
64 return ((((u64) billions)*1000000000) + millions);
67 inline s32 _SignExtend32(u32 val, u32 bitwidth) {
68 return ((s32)(val<<(32-bitwidth)))>>(32-bitwidth);
71 inline s64 _SignExtend64(u64 val, u32 bitwidth) {
72 return ((s64)(val<<(64-bitwidth)))>>(64-bitwidth);
75 inline u32 _GetNOnes32(u32 bitwidth) {
76 return (bitwidth >= 32) ? (u32) -1 : (((u32)1)<<bitwidth)-1;
79 inline u64 _GetNOnes64(u32 bitwidth) {
80 return (bitwidth >= 64) ? HexU64((u32)-1,(u32)-1) : (((u64)1)<<bitwidth)-1;
83 inline u32 _ShiftToBitNumber32(u32 value, u32 bitpos) {
87 inline u64 _ShiftToBitNumber64(u32 value, u32 bitpos) {
88 return ((u64) value)<<bitpos;
91 inline u32 _ShiftFromBitNumber32(u32 value, u32 bitpos) {
95 inline u64 _ShiftFromBitNumber64(u64 value, u32 bitpos) {
99 inline u32 _GetMask32(u32 bitpos, u32 bitwidth) {
100 return _ShiftToBitNumber32(_GetNOnes32(bitwidth),bitpos);
103 inline u64 _GetMask64(u32 bitpos, u32 bitwidth) {
104 return _ShiftToBitNumber64(_GetNOnes64(bitwidth),bitpos);
107 inline u32 _ExtractField32(u32 val, u32 bitpos,u32 bitwidth) {
108 return _ShiftFromBitNumber32(val,bitpos)&_GetNOnes32(bitwidth);
111 inline u32 _ExtractUint32(u32 val, u32 bitpos,u32 bitwidth) {
112 return _ExtractField32(val,bitpos,bitwidth);
115 inline s32 _ExtractSint32(u32 val, u32 bitpos,u32 bitwidth) {
116 return _SignExtend32(_ExtractField32(val,bitpos,bitwidth),bitwidth);
119 inline u32 _getParity32(u32 v) {
124 return (0x6996 >> v) & 1;
128 inline u32 _getNextPowerOf2(u32 v) {
141 inline u32 MakeMaskClip(
const u32 length) {
142 if (length<32)
return (1u << length) - 1;
146 inline u32 PopCount(
const u32 bits) {
147 return __builtin_popcount(bits);
151 inline T MAX(T x, T y) {
152 return (x > y) ? x : y;
156 inline T MIN(T x, T y) {
157 return (x < y) ? x : y;
161 inline T CLAMP(T min, T max, T val)
163 return val < min ? min : (val > max ? max : val);
169 return val > 0 ? val : (-val);
173 inline double DISTANCE(T x1, T y1, T x2, T y2)
175 return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
179 inline u32 PARITY_BITS(u32 value)
181 return PARITY_BITS<BITS/2>(value ^ (value>>(BITS/2)));
185 inline u32 PARITY_BITS<1>(u32 value) {
190 inline u32 PARITY_BITS<2>(u32 value) {
191 return (value^(value>>1))&1;
195 inline u32 PARITY_BITS<3>(u32 value) {
196 return (0x96 >> (value&0x3)) & 1;
200 inline u32 PARITY_BITS<4>(u32 value)
214 return (0x6996>>(value&0xf))&1;
218 inline u32 PARITY(T value) {
219 return PARITY_BITS<8*sizeof(T)>((u32) value);
222 template<u32 MIN_BITS>
227 MIN_BITS <= 16 ? 16 :
228 MIN_BITS <= 32 ? 32 :
238 NUMBER <= 0xffff ? 16 :
239 NUMBER <= 0xffffffff ? 32 :
276 u32 ITEM_COUNT(T* array, T item, u32 arrSize)
280 for(i = 0; i < arrSize; i++)
299 extern u32 DigitCount(u32 num, u32 base);
308 extern void IntLexEncode(u32 num,
char* output);
323 extern void Sleep(u32 seconds, u64 nanos) ;