TestBitTricks.cpp 34 KB

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