TestBitTricks.cpp 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // Copyright (c) Electronic Arts Inc. All rights reserved.
  3. ///////////////////////////////////////////////////////////////////////////////
  4. #include <EAStdC/EABitTricks.h>
  5. #include <EAStdCTest/EAStdCTest.h>
  6. #include <EATest/EATest.h>
  7. #include <EAAssert/eaassert.h>
  8. struct OffsetofTest
  9. {
  10. uint32_t x0;
  11. uint32_t x1;
  12. };
  13. struct OffsetofTest1
  14. {
  15. uint32_t x[2];
  16. };
  17. struct A{ int a; };
  18. struct B{ int b; };
  19. struct C : public A, public B{ int c; };
  20. int TestBitTricks()
  21. {
  22. using namespace EA::StdC;
  23. int nErrorCount(0);
  24. EA::UnitTest::Report("TestBitTricks\n");
  25. int n1 = 0, n2 = 0;
  26. bool b = false;
  27. int i = 0;
  28. unsigned u = 0;
  29. int8_t i8 = 0;
  30. uint8_t u8 = 0;
  31. int16_t i16 = 0;
  32. uint16_t u16 = 0;
  33. int32_t i32 = 0;
  34. uint32_t u32 = 0;
  35. int64_t i64 = 0;
  36. uint64_t u64 = 0;
  37. // TurnOffLowestBit
  38. i16 = TurnOffLowestBit((int16_t)0x0005); // 000000101
  39. EATEST_VERIFY(i16 == 0x0004); // 000000100
  40. u16 = TurnOffLowestBit((uint16_t)0x0005);
  41. EATEST_VERIFY(u16 == 0x0004);
  42. i32 = TurnOffLowestBit((int32_t)0x00000058); // 01011000
  43. EATEST_VERIFY(i32 == 0x00000050); // 01010000
  44. u32 = TurnOffLowestBit((uint32_t)0x00000058);
  45. EATEST_VERIFY(u32 == 0x00000050);
  46. u32 = TurnOffLowestBit((uint32_t)0x00000000);
  47. EATEST_VERIFY(u32 == 0x00000000);
  48. // IsolateLowestBit
  49. i16 = IsolateLowestBit((int16_t)0x000C); // 1100
  50. EATEST_VERIFY(i16 == 0x0004); // 0100
  51. u16 = IsolateLowestBit((uint16_t)0x000C);
  52. EATEST_VERIFY(u16 == 0x0004);
  53. i32 = IsolateLowestBit((int32_t)0x00000058); // 01011000
  54. EATEST_VERIFY(i32 == 0x00000008); // 00001000
  55. u32 = IsolateLowestBit((uint32_t)0x00000058);
  56. EATEST_VERIFY(u32 == 0x00000008);
  57. u32 = IsolateLowestBit((uint32_t)0x00000000);
  58. EATEST_VERIFY(u32 == 0x00000000);
  59. // IsolateLowest0Bit
  60. i16 = IsolateLowest0Bit((int16_t)0x0003); // 0011
  61. EATEST_VERIFY(i16 == 0x0004); // 0100
  62. u16 = IsolateLowest0Bit((uint16_t)0x0003);
  63. EATEST_VERIFY(u16 == 0x0004);
  64. i32 = IsolateLowest0Bit((int32_t)0x000000a7); // 10100111
  65. EATEST_VERIFY(i32 == 0x00000008); // 00001000
  66. u32 = IsolateLowest0Bit((uint32_t)0x000000a7);
  67. EATEST_VERIFY(u32 == 0x00000008);
  68. u32 = IsolateLowest0Bit((uint32_t)0xffffffff);
  69. EATEST_VERIFY(u32 == 0x00000000);
  70. // GetTrailing0Bits
  71. i16 = GetTrailing0Bits((int16_t)0x000C); // 1100
  72. EATEST_VERIFY(i16 == 0x0003); // 0011
  73. u16 = GetTrailing0Bits((uint16_t)0x000C);
  74. EATEST_VERIFY(u16 == 0x0003);
  75. i32 = GetTrailing0Bits((int32_t)0x00000058); // 01011000
  76. EATEST_VERIFY(i32 == 0x00000007); // 00000111
  77. u32 = GetTrailing0Bits((uint32_t)0x00000058);
  78. EATEST_VERIFY(u32 == 0x00000007);
  79. u32 = GetTrailing0Bits((uint32_t)0xffffffff);
  80. EATEST_VERIFY(u32 == 0x00000000);
  81. // GetTrailing1And0Bits
  82. i16 = GetTrailing1And0Bits((int16_t)0x000C); // 1100
  83. EATEST_VERIFY(i16 ==0x0007); // 0111
  84. u16 = GetTrailing1And0Bits((uint16_t)0x000C);
  85. EATEST_VERIFY(u16 == 0x0007);
  86. i32 = GetTrailing1And0Bits((int32_t)0x00000058); // 01011000
  87. EATEST_VERIFY(i32 == 0x0000000f); // 00001111
  88. u32 = GetTrailing1And0Bits((uint32_t)0x00000058);
  89. EATEST_VERIFY(u32 == 0x0000000f);
  90. u32 = GetTrailing1And0Bits((uint32_t)0xffffffff);
  91. EATEST_VERIFY(u32 == 0x00000001);
  92. // PropogateLowestBitDownward
  93. i16 = PropogateLowestBitDownward((int16_t)0x0004); // 0100
  94. EATEST_VERIFY(i16 == 0x007); // 0111
  95. u16 = PropogateLowestBitDownward((uint16_t)0x0004);
  96. EATEST_VERIFY(u16 == 0x007);
  97. i32 = PropogateLowestBitDownward((int32_t)0x00000058); // 01011000
  98. EATEST_VERIFY(i32 == 0x0000005f); // 01011111
  99. u32 = PropogateLowestBitDownward((uint32_t)0x00000058);
  100. EATEST_VERIFY(u32 == 0x0000005f);
  101. u32 = PropogateLowestBitDownward((uint32_t)0x00000000);
  102. EATEST_VERIFY(u32 == 0xffffffff);
  103. // TurnOffLowestContiguousBits
  104. i16 = TurnOffLowestContiguousBits((int16_t)0x000b); // 1011
  105. EATEST_VERIFY(i16 == 0x0008); // 1000
  106. u16 = TurnOffLowestContiguousBits((uint16_t)0x000b);
  107. EATEST_VERIFY(u16 == 0x0008);
  108. i32 = TurnOffLowestContiguousBits((int32_t)0x00000058); // 01011000
  109. EATEST_VERIFY(i32 == 0x00000040); // 01000000
  110. u32 = TurnOffLowestContiguousBits((uint32_t)0x00000058);
  111. EATEST_VERIFY(u32 == 0x00000040);
  112. u32 = TurnOffLowestContiguousBits((uint32_t)0xffffffff);
  113. EATEST_VERIFY(u32 == 0x00000000);
  114. u32 = TurnOffLowestContiguousBits((uint32_t)0x00000000);
  115. EATEST_VERIFY(u32 == 0x00000000);
  116. /// TurnOnLowest0Bit
  117. i16 = TurnOnLowest0Bit((int16_t)0x0003); // 0011
  118. EATEST_VERIFY(i16 == 0x0007); // 0111
  119. u16 = TurnOnLowest0Bit((uint16_t)0x0003);
  120. EATEST_VERIFY(u16 == 0x0007);
  121. i32 = TurnOnLowest0Bit((int32_t)0x000000a7); // 10100111
  122. EATEST_VERIFY(i32 == 0x000000af); // 10101111
  123. u32 = TurnOnLowest0Bit((uint32_t)0x000000a7);
  124. EATEST_VERIFY(u32 == 0x000000af);
  125. u32 = TurnOnLowest0Bit((uint32_t)0xffffffff);
  126. EATEST_VERIFY(u32 == 0xffffffff);
  127. // GetNextWithEqualBitCount
  128. u = 45;
  129. for(u64 = 0; u64 < UINT32_MAX; u64++)
  130. {
  131. unsigned u2;
  132. n1 = CountBits(u);
  133. u2 = GetNextWithEqualBitCount(u);
  134. if(u2 < u)
  135. break; // This function can only go up to max int.
  136. n2 = CountBits(u2);
  137. EATEST_VERIFY(n1 == n2);
  138. u = u2;
  139. }
  140. // IsolateSingleBits
  141. u = IsolateSingleBits((unsigned)0x2ba9aba3); // 00101011101010011010101110100011
  142. EATEST_VERIFY(u == 0x28282820); // 00101000001010000010100000100000
  143. // IsolateSingle0Bits
  144. u = IsolateSingle0Bits((unsigned)0x2ba9aba3); // 00101011101010011010101110100011
  145. EATEST_VERIFY(u == 0x14505440); // 00010100010100000101010001000000
  146. // IsolateSingle0And1Bits
  147. u = IsolateSingle0And1Bits(0xabababab); // 10101011101010111010101110101011
  148. EATEST_VERIFY(u == 0xfc7c7c7c); // 11111100011111000111110001111100
  149. // ShiftRightSigned
  150. i32 = ShiftRightSigned((int32_t)0xc0000000, 2); // 11000000 00000000 00000000 00000000
  151. EATEST_VERIFY(i32 == (int32_t)0xf0000000); // 11110000 00000000 00000000 00000000
  152. i32 = ShiftRightSigned((int32_t)0x00000000, 2); // 00000000 00000000 00000000 00000000
  153. EATEST_VERIFY(i32 == 0x00000000); // 00000000 00000000 00000000 00000000
  154. // CountTrailing0Bits
  155. i = CountTrailing0Bits((uint32_t)0x00000000); // 00000000 00000000 00000000 00000000
  156. EATEST_VERIFY(i == 32);
  157. i = CountTrailing0Bits((uint32_t)0x000000a8); // 00000000 00000000 00000000 10101000
  158. EATEST_VERIFY(i == 3);
  159. i = CountTrailing0Bits((uint32_t)0xffffffff); // 11111111 11111111 11111111 11111111
  160. EATEST_VERIFY(i == 0);
  161. // CountLeading0Bits
  162. i = CountLeading0Bits((uint32_t)0x00000000); // 00000000 00000000 00000000 00000000
  163. EATEST_VERIFY(i == 32);
  164. i = CountLeading0Bits((uint32_t)0x37000000); // 00110111 00000000 00000000 00000000
  165. EATEST_VERIFY(i == 2);
  166. i = CountLeading0Bits((uint32_t)0xffffffff); // 11111111 11111111 11111111 11111111
  167. EATEST_VERIFY(i == 0);
  168. // CountTrailing0Bits
  169. i = CountTrailing0Bits(UINT64_C(0x0000000000000000)); // 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  170. EATEST_VERIFY(i == 64);
  171. i = CountTrailing0Bits(UINT64_C(0x00000000000000a8)); // 00000000 00000000 00000000 00000000 00000000 00000000 00000000 10101000
  172. EATEST_VERIFY(i == 3);
  173. i = CountTrailing0Bits(UINT64_C(0x0f00000000000000)); // 00001111 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  174. EATEST_VERIFY(i == 56);
  175. i = CountTrailing0Bits(UINT64_C(0xffffffffffffffff)); // 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
  176. EATEST_VERIFY(i == 0);
  177. // CountLeading0Bits
  178. i = CountLeading0Bits(UINT64_C(0x0000000000000000)); // 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  179. EATEST_VERIFY(i == 64);
  180. i = CountLeading0Bits(UINT64_C(0x0000000037000000)); // 00000000 00000000 00000000 00000000 00110111 00000000 00000000 00000000
  181. EATEST_VERIFY(i == 34);
  182. i = CountLeading0Bits(UINT64_C(0x0f00000000000000)); // 00000000 11111111 00000000 00000000 00000000 00000000 00000000 00000000
  183. EATEST_VERIFY(i == 4);
  184. i = CountLeading0Bits(UINT64_C(0xffffffffffffffff)); // 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
  185. EATEST_VERIFY(i == 0);
  186. // CountBits
  187. i = CountBits(0x11001010);
  188. EATEST_VERIFY(i == 4);
  189. i = CountBits64(UINT64_C(0x1100101011001010));
  190. EATEST_VERIFY(i == 8);
  191. i = CountBits64(UINT64_C(0xEBADD76DEBADD76D));
  192. EATEST_VERIFY(i == 44);
  193. // RotateLeft
  194. u32 = RotateLeft(0xf0000000, 2); // 11110000 00000000 00000000 00000000
  195. EATEST_VERIFY(u32 == 0xc0000003); // 11000000 00000000 00000000 00000011
  196. // RotateRight
  197. u32 = RotateRight(0xf0000000, 2); // 11110000 00000000 00000000 00000000
  198. EATEST_VERIFY(u32 == 0x3c000000); // 00111100 00000000 00000000 00000000
  199. // ReverseBits
  200. u32 = ReverseBits(0xe0000001); // 11100000 00000000 00000000 00000001
  201. EATEST_VERIFY(u32 == 0x80000007); // 10000000 00000000 00000000 00000111
  202. u64 = ReverseBits(UINT64_C(0xE00CE00400000001)); // 11100000 00001100 11100000 00000100 00000000 00000000 00000000 00000001
  203. EATEST_VERIFY(u64 == UINT64_C(0x8000000020073007)); // 10000000 00000000 00000000 00000000 00100000 00000111 00110000 00000111
  204. // IsolateHighestBit
  205. u32 = IsolateHighestBit(UINT32_C(0x00000044)); // 01000100
  206. EATEST_VERIFY(u32 == 0x00000040); // 01000000
  207. u32 = IsolateHighestBit(UINT32_C(0x00000000));
  208. EATEST_VERIFY(u32 == 0x00000000);
  209. // IsolateHighest0Bit
  210. u32 = IsolateHighest0Bit(UINT32_C(0x44000000)); // 01000100 00000000 00000000 00000000
  211. EATEST_VERIFY(u32 == 0x80000000); // 10000000 00000000 00000000 00000000
  212. u32 = IsolateHighest0Bit(UINT32_C(0xffffffff)); // 11111111 11111111 11111111 11111111
  213. EATEST_VERIFY(u32 == 0x00000000); // 00000000 00000000 00000000 00000000
  214. // PropogateHighestBitDownward
  215. u32 = PropogateHighestBitDownward(UINT32_C(0x48000000)); // 01001000 00000000 00000000 00000000
  216. EATEST_VERIFY(u32 == 0x7FFFFFFF); // 01111111 11111111 11111111 11111111
  217. u32 = PropogateHighestBitDownward(UINT32_C(0x00000000)); // 00000000 00000000 00000000 00000000
  218. EATEST_VERIFY(u32 == 0x00000000); // 00000000 00000000 00000000 00000000
  219. // GetHighestContiguous0Bits
  220. u32 = GetHighestContiguous0Bits(UINT32_C(0x19000000)); // 00011001 00000000 00000000 00000000
  221. EATEST_VERIFY(u32 == 0xe0000000); // 11100000 00000000 00000000 00000000
  222. u32 = GetHighestContiguous0Bits(UINT32_C(0xff000000)); // 11111111 00000000 00000000 00000000
  223. EATEST_VERIFY(u32 == 0x00000000); // 00000000 00000000 00000000 00000000
  224. // GetBitwiseEquivalence
  225. u32 = GetBitwiseEquivalence((uint32_t)0x000000cc, (uint32_t)0x000000f0); // 11001100, 11110000
  226. EATEST_VERIFY(u32 == 0xffffffc3); // 11000011
  227. // AreLessThan2BitsSet
  228. b = AreLessThan2BitsSet((uint32_t)0x00001000);
  229. EATEST_VERIFY(b);
  230. b = AreLessThan2BitsSet((uint32_t)0x01001110);
  231. EATEST_VERIFY(!b);
  232. b = AreLessThan2BitsSet((uint64_t)0x00001000);
  233. EATEST_VERIFY(b);
  234. b = AreLessThan2BitsSet((uint64_t)0x01001110);
  235. EATEST_VERIFY(!b);
  236. b = AreLessThan2BitsSet((uint32_t)0);
  237. EATEST_VERIFY(b);
  238. b = AreLessThan2BitsSet((uint64_t)0);
  239. EATEST_VERIFY(b);
  240. // GetHighestBit
  241. u8 = GetHighestBit((uint8_t)0);
  242. EATEST_VERIFY(u8 == 0x80);
  243. u16 = GetHighestBit((uint16_t)0);
  244. EATEST_VERIFY(u16 == 0x8000);
  245. u32 = GetHighestBit((uint32_t)0);
  246. EATEST_VERIFY(u32 == 0x80000000);
  247. u64 = GetHighestBit((uint64_t)0);
  248. EATEST_VERIFY(u64 == UINT64_C(0x8000000000000000));
  249. // IsPowerOf2
  250. u8 = 0; // This version returns true for zero.
  251. b = IsPowerOf2(u8);
  252. EATEST_VERIFY(b);
  253. u8 = 37;
  254. b = IsPowerOf2(u8);
  255. EATEST_VERIFY(!b);
  256. u8 = 128;
  257. b = IsPowerOf2(u8);
  258. EATEST_VERIFY(b);
  259. u32 = 65537;
  260. b = IsPowerOf2(u32);
  261. EATEST_VERIFY(!b);
  262. u32 = 65536;
  263. b = IsPowerOf2(u32);
  264. EATEST_VERIFY(b);
  265. u32 = 0;
  266. b = IsPowerOf2(u32);
  267. EATEST_VERIFY(b);
  268. u64 = 0;
  269. b = IsPowerOf2(u64);
  270. EATEST_VERIFY(b);
  271. u64 = 65537;
  272. b = IsPowerOf2(u64);
  273. EATEST_VERIFY(!b);
  274. u64 = 65536;
  275. b = IsPowerOf2(u64);
  276. EATEST_VERIFY(b);
  277. // RoundUpToPowerOf2
  278. u32 = RoundUpToPowerOf2(UINT32_C(66));
  279. EATEST_VERIFY(u32 == 128);
  280. u32 = RoundUpToPowerOf2(UINT32_C(12));
  281. EATEST_VERIFY(u32 == 16);
  282. u32 = RoundUpToPowerOf2(UINT32_C(4));
  283. EATEST_VERIFY(u32 == 4);
  284. u32 = RoundUpToPowerOf2(UINT32_C(0));
  285. EATEST_VERIFY(u32 == 0);
  286. // IsMultipleOf
  287. b = IsMultipleOf<int, 4>(3);
  288. EATEST_VERIFY(!b);
  289. b = IsMultipleOf<int, 16>(32);
  290. EATEST_VERIFY(b);
  291. // IsPowerOf2Minus1
  292. b = IsPowerOf2Minus1((uint32_t)0x0000000f);
  293. EATEST_VERIFY(b);
  294. b = IsPowerOf2Minus1((uint32_t)0x0000000b);
  295. EATEST_VERIFY(!b);
  296. b = IsPowerOf2Minus1((uint32_t)0x00000000);
  297. EATEST_VERIFY(b);
  298. // CrossesPowerOf2
  299. b = CrossesPowerOf2((int)4, (int)5, (int)8);
  300. EATEST_VERIFY(!b);
  301. b = CrossesPowerOf2((int)5, (int)9, (int)8);
  302. EATEST_VERIFY(b);
  303. // CrossesPowerOf2
  304. b = CrossesPowerOf2<int, 8>(4, 5);
  305. EATEST_VERIFY(!b);
  306. b = CrossesPowerOf2<int, 8>(5, 9);
  307. EATEST_VERIFY(b);
  308. // GetHighestBitPowerOf2
  309. u32 = GetHighestBitPowerOf2((uint32_t)0);
  310. EATEST_VERIFY(u32 == 0);
  311. u32 = GetHighestBitPowerOf2((uint32_t)1);
  312. EATEST_VERIFY(u32 == 0);
  313. u32 = GetHighestBitPowerOf2((uint32_t)2);
  314. EATEST_VERIFY(u32 == 1);
  315. u32 = GetHighestBitPowerOf2((uint32_t)3);
  316. EATEST_VERIFY(u32 == 1);
  317. u32 = GetHighestBitPowerOf2((uint32_t)4);
  318. EATEST_VERIFY(u32 == 2);
  319. u32 = GetHighestBitPowerOf2((uint32_t)7);
  320. EATEST_VERIFY(u32 == 2);
  321. u32 = GetHighestBitPowerOf2((uint32_t)8);
  322. EATEST_VERIFY(u32 == 3);
  323. u32 = GetHighestBitPowerOf2((uint32_t)0xffffffff);
  324. EATEST_VERIFY(u32 == 31);
  325. u32 = GetHighestBitPowerOf2(UINT64_C(0x0000000000000000));
  326. EATEST_VERIFY(u32 == 0);
  327. u32 = GetHighestBitPowerOf2(UINT64_C(0x0000000000000001));
  328. EATEST_VERIFY(u32 == 0);
  329. u32 = GetHighestBitPowerOf2(UINT64_C(0x0000000000001010));
  330. EATEST_VERIFY(u32 == 12);
  331. u32 = GetHighestBitPowerOf2(UINT64_C(0x0000000001101010));
  332. EATEST_VERIFY(u32 == 24);
  333. u32 = GetHighestBitPowerOf2(UINT64_C(0x0000000010110111));
  334. EATEST_VERIFY(u32 == 28);
  335. u32 = GetHighestBitPowerOf2(UINT64_C(0x0000001010110111));
  336. EATEST_VERIFY(u32 == 36);
  337. u32 = GetHighestBitPowerOf2(UINT64_C(0x0001000010110111));
  338. EATEST_VERIFY(u32 == 48);
  339. u32 = GetHighestBitPowerOf2(UINT64_C(0x1100000010110111));
  340. EATEST_VERIFY(u32 == 60);
  341. // GetNextGreaterEven
  342. i = GetNextGreaterEven((int)-3);
  343. EATEST_VERIFY(i == -2);
  344. i = GetNextGreaterEven((int)-2);
  345. EATEST_VERIFY(i == 0);
  346. i = GetNextGreaterEven((int)-1);
  347. EATEST_VERIFY(i == 0);
  348. i = GetNextGreaterEven((int)0);
  349. EATEST_VERIFY(i == 2);
  350. i = GetNextGreaterEven((int)1);
  351. EATEST_VERIFY(i == 2);
  352. i = GetNextGreaterEven((int)2);
  353. EATEST_VERIFY(i == 4);
  354. i = GetNextGreaterEven((int)3);
  355. EATEST_VERIFY(i == 4);
  356. // GetNextGreaterOdd
  357. i = GetNextGreaterOdd((int)-3);
  358. EATEST_VERIFY(i == -1);
  359. i = GetNextGreaterOdd((int)-2);
  360. EATEST_VERIFY(i == -1);
  361. i = GetNextGreaterOdd((int)-1);
  362. EATEST_VERIFY(i == 1);
  363. i = GetNextGreaterOdd((int)0);
  364. EATEST_VERIFY(i == 1);
  365. i = GetNextGreaterOdd((int)1);
  366. EATEST_VERIFY(i == 3);
  367. i = GetNextGreaterOdd((int)2);
  368. EATEST_VERIFY(i == 3);
  369. i = GetNextGreaterOdd((int)3);
  370. EATEST_VERIFY(i == 5);
  371. // RoundUpTo
  372. i32 = RoundUpTo<int32_t, 4>(3);
  373. EATEST_VERIFY(i32 == 4);
  374. u32 = RoundUpTo<uint32_t, 4>(3);
  375. EATEST_VERIFY(u32 == 4);
  376. i8 = RoundUpTo<int8_t, 4>(3);
  377. EATEST_VERIFY(i8 == 4);
  378. u8 = RoundUpTo<uint8_t, 4>(3);
  379. EATEST_VERIFY(u8 == 4);
  380. i64 = RoundUpTo<int64_t, 4>(3);
  381. EATEST_VERIFY(i64 == 4);
  382. u64 = RoundUpTo<uint64_t, 4>(3);
  383. EATEST_VERIFY(u64 == 4);
  384. i32 = RoundUpTo<int32_t, 4>(8);
  385. EATEST_VERIFY(i32 == 8);
  386. u32 = RoundUpTo<uint32_t, 4>(8);
  387. EATEST_VERIFY(u32 == 8);
  388. i8 = RoundUpTo<int8_t, 4>(8);
  389. EATEST_VERIFY(i8 == 8);
  390. u8 = RoundUpTo<uint8_t, 4>(8);
  391. EATEST_VERIFY(u8 == 8);
  392. i64 = RoundUpTo<int64_t, 4>(8);
  393. EATEST_VERIFY(i64 == 8);
  394. u64 = RoundUpTo<uint64_t, 4>(8);
  395. EATEST_VERIFY(u64 == 8);
  396. i32 = RoundUpTo<int32_t, 4>(0);
  397. EATEST_VERIFY(i32 == 0);
  398. u32 = RoundUpTo<uint32_t, 4>(0);
  399. EATEST_VERIFY(u32 == 0);
  400. i8 = RoundUpTo<int8_t, 4>(0);
  401. EATEST_VERIFY(i8 == 0);
  402. u8 = RoundUpTo<uint8_t, 4>(0);
  403. EATEST_VERIFY(u8 == 0);
  404. i64 = RoundUpTo<int64_t, 4>(0);
  405. EATEST_VERIFY(i64 == 0);
  406. u64 = RoundUpTo<uint64_t, 4>(0);
  407. EATEST_VERIFY(u64 == 0);
  408. i32 = RoundUpTo<int32_t, 4>(-7);
  409. EATEST_VERIFY(i32 == -4);
  410. i8 = RoundUpTo<int8_t, 4>(-7);
  411. EATEST_VERIFY(i8 == -4);
  412. i64 = RoundUpTo<int64_t, 4>(-7);
  413. EATEST_VERIFY(i64 == -4);
  414. // RoundUpToEx
  415. i32 = RoundUpToEx<int32_t, 4>(3);
  416. EATEST_VERIFY(i32 == 4);
  417. u32 = RoundUpToEx<uint32_t, 4>(3);
  418. EATEST_VERIFY(u32 == 4);
  419. i8 = RoundUpToEx<int8_t, 4>(3);
  420. EATEST_VERIFY(i8 == 4);
  421. u8 = RoundUpToEx<uint8_t, 4>(3);
  422. EATEST_VERIFY(u8 == 4);
  423. i64 = RoundUpToEx<int64_t, 4>(3);
  424. EATEST_VERIFY(i64 == 4);
  425. u64 = RoundUpToEx<uint64_t, 4>(3);
  426. EATEST_VERIFY(u64 == 4);
  427. i32 = RoundUpToEx<int32_t, 4>(8);
  428. EATEST_VERIFY(i32 == 8);
  429. u32 = RoundUpToEx<uint32_t, 4>(8);
  430. EATEST_VERIFY(u32 == 8);
  431. i8 = RoundUpToEx<int8_t, 4>(8);
  432. EATEST_VERIFY(i8 == 8);
  433. u8 = RoundUpToEx<uint8_t, 4>(8);
  434. EATEST_VERIFY(u8 == 8);
  435. i64 = RoundUpToEx<int64_t, 4>(8);
  436. EATEST_VERIFY(i64 == 8);
  437. u64 = RoundUpToEx<uint64_t, 4>(8);
  438. EATEST_VERIFY(u64 == 8);
  439. i32 = RoundUpToEx<int32_t, 4>(0);
  440. EATEST_VERIFY(i32 == 0);
  441. u32 = RoundUpToEx<uint32_t, 4>(0);
  442. EATEST_VERIFY(u32 == 0);
  443. i8 = RoundUpToEx<int8_t, 4>(0);
  444. EATEST_VERIFY(i8 == 0);
  445. u8 = RoundUpToEx<uint8_t, 4>(0);
  446. EATEST_VERIFY(u8 == 0);
  447. i64 = RoundUpToEx<int64_t, 4>(0);
  448. EATEST_VERIFY(i64 == 0);
  449. u64 = RoundUpToEx<uint64_t, 4>(0);
  450. EATEST_VERIFY(u64 == 0);
  451. i32 = RoundUpToEx<int32_t, 4>(-7);
  452. EATEST_VERIFY(i32 == -8);
  453. i8 = RoundUpToEx<int8_t, 4>(-7);
  454. EATEST_VERIFY(i8 == -8);
  455. i64 = RoundUpToEx<int64_t, 4>(-7);
  456. EATEST_VERIFY(i64 == -8);
  457. // RoundDownTo
  458. i32 = RoundDownTo<int32_t, 4>(5);
  459. EATEST_VERIFY(i32 == 4);
  460. u32 = RoundDownTo<uint32_t, 4>(5);
  461. EATEST_VERIFY(u32 == 4);
  462. i8 = RoundDownTo<int8_t, 4>(5);
  463. EATEST_VERIFY(i8 == 4);
  464. u8 = RoundDownTo<uint8_t, 4>(5);
  465. EATEST_VERIFY(u8 == 4);
  466. i64 = RoundDownTo<int64_t, 4>(5);
  467. EATEST_VERIFY(i64 == 4);
  468. u64 = RoundDownTo<uint64_t, 4>(5);
  469. EATEST_VERIFY(u64 == 4);
  470. i32 = RoundDownTo<int32_t, 4>(4);
  471. EATEST_VERIFY(i32 == 4);
  472. u32 = RoundDownTo<uint32_t, 4>(4);
  473. EATEST_VERIFY(u32 == 4);
  474. i8 = RoundDownTo<int8_t, 4>(4);
  475. EATEST_VERIFY(i8 == 4);
  476. u8 = RoundDownTo<uint8_t, 4>(4);
  477. EATEST_VERIFY(u8 == 4);
  478. i64 = RoundDownTo<int64_t, 4>(4);
  479. EATEST_VERIFY(i64 == 4);
  480. u64 = RoundDownTo<uint64_t, 4>(4);
  481. EATEST_VERIFY(u64 == 4);
  482. i32 = RoundDownTo<int32_t, 4>(0);
  483. EATEST_VERIFY(i32 == 0);
  484. u32 = RoundDownTo<uint32_t, 4>(0);
  485. EATEST_VERIFY(u32 == 0);
  486. i8 = RoundDownTo<int8_t, 4>(0);
  487. EATEST_VERIFY(i8 == 0);
  488. u8 = RoundDownTo<uint8_t, 4>(0);
  489. EATEST_VERIFY(u8 == 0);
  490. i64 = RoundDownTo<int64_t, 4>(0);
  491. EATEST_VERIFY(i64 == 0);
  492. u64 = RoundDownTo<uint64_t, 4>(0);
  493. EATEST_VERIFY(u64 == 0);
  494. i32 = RoundDownTo<int32_t, 4>(-7);
  495. EATEST_VERIFY(i32 == -8);
  496. i8 = RoundDownTo<int8_t, 4>(-7);
  497. EATEST_VERIFY(i8 == -8);
  498. i64 = RoundDownTo<int64_t, 4>(-7);
  499. EATEST_VERIFY(i64 == -8);
  500. // RoundDownToEx
  501. i32 = RoundDownToEx<int32_t, 4>(5);
  502. EATEST_VERIFY(i32 == 4);
  503. u32 = RoundDownToEx<uint32_t, 4>(5);
  504. EATEST_VERIFY(u32 == 4);
  505. i8 = RoundDownToEx<int8_t, 4>(5);
  506. EATEST_VERIFY(i8 == 4);
  507. u8 = RoundDownToEx<uint8_t, 4>(5);
  508. EATEST_VERIFY(u8 == 4);
  509. i64 = RoundDownToEx<int64_t, 4>(5);
  510. EATEST_VERIFY(i64 == 4);
  511. u64 = RoundDownToEx<uint64_t, 4>(5);
  512. EATEST_VERIFY(u64 == 4);
  513. i32 = RoundDownToEx<int32_t, 4>(4);
  514. EATEST_VERIFY(i32 == 4);
  515. u32 = RoundDownToEx<uint32_t, 4>(4);
  516. EATEST_VERIFY(u32 == 4);
  517. i8 = RoundDownToEx<int8_t, 4>(4);
  518. EATEST_VERIFY(i8 == 4);
  519. u8 = RoundDownToEx<uint8_t, 4>(4);
  520. EATEST_VERIFY(u8 == 4);
  521. i64 = RoundDownToEx<int64_t, 4>(4);
  522. EATEST_VERIFY(i64 == 4);
  523. u64 = RoundDownToEx<uint64_t, 4>(4);
  524. EATEST_VERIFY(u64 == 4);
  525. i32 = RoundDownToEx<int32_t, 4>(0);
  526. EATEST_VERIFY(i32 == 0);
  527. u32 = RoundDownToEx<uint32_t, 4>(0);
  528. EATEST_VERIFY(u32 == 0);
  529. i8 = RoundDownToEx<int8_t, 4>(0);
  530. EATEST_VERIFY(i8 == 0);
  531. u8 = RoundDownToEx<uint8_t, 4>(0);
  532. EATEST_VERIFY(u8 == 0);
  533. i64 = RoundDownToEx<int64_t, 4>(0);
  534. EATEST_VERIFY(i64 == 0);
  535. u64 = RoundDownToEx<uint64_t, 4>(0);
  536. EATEST_VERIFY(u64 == 0);
  537. i32 = RoundDownToEx<int32_t, 4>(-7);
  538. EATEST_VERIFY(i32 == -4);
  539. i8 = RoundDownToEx<int8_t, 4>(-7);
  540. EATEST_VERIFY(i8 == -4);
  541. i64 = RoundDownToEx<int64_t, 4>(-7);
  542. EATEST_VERIFY(i64 == -4);
  543. // RoundUpToMultiple
  544. i32 = RoundUpToMultiple<int32_t, 6>(37);
  545. EATEST_VERIFY(i32 == 42);
  546. u32 = RoundUpToMultiple<uint32_t, 6>(37);
  547. EATEST_VERIFY(u32 == 42);
  548. i8 = RoundUpToMultiple<int8_t, 6>(37);
  549. EATEST_VERIFY(i8 == 42);
  550. u8 = RoundUpToMultiple<uint8_t, 6>(37);
  551. EATEST_VERIFY(u8 == 42);
  552. i64 = RoundUpToMultiple<int64_t, 6>(37);
  553. EATEST_VERIFY(i64 == 42);
  554. u64 = RoundUpToMultiple<uint64_t, 6>(37);
  555. EATEST_VERIFY(u64 == 42);
  556. i32 = RoundUpToMultiple<int32_t, 6>(41);
  557. EATEST_VERIFY(i32 == 42);
  558. u32 = RoundUpToMultiple<uint32_t, 6>(41);
  559. EATEST_VERIFY(u32 == 42);
  560. i8 = RoundUpToMultiple<int8_t, 6>(41);
  561. EATEST_VERIFY(i8 == 42);
  562. u8 = RoundUpToMultiple<uint8_t, 6>(41);
  563. EATEST_VERIFY(u8 == 42);
  564. i64 = RoundUpToMultiple<int64_t, 6>(41);
  565. EATEST_VERIFY(i64 == 42);
  566. u64 = RoundUpToMultiple<uint64_t, 6>(41);
  567. EATEST_VERIFY(u64 == 42);
  568. i32 = RoundUpToMultiple<int32_t, 6>(42);
  569. EATEST_VERIFY(i32 == 42);
  570. u32 = RoundUpToMultiple<uint32_t, 6>(42);
  571. EATEST_VERIFY(u32 == 42);
  572. i8 = RoundUpToMultiple<int8_t, 6>(42);
  573. EATEST_VERIFY(i8 == 42);
  574. u8 = RoundUpToMultiple<uint8_t, 6>(42);
  575. EATEST_VERIFY(u8 == 42);
  576. i64 = RoundUpToMultiple<int64_t, 6>(42);
  577. EATEST_VERIFY(i64 == 42);
  578. u64 = RoundUpToMultiple<uint64_t, 6>(42);
  579. EATEST_VERIFY(u64 == 42);
  580. // RoundDownToMultiple
  581. i32 = RoundDownToMultiple<int32_t, 6>(37);
  582. EATEST_VERIFY(i32 == 36);
  583. u32 = RoundDownToMultiple<uint32_t, 6>(37);
  584. EATEST_VERIFY(u32 == 36);
  585. i8 = RoundDownToMultiple<int8_t, 6>(37);
  586. EATEST_VERIFY(i8 == 36);
  587. u8 = RoundDownToMultiple<uint8_t, 6>(37);
  588. EATEST_VERIFY(u8 == 36);
  589. i64 = RoundDownToMultiple<int64_t, 6>(37);
  590. EATEST_VERIFY(i64 == 36);
  591. u64 = RoundDownToMultiple<uint64_t, 6>(37);
  592. EATEST_VERIFY(u64 == 36);
  593. i32 = RoundDownToMultiple<int32_t, 6>(41);
  594. EATEST_VERIFY(i32 == 36);
  595. u32 = RoundDownToMultiple<uint32_t, 6>(41);
  596. EATEST_VERIFY(u32 == 36);
  597. i8 = RoundDownToMultiple<int8_t, 6>(41);
  598. EATEST_VERIFY(i8 == 36);
  599. u8 = RoundDownToMultiple<uint8_t, 6>(41);
  600. EATEST_VERIFY(u8 == 36);
  601. i64 = RoundDownToMultiple<int64_t, 6>(41);
  602. EATEST_VERIFY(i64 == 36);
  603. u64 = RoundDownToMultiple<uint64_t, 6>(41);
  604. EATEST_VERIFY(u64 == 36);
  605. i32 = RoundDownToMultiple<int32_t, 6>(36);
  606. EATEST_VERIFY(i32 == 36);
  607. u32 = RoundDownToMultiple<uint32_t, 6>(36);
  608. EATEST_VERIFY(u32 == 36);
  609. i8 = RoundDownToMultiple<int8_t, 6>(36);
  610. EATEST_VERIFY(i8 == 36);
  611. i64 = RoundDownToMultiple<int64_t, 6>(36);
  612. EATEST_VERIFY(i64 == 36);
  613. // ZeroPresent8
  614. b = ZeroPresent8(UINT32_C(0xffffffff));
  615. EATEST_VERIFY(!b);
  616. b = ZeroPresent8(UINT32_C(0x01010101));
  617. EATEST_VERIFY(!b);
  618. b = ZeroPresent8(UINT32_C(0x00ffffff));
  619. EATEST_VERIFY(b);
  620. b = ZeroPresent8(UINT32_C(0xff00ffff));
  621. EATEST_VERIFY(b);
  622. b = ZeroPresent8(UINT32_C(0xffff00ff));
  623. EATEST_VERIFY(b);
  624. b = ZeroPresent8(UINT32_C(0xffffff00));
  625. EATEST_VERIFY(b);
  626. b = ZeroPresent8(UINT64_C(0xffffffffffffffff));
  627. EATEST_VERIFY(!b);
  628. b = ZeroPresent8(UINT64_C(0x0101010101010101));
  629. EATEST_VERIFY(!b);
  630. b = ZeroPresent8(UINT64_C(0x00ffffffffffffff));
  631. EATEST_VERIFY(b);
  632. b = ZeroPresent8(UINT64_C(0xff00ffffffffffff));
  633. EATEST_VERIFY(b);
  634. b = ZeroPresent8(UINT64_C(0xffff00ffffffffff));
  635. EATEST_VERIFY(b);
  636. b = ZeroPresent8(UINT64_C(0xffffff00ffffffff));
  637. EATEST_VERIFY(b);
  638. b = ZeroPresent8(UINT64_C(0xffffffff00ffffff));
  639. EATEST_VERIFY(b);
  640. b = ZeroPresent8(UINT64_C(0xffffffffff00ffff));
  641. EATEST_VERIFY(b);
  642. b = ZeroPresent8(UINT64_C(0xffffffffffff00ff));
  643. EATEST_VERIFY(b);
  644. b = ZeroPresent8(UINT64_C(0xffffffffffffff00));
  645. EATEST_VERIFY(b);
  646. /// ZeroPresent16
  647. b = ZeroPresent16(UINT32_C(0xffffffff));
  648. EATEST_VERIFY(!b);
  649. b = ZeroPresent16(UINT32_C(0xff0000ff));
  650. EATEST_VERIFY(!b);
  651. b = ZeroPresent16(UINT32_C(0x0000ffff));
  652. EATEST_VERIFY(b);
  653. b = ZeroPresent16(UINT32_C(0xffff0000));
  654. EATEST_VERIFY(b);
  655. b = ZeroPresent16(UINT64_C(0xffffffffffffffff));
  656. EATEST_VERIFY(!b);
  657. b = ZeroPresent16(UINT64_C(0xff0000ffffffffff));
  658. EATEST_VERIFY(!b);
  659. b = ZeroPresent16(UINT64_C(0xffffff0000ffffff));
  660. EATEST_VERIFY(!b);
  661. b = ZeroPresent16(UINT64_C(0xffffffffff0000ff));
  662. EATEST_VERIFY(!b);
  663. b = ZeroPresent16(UINT64_C(0x0000ffffffffffff));
  664. EATEST_VERIFY(b);
  665. b = ZeroPresent16(UINT64_C(0xffff0000ffffffff));
  666. EATEST_VERIFY(b);
  667. b = ZeroPresent16(UINT64_C(0xffffffff0000ffff));
  668. EATEST_VERIFY(b);
  669. b = ZeroPresent16(UINT64_C(0xffffffffffff0000));
  670. EATEST_VERIFY(b);
  671. /// ZeroPresent32
  672. b = ZeroPresent32(UINT64_C(0xffffffffffffffff));
  673. EATEST_VERIFY(!b);
  674. b = ZeroPresent32(UINT64_C(0xff00000000fffff));
  675. EATEST_VERIFY(!b);
  676. b = ZeroPresent32(UINT64_C(0xffffff00000000ff));
  677. EATEST_VERIFY(!b);
  678. b = ZeroPresent32(UINT64_C(0x00000000ffffffff));
  679. EATEST_VERIFY(b);
  680. b = ZeroPresent32(UINT64_C(0xffffffff00000000));
  681. EATEST_VERIFY(b);
  682. // Log2
  683. u32 = Log2(UINT32_C(4));
  684. EATEST_VERIFY(u32 == 2);
  685. u32 = Log2(UINT32_C(8));
  686. EATEST_VERIFY(u32 == 3);
  687. u32 = Log2(UINT32_C(11));
  688. EATEST_VERIFY(u32 == 3);
  689. u32 = Log2(UINT32_C(16));
  690. EATEST_VERIFY(u32 == 4);
  691. u64 = Log2(UINT64_C(4));
  692. EATEST_VERIFY(u64 == 2);
  693. u64 = Log2(UINT64_C(8));
  694. EATEST_VERIFY(u64 == 3);
  695. u64 = Log2(UINT64_C(11));
  696. EATEST_VERIFY(u64 == 3);
  697. u64 = Log2(UINT64_C(16));
  698. EATEST_VERIFY(u64 == 4);
  699. // Log2Uint32 / Log2Int32 / Log2Uint64 / Log2Int64
  700. u32 = Log2Uint32<1>::value;
  701. EATEST_VERIFY(u32 == 0);
  702. u32 = Log2Uint32<8>::value;
  703. EATEST_VERIFY(u32 == 3);
  704. u32 = Log2Uint32<0xffffffff>::value;
  705. EATEST_VERIFY(u32 == 31);
  706. i32 = Log2Int32<1>::value;
  707. EATEST_VERIFY(i32 == 0);
  708. i32 = Log2Int32<8>::value;
  709. EATEST_VERIFY(i32 == 3);
  710. i32 = Log2Int32<0x7fffffff>::value;
  711. EATEST_VERIFY(i32 == 30);
  712. u64 = Log2Uint64<UINT64_C(0x0000000000000001)>::value;
  713. EATEST_VERIFY(u64 == 0);
  714. u64 = Log2Uint64<UINT64_C(0x1000000000000000)>::value;
  715. EATEST_VERIFY(u64 == 60);
  716. u64 = Log2Uint64<UINT64_C(0xffffffffffffffff)>::value;
  717. EATEST_VERIFY(u64 == 63);
  718. i64 = Log2Int64<INT64_C(0x0000000000000001)>::value;
  719. EATEST_VERIFY(i64 == 0);
  720. i64 = Log2Int64<INT64_C(0x1000000000000000)>::value;
  721. EATEST_VERIFY(i64 == 60);
  722. i64 = Log2Int64<INT64_C(0x7fffffffffffffff)>::value;
  723. EATEST_VERIFY(i64 == 62);
  724. // SignedAdditionWouldOverflow
  725. b = SignedAdditionWouldOverflow<int8_t>(2, 3);
  726. EATEST_VERIFY(!b);
  727. b = SignedAdditionWouldOverflow<int8_t>(INT8_MAX - 4, INT8_MAX - 10);
  728. EATEST_VERIFY(b);
  729. b = SignedAdditionWouldOverflow<int8_t>(INT8_MIN + 4, INT8_MIN + 10);
  730. EATEST_VERIFY(b);
  731. b = SignedAdditionWouldOverflow<int>(2, 3);
  732. EATEST_VERIFY(!b);
  733. b = SignedAdditionWouldOverflow<int>(INT32_MAX - 4, INT32_MAX - 10);
  734. EATEST_VERIFY(b);
  735. b = SignedAdditionWouldOverflow<int>(INT32_MIN + 4, INT32_MIN + 10);
  736. EATEST_VERIFY(b);
  737. b = SignedAdditionWouldOverflow<int64_t>(2, 3);
  738. EATEST_VERIFY(!b);
  739. b = SignedAdditionWouldOverflow<int64_t>(INT64_MAX - 4, INT64_MAX - 10);
  740. EATEST_VERIFY(b);
  741. b = SignedAdditionWouldOverflow<int64_t>(INT64_MIN + 4, INT64_MIN + 10);
  742. EATEST_VERIFY(b);
  743. // UnsignedAdditionWouldOverflow
  744. b = UnsignedAdditionWouldOverflow<uint16_t>(2, 3);
  745. EATEST_VERIFY(!b);
  746. b = UnsignedAdditionWouldOverflow<uint16_t>(UINT16_MAX - 4, UINT16_MAX - 10);
  747. EATEST_VERIFY(b);
  748. b = UnsignedAdditionWouldOverflow<uint64_t>(1000, 1);
  749. EATEST_VERIFY(!b);
  750. b = UnsignedAdditionWouldOverflow<uint64_t>(UINT64_MAX - 4, 10);
  751. EATEST_VERIFY(b);
  752. // SignedSubtractionWouldOverflow
  753. b = SignedSubtractionWouldOverflow<int8_t>(100, 1);
  754. EATEST_VERIFY(!b);
  755. b = SignedSubtractionWouldOverflow<int8_t>(INT8_MAX - 4, INT8_MIN + 10);
  756. EATEST_VERIFY(b);
  757. b = SignedSubtractionWouldOverflow<int8_t>(INT8_MIN + 10, INT8_MAX - 4);
  758. EATEST_VERIFY(b);
  759. b = SignedSubtractionWouldOverflow<int>(1000, 1);
  760. EATEST_VERIFY(!b);
  761. b = SignedSubtractionWouldOverflow<int>(INT32_MAX - 4, INT32_MIN + 10);
  762. EATEST_VERIFY(b);
  763. b = SignedSubtractionWouldOverflow<int>(INT32_MIN + 10, INT32_MAX - 4);
  764. EATEST_VERIFY(b);
  765. b = SignedSubtractionWouldOverflow<int64_t>(1000, 1);
  766. EATEST_VERIFY(!b);
  767. b = SignedSubtractionWouldOverflow<int64_t>(INT64_MAX - 4, INT64_MIN + 10);
  768. EATEST_VERIFY(b);
  769. b = SignedSubtractionWouldOverflow<int64_t>(INT64_MIN + 10, INT64_MAX - 4);
  770. EATEST_VERIFY(b);
  771. // UnsignedSubtractionWouldOverflow
  772. b = UnsignedSubtractionWouldOverflow<uint16_t>(1000, 1);
  773. EATEST_VERIFY(!b);
  774. b = UnsignedSubtractionWouldOverflow<uint16_t>(UINT16_MAX - 10, UINT16_MAX - 4);
  775. EATEST_VERIFY(b);
  776. b = UnsignedSubtractionWouldOverflow<uint64_t>(1000, 1);
  777. EATEST_VERIFY(!b);
  778. b = UnsignedSubtractionWouldOverflow<uint64_t>(UINT64_MAX - 10, UINT64_MAX - 4);
  779. EATEST_VERIFY(b);
  780. // UnsignedMultiplyWouldOverflow
  781. // Disabled because some compilers mistakenly decide that the code will be dividing by zero.
  782. //b = UnsignedMultiplyWouldOverflow((uint32_t)0, (uint32_t)0);
  783. //EATEST_VERIFY(!b);
  784. b = UnsignedMultiplyWouldOverflow((uint32_t)4, (uint32_t)5);
  785. EATEST_VERIFY(!b);
  786. b = UnsignedMultiplyWouldOverflow((uint32_t)0xffffffff, (uint32_t)0xffffffff);
  787. EATEST_VERIFY(b);
  788. // Disabled because some compilers mistakenly decide that the code will be dividing by zero.
  789. //b = UnsignedMultiplyWouldOverflow(UINT64_C(0x0000000000000000), UINT64_C(0x0000000000000000));
  790. //EATEST_VERIFY(!b);
  791. b = UnsignedMultiplyWouldOverflow(UINT64_C(0x000000000ffffff4), UINT64_C(0x000000000ffffff5));
  792. EATEST_VERIFY(!b);
  793. b = UnsignedMultiplyWouldOverflow(UINT64_C(0xffffffffffffffff), UINT64_C(0xffffffffffffffff));
  794. EATEST_VERIFY(b);
  795. // UnsignedDivisionWouldOverflow
  796. b = UnsignedDivisionWouldOverflow(5, 4);
  797. EATEST_VERIFY(!b);
  798. b = UnsignedDivisionWouldOverflow(3, 0);
  799. EATEST_VERIFY(b);
  800. // SignedDivisionWouldOverflow
  801. b = SignedDivisionWouldOverflow(5, 4);
  802. EATEST_VERIFY(!b);
  803. b = SignedDivisionWouldOverflow(3, 0);
  804. EATEST_VERIFY(b);
  805. b = SignedDivisionWouldOverflow(INT32_MIN, -1);
  806. EATEST_VERIFY(b);
  807. // GetAverage
  808. i = GetAverage(3, 4);
  809. EATEST_VERIFY(i == 3);
  810. i = GetAverage(3, 3);
  811. EATEST_VERIFY(i == 3);
  812. i = GetAverage(-3, -4);
  813. EATEST_VERIFY(i == -4);
  814. i = GetAverage(-2, 1);
  815. EATEST_VERIFY(i == -1);
  816. // GetAverage_Ceiling
  817. i = GetAverage_Ceiling(3, 4);
  818. EATEST_VERIFY(i == 4);
  819. i = GetAverage_Ceiling(3, 3);
  820. EATEST_VERIFY(i == 3);
  821. i = GetAverage_Ceiling(-3, -4);
  822. EATEST_VERIFY(i == -3);
  823. i = GetAverage_Ceiling(-2, 1);
  824. EATEST_VERIFY(i == 0);
  825. // GetParity
  826. i = GetParity(UINT32_C(0x01100011));
  827. EATEST_VERIFY(i == 0);
  828. i = GetParity(UINT32_C(0x00101010));
  829. EATEST_VERIFY(i == 1);
  830. // GetIsBigEndian
  831. b = GetIsBigEndian();
  832. #ifdef EA_SYSTEM_BIG_ENDIAN
  833. EATEST_VERIFY(b);
  834. #else
  835. EATEST_VERIFY(!b);
  836. #endif
  837. // ToggleBetween0And1
  838. i = ToggleBetween0And1(0);
  839. EATEST_VERIFY(i == 1);
  840. i = ToggleBetween0And1(i);
  841. EATEST_VERIFY(i == 0);
  842. i = ToggleBetween0And1(i);
  843. EATEST_VERIFY(i == 1);
  844. // ToggleBetweenIntegers
  845. i32 = 37;
  846. int32_t i32a = 37, i32b = -38;
  847. i32 = ToggleBetweenIntegers(i32, i32a, i32b);
  848. EATEST_VERIFY(i32 == -38);
  849. i32 = ToggleBetweenIntegers(i32, i32a, i32b);
  850. EATEST_VERIFY(i32 == 37);
  851. // IsBetween0AndValue
  852. b = IsBetween0AndValue(3, 20);
  853. EATEST_VERIFY(b);
  854. b = IsBetween0AndValue(-37, 20);
  855. EATEST_VERIFY(!b);
  856. b = IsBetween0AndValue(37, 20);
  857. EATEST_VERIFY(!b);
  858. b = IsBetween0AndValue(370, 20);
  859. EATEST_VERIFY(!b);
  860. // ExchangeValues
  861. n1 = 1; n2 = 2;
  862. ExchangeValues(n1, n2);
  863. EATEST_VERIFY((n1 == 2) && (n2 == 1));
  864. u64 = 64; uint64_t u64_ = 65;
  865. ExchangeValues(u64, u64_);
  866. EATEST_VERIFY((u64 == 65) && (u64_ == 64));
  867. // FloorMod
  868. n1 = FloorMod( 10, 3 );
  869. EATEST_VERIFY((n1 == 1));
  870. n1 = FloorMod( -10, 3 );
  871. EATEST_VERIFY((n1 == 2));
  872. // GetSign
  873. i = GetSign(INT32_MIN);
  874. EATEST_VERIFY(i == -1);
  875. i = GetSign(-1000);
  876. EATEST_VERIFY(i == -1);
  877. i = GetSign(0);
  878. EATEST_VERIFY(i == 0);
  879. i = GetSign(5);
  880. EATEST_VERIFY(i == 1);
  881. i = GetSign(INT32_MAX);
  882. EATEST_VERIFY(i == 1);
  883. // GetSignEx
  884. i = GetSign(-1000);
  885. EATEST_VERIFY(i == -1);
  886. i = GetSign(0);
  887. EATEST_VERIFY(i == 0);
  888. i = GetSign(5);
  889. EATEST_VERIFY(i == 1);
  890. i = GetSign(INT32_MAX);
  891. EATEST_VERIFY(i == 1);
  892. // SignExtend12
  893. i32 = SignExtend12(0x00000fff);
  894. EATEST_VERIFY(i32 == (int32_t)0xffffffff);
  895. i32 = SignExtend12(0x000007ff);
  896. EATEST_VERIFY(i32 == 0x000007ff);
  897. i32 = SignExtend24(0x00ffffff);
  898. EATEST_VERIFY(i32 == (int32_t)0xffffffff);
  899. i32 = SignExtend24(0x007fffff);
  900. EATEST_VERIFY(i32 == 0x007fffff);
  901. // IsUnsigned
  902. EATEST_VERIFY( IsUnsigned( u8));
  903. EATEST_VERIFY(!IsUnsigned( i8));
  904. EATEST_VERIFY( IsUnsigned(u16));
  905. EATEST_VERIFY(!IsUnsigned(i16));
  906. EATEST_VERIFY( IsUnsigned(u32));
  907. EATEST_VERIFY(!IsUnsigned(i32));
  908. EATEST_VERIFY( IsUnsigned(u64));
  909. EATEST_VERIFY(!IsUnsigned(i64));
  910. // EAIsUnsigned
  911. #ifdef _MSC_VER
  912. #pragma warning(push, 0)
  913. #pragma warning(disable: 4296) // '>=' : expression is always true
  914. #pragma warning(disable: 4365) // '=' : conversion from 'int' to 'uint8_t', signed/unsigned mismatch
  915. #pragma warning(disable: 4706) // assignment within conditional expression
  916. #endif
  917. #if !defined(__GNUC__) // GCC generates warnings which you can't disable from code. So just skip the test, as we need to be able to compile this in a "warnings as errors" environment.
  918. EATEST_VERIFY( EAIsUnsigned( u8));
  919. EATEST_VERIFY( EAIsUnsigned(u16));
  920. EATEST_VERIFY( EAIsUnsigned(u32));
  921. EATEST_VERIFY( EAIsUnsigned(u64));
  922. #endif
  923. EATEST_VERIFY(!EAIsUnsigned( i8));
  924. EATEST_VERIFY(!EAIsUnsigned(i16));
  925. EATEST_VERIFY(!EAIsUnsigned(i32));
  926. EATEST_VERIFY(!EAIsUnsigned(i64));
  927. #ifdef _MSC_VER
  928. #pragma warning(pop)
  929. #endif
  930. // IsTwosComplement
  931. // All current platforms are twos-complement
  932. EATEST_VERIFY( IsTwosComplement());
  933. EATEST_VERIFY(!IsOnesComplement());
  934. EATEST_VERIFY(!IsSignMagnitude());
  935. EATEST_VERIFY(!IsOffsetBinary());
  936. // EAArrayCount
  937. int testArray[37]; (void) testArray;
  938. u = EAArrayCount(testArray);
  939. EATEST_VERIFY(u == 37);
  940. // EAOffsetOf
  941. size_t o = EAOffsetOf(OffsetofTest, x1);
  942. EATEST_VERIFY(o == 4);
  943. EA_COMPILETIME_ASSERT(EAOffsetOf(OffsetofTest, x1) == 4); // Verify that this works at compile-time.
  944. int ind = 1;
  945. o = EAOffsetOf(OffsetofTest1, x[ind]);
  946. EATEST_VERIFY(o == 4);
  947. // EAOffsetOfBase
  948. o = EAOffsetOfBase<C, B>();
  949. EATEST_VERIFY(o == EAOffsetOf(C, b));
  950. //static_assert((EAOffsetOfBase<C, B>() == sizeof(int)), "EAOffsetOfDerived failure"); Not possible unless and until we can make EAOffsetOfBase a constexpr.
  951. return nErrorCount;
  952. }