ext_vector_integer.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741
  1. #define GLM_FORCE_UNRESTRICTED_GENTYPE
  2. #include <glm/ext/vector_integer.hpp>
  3. #include <glm/ext/scalar_int_sized.hpp>
  4. #include <glm/ext/scalar_uint_sized.hpp>
  5. #include <glm/ext/vector_int1.hpp>
  6. #include <glm/ext/vector_int2.hpp>
  7. #include <glm/ext/vector_int3.hpp>
  8. #include <glm/ext/vector_int4.hpp>
  9. #include <glm/ext/vector_bool1.hpp>
  10. #include <glm/ext/vector_bool2.hpp>
  11. #include <glm/ext/vector_bool3.hpp>
  12. #include <glm/ext/vector_bool4.hpp>
  13. #include <vector>
  14. #include <ctime>
  15. #include <cstdio>
  16. namespace isPowerOfTwo
  17. {
  18. #if GLM_COMPILER & GLM_COMPILER_CLANG
  19. # pragma clang diagnostic push
  20. # pragma clang diagnostic ignored "-Wpadded"
  21. #endif
  22. template<typename genType>
  23. struct type
  24. {
  25. genType Value;
  26. bool Return;
  27. };
  28. #if GLM_COMPILER & GLM_COMPILER_CLANG
  29. # pragma clang diagnostic pop
  30. #endif
  31. template <glm::length_t L>
  32. static int test_int16()
  33. {
  34. type<glm::int16> const Data[] =
  35. {
  36. { 0x0001, true },
  37. { 0x0002, true },
  38. { 0x0004, true },
  39. { 0x0080, true },
  40. { 0x0000, true },
  41. { 0x0003, false }
  42. };
  43. int Error = 0;
  44. for (std::size_t i = 0, n = sizeof(Data) / sizeof(type<glm::int16>); i < n; ++i)
  45. {
  46. glm::vec<L, bool> const Result = glm::isPowerOfTwo(glm::vec<L, glm::int16>(Data[i].Value));
  47. Error += glm::vec<L, bool>(Data[i].Return) == Result ? 0 : 1;
  48. }
  49. return Error;
  50. }
  51. template <glm::length_t L>
  52. static int test_uint16()
  53. {
  54. type<glm::uint16> const Data[] =
  55. {
  56. { 0x0001, true },
  57. { 0x0002, true },
  58. { 0x0004, true },
  59. { 0x0000, true },
  60. { 0x0000, true },
  61. { 0x0003, false }
  62. };
  63. int Error = 0;
  64. for (std::size_t i = 0, n = sizeof(Data) / sizeof(type<glm::uint16>); i < n; ++i)
  65. {
  66. glm::vec<L, bool> const Result = glm::isPowerOfTwo(glm::vec<L, glm::uint16>(Data[i].Value));
  67. Error += glm::vec<L, bool>(Data[i].Return) == Result ? 0 : 1;
  68. }
  69. return Error;
  70. }
  71. template <glm::length_t L>
  72. static int test_int32()
  73. {
  74. type<int> const Data[] =
  75. {
  76. { 0x00000001, true },
  77. { 0x00000002, true },
  78. { 0x00000004, true },
  79. { 0x0000000f, false },
  80. { 0x00000000, true },
  81. { 0x00000003, false }
  82. };
  83. int Error = 0;
  84. for (std::size_t i = 0, n = sizeof(Data) / sizeof(type<int>); i < n; ++i)
  85. {
  86. glm::vec<L, bool> const Result = glm::isPowerOfTwo(glm::vec<L, glm::int32>(Data[i].Value));
  87. Error += glm::vec<L, bool>(Data[i].Return) == Result ? 0 : 1;
  88. }
  89. return Error;
  90. }
  91. template <glm::length_t L>
  92. static int test_uint32()
  93. {
  94. type<glm::uint> const Data[] =
  95. {
  96. { 0x00000001, true },
  97. { 0x00000002, true },
  98. { 0x00000004, true },
  99. { 0x80000000, true },
  100. { 0x00000000, true },
  101. { 0x00000003, false }
  102. };
  103. int Error = 0;
  104. for (std::size_t i = 0, n = sizeof(Data) / sizeof(type<glm::uint>); i < n; ++i)
  105. {
  106. glm::vec<L, bool> const Result = glm::isPowerOfTwo(glm::vec<L, glm::uint32>(Data[i].Value));
  107. Error += glm::vec<L, bool>(Data[i].Return) == Result ? 0 : 1;
  108. }
  109. return Error;
  110. }
  111. static int test()
  112. {
  113. int Error = 0;
  114. Error += test_int16<1>();
  115. Error += test_int16<2>();
  116. Error += test_int16<3>();
  117. Error += test_int16<4>();
  118. Error += test_uint16<1>();
  119. Error += test_uint16<2>();
  120. Error += test_uint16<3>();
  121. Error += test_uint16<4>();
  122. Error += test_int32<1>();
  123. Error += test_int32<2>();
  124. Error += test_int32<3>();
  125. Error += test_int32<4>();
  126. Error += test_uint32<1>();
  127. Error += test_uint32<2>();
  128. Error += test_uint32<3>();
  129. Error += test_uint32<4>();
  130. return Error;
  131. }
  132. }//isPowerOfTwo
  133. namespace prevPowerOfTwo
  134. {
  135. template <glm::length_t L, typename T>
  136. static int run()
  137. {
  138. int Error = 0;
  139. glm::vec<L, T> const A = glm::prevPowerOfTwo(glm::vec<L, T>(7));
  140. Error += A == glm::vec<L, T>(4) ? 0 : 1;
  141. glm::vec<L, T> const B = glm::prevPowerOfTwo(glm::vec<L, T>(15));
  142. Error += B == glm::vec<L, T>(8) ? 0 : 1;
  143. glm::vec<L, T> const C = glm::prevPowerOfTwo(glm::vec<L, T>(31));
  144. Error += C == glm::vec<L, T>(16) ? 0 : 1;
  145. glm::vec<L, T> const D = glm::prevPowerOfTwo(glm::vec<L, T>(32));
  146. Error += D == glm::vec<L, T>(32) ? 0 : 1;
  147. return Error;
  148. }
  149. static int test()
  150. {
  151. int Error = 0;
  152. Error += run<1, glm::int8>();
  153. Error += run<2, glm::int8>();
  154. Error += run<3, glm::int8>();
  155. Error += run<4, glm::int8>();
  156. Error += run<1, glm::int16>();
  157. Error += run<2, glm::int16>();
  158. Error += run<3, glm::int16>();
  159. Error += run<4, glm::int16>();
  160. Error += run<1, glm::int32>();
  161. Error += run<2, glm::int32>();
  162. Error += run<3, glm::int32>();
  163. Error += run<4, glm::int32>();
  164. Error += run<1, glm::int64>();
  165. Error += run<2, glm::int64>();
  166. Error += run<3, glm::int64>();
  167. Error += run<4, glm::int64>();
  168. Error += run<1, glm::uint8>();
  169. Error += run<2, glm::uint8>();
  170. Error += run<3, glm::uint8>();
  171. Error += run<4, glm::uint8>();
  172. Error += run<1, glm::uint16>();
  173. Error += run<2, glm::uint16>();
  174. Error += run<3, glm::uint16>();
  175. Error += run<4, glm::uint16>();
  176. Error += run<1, glm::uint32>();
  177. Error += run<2, glm::uint32>();
  178. Error += run<3, glm::uint32>();
  179. Error += run<4, glm::uint32>();
  180. Error += run<1, glm::uint64>();
  181. Error += run<2, glm::uint64>();
  182. Error += run<3, glm::uint64>();
  183. Error += run<4, glm::uint64>();
  184. return Error;
  185. }
  186. }//namespace prevPowerOfTwo
  187. namespace nextPowerOfTwo
  188. {
  189. template <glm::length_t L, typename T>
  190. static int run()
  191. {
  192. int Error = 0;
  193. glm::vec<L, T> const A = glm::nextPowerOfTwo(glm::vec<L, T>(7));
  194. Error += A == glm::vec<L, T>(8) ? 0 : 1;
  195. glm::vec<L, T> const B = glm::nextPowerOfTwo(glm::vec<L, T>(15));
  196. Error += B == glm::vec<L, T>(16) ? 0 : 1;
  197. glm::vec<L, T> const C = glm::nextPowerOfTwo(glm::vec<L, T>(31));
  198. Error += C == glm::vec<L, T>(32) ? 0 : 1;
  199. glm::vec<L, T> const D = glm::nextPowerOfTwo(glm::vec<L, T>(32));
  200. Error += D == glm::vec<L, T>(32) ? 0 : 1;
  201. return Error;
  202. }
  203. static int test()
  204. {
  205. int Error = 0;
  206. Error += run<1, glm::int8>();
  207. Error += run<2, glm::int8>();
  208. Error += run<3, glm::int8>();
  209. Error += run<4, glm::int8>();
  210. Error += run<1, glm::int16>();
  211. Error += run<2, glm::int16>();
  212. Error += run<3, glm::int16>();
  213. Error += run<4, glm::int16>();
  214. Error += run<1, glm::int32>();
  215. Error += run<2, glm::int32>();
  216. Error += run<3, glm::int32>();
  217. Error += run<4, glm::int32>();
  218. Error += run<1, glm::int64>();
  219. Error += run<2, glm::int64>();
  220. Error += run<3, glm::int64>();
  221. Error += run<4, glm::int64>();
  222. Error += run<1, glm::uint8>();
  223. Error += run<2, glm::uint8>();
  224. Error += run<3, glm::uint8>();
  225. Error += run<4, glm::uint8>();
  226. Error += run<1, glm::uint16>();
  227. Error += run<2, glm::uint16>();
  228. Error += run<3, glm::uint16>();
  229. Error += run<4, glm::uint16>();
  230. Error += run<1, glm::uint32>();
  231. Error += run<2, glm::uint32>();
  232. Error += run<3, glm::uint32>();
  233. Error += run<4, glm::uint32>();
  234. Error += run<1, glm::uint64>();
  235. Error += run<2, glm::uint64>();
  236. Error += run<3, glm::uint64>();
  237. Error += run<4, glm::uint64>();
  238. return Error;
  239. }
  240. }//namespace nextPowerOfTwo
  241. namespace prevMultiple
  242. {
  243. template<typename genIUType>
  244. struct type
  245. {
  246. genIUType Source;
  247. genIUType Multiple;
  248. genIUType Return;
  249. };
  250. template <glm::length_t L, typename T>
  251. static int run()
  252. {
  253. type<T> const Data[] =
  254. {
  255. { 8, 3, 6 },
  256. { 7, 7, 7 }
  257. };
  258. int Error = 0;
  259. for (std::size_t i = 0, n = sizeof(Data) / sizeof(type<T>); i < n; ++i)
  260. {
  261. glm::vec<L, T> const Result0 = glm::prevMultiple(glm::vec<L, T>(Data[i].Source), Data[i].Multiple);
  262. Error += glm::vec<L, T>(Data[i].Return) == Result0 ? 0 : 1;
  263. glm::vec<L, T> const Result1 = glm::prevMultiple(glm::vec<L, T>(Data[i].Source), glm::vec<L, T>(Data[i].Multiple));
  264. Error += glm::vec<L, T>(Data[i].Return) == Result1 ? 0 : 1;
  265. }
  266. return Error;
  267. }
  268. static int test()
  269. {
  270. int Error = 0;
  271. Error += run<1, glm::int8>();
  272. Error += run<2, glm::int8>();
  273. Error += run<3, glm::int8>();
  274. Error += run<4, glm::int8>();
  275. Error += run<1, glm::int16>();
  276. Error += run<2, glm::int16>();
  277. Error += run<3, glm::int16>();
  278. Error += run<4, glm::int16>();
  279. Error += run<1, glm::int32>();
  280. Error += run<2, glm::int32>();
  281. Error += run<3, glm::int32>();
  282. Error += run<4, glm::int32>();
  283. Error += run<1, glm::int64>();
  284. Error += run<2, glm::int64>();
  285. Error += run<3, glm::int64>();
  286. Error += run<4, glm::int64>();
  287. Error += run<1, glm::uint8>();
  288. Error += run<2, glm::uint8>();
  289. Error += run<3, glm::uint8>();
  290. Error += run<4, glm::uint8>();
  291. Error += run<1, glm::uint16>();
  292. Error += run<2, glm::uint16>();
  293. Error += run<3, glm::uint16>();
  294. Error += run<4, glm::uint16>();
  295. Error += run<1, glm::uint32>();
  296. Error += run<2, glm::uint32>();
  297. Error += run<3, glm::uint32>();
  298. Error += run<4, glm::uint32>();
  299. Error += run<1, glm::uint64>();
  300. Error += run<2, glm::uint64>();
  301. Error += run<3, glm::uint64>();
  302. Error += run<4, glm::uint64>();
  303. return Error;
  304. }
  305. }//namespace prevMultiple
  306. namespace nextMultiple
  307. {
  308. template<typename genIUType>
  309. struct type
  310. {
  311. genIUType Source;
  312. genIUType Multiple;
  313. genIUType Return;
  314. };
  315. template <glm::length_t L, typename T>
  316. static int run()
  317. {
  318. type<T> const Data[] =
  319. {
  320. { 3, 4, 4 },
  321. { 6, 3, 6 },
  322. { 5, 3, 6 },
  323. { 7, 7, 7 },
  324. { 0, 1, 0 },
  325. { 8, 3, 9 }
  326. };
  327. int Error = 0;
  328. for (std::size_t i = 0, n = sizeof(Data) / sizeof(type<T>); i < n; ++i)
  329. {
  330. glm::vec<L, T> const Result0 = glm::nextMultiple(glm::vec<L, T>(Data[i].Source), glm::vec<L, T>(Data[i].Multiple));
  331. Error += glm::vec<L, T>(Data[i].Return) == Result0 ? 0 : 1;
  332. glm::vec<L, T> const Result1 = glm::nextMultiple(glm::vec<L, T>(Data[i].Source), Data[i].Multiple);
  333. Error += glm::vec<L, T>(Data[i].Return) == Result1 ? 0 : 1;
  334. }
  335. return Error;
  336. }
  337. static int test()
  338. {
  339. int Error = 0;
  340. Error += run<1, glm::int8>();
  341. Error += run<2, glm::int8>();
  342. Error += run<3, glm::int8>();
  343. Error += run<4, glm::int8>();
  344. Error += run<1, glm::int16>();
  345. Error += run<2, glm::int16>();
  346. Error += run<3, glm::int16>();
  347. Error += run<4, glm::int16>();
  348. Error += run<1, glm::int32>();
  349. Error += run<2, glm::int32>();
  350. Error += run<3, glm::int32>();
  351. Error += run<4, glm::int32>();
  352. Error += run<1, glm::int64>();
  353. Error += run<2, glm::int64>();
  354. Error += run<3, glm::int64>();
  355. Error += run<4, glm::int64>();
  356. Error += run<1, glm::uint8>();
  357. Error += run<2, glm::uint8>();
  358. Error += run<3, glm::uint8>();
  359. Error += run<4, glm::uint8>();
  360. Error += run<1, glm::uint16>();
  361. Error += run<2, glm::uint16>();
  362. Error += run<3, glm::uint16>();
  363. Error += run<4, glm::uint16>();
  364. Error += run<1, glm::uint32>();
  365. Error += run<2, glm::uint32>();
  366. Error += run<3, glm::uint32>();
  367. Error += run<4, glm::uint32>();
  368. Error += run<1, glm::uint64>();
  369. Error += run<2, glm::uint64>();
  370. Error += run<3, glm::uint64>();
  371. Error += run<4, glm::uint64>();
  372. return Error;
  373. }
  374. }//namespace nextMultiple
  375. namespace findNSB
  376. {
  377. #if GLM_COMPILER & GLM_COMPILER_CLANG
  378. # pragma clang diagnostic push
  379. # pragma clang diagnostic ignored "-Wpadded"
  380. #endif
  381. template<typename T>
  382. struct type
  383. {
  384. T Source;
  385. int SignificantBitCount;
  386. int Return;
  387. };
  388. #if GLM_COMPILER & GLM_COMPILER_CLANG
  389. # pragma clang diagnostic pop
  390. #endif
  391. template <glm::length_t L, typename T>
  392. static int run()
  393. {
  394. type<T> const Data[] =
  395. {
  396. { 0x00, 1,-1 },
  397. { 0x01, 2,-1 },
  398. { 0x02, 2,-1 },
  399. { 0x06, 3,-1 },
  400. { 0x01, 1, 0 },
  401. { 0x03, 1, 0 },
  402. { 0x03, 2, 1 },
  403. { 0x07, 2, 1 },
  404. { 0x05, 2, 2 },
  405. { 0x0D, 2, 2 }
  406. };
  407. int Error = 0;
  408. for (std::size_t i = 0, n = sizeof(Data) / sizeof(type<T>); i < n; ++i)
  409. {
  410. glm::vec<L, int> const Result0 = glm::findNSB<L, T, glm::defaultp>(glm::vec<L, T>(Data[i].Source), glm::vec<L, int>(Data[i].SignificantBitCount));
  411. Error += glm::vec<L, int>(Data[i].Return) == Result0 ? 0 : 1;
  412. assert(!Error);
  413. }
  414. return Error;
  415. }
  416. static int test()
  417. {
  418. int Error = 0;
  419. Error += run<1, glm::uint8>();
  420. Error += run<2, glm::uint8>();
  421. Error += run<3, glm::uint8>();
  422. Error += run<4, glm::uint8>();
  423. Error += run<1, glm::uint16>();
  424. Error += run<2, glm::uint16>();
  425. Error += run<3, glm::uint16>();
  426. Error += run<4, glm::uint16>();
  427. Error += run<1, glm::uint32>();
  428. Error += run<2, glm::uint32>();
  429. Error += run<3, glm::uint32>();
  430. Error += run<4, glm::uint32>();
  431. Error += run<1, glm::uint64>();
  432. Error += run<2, glm::uint64>();
  433. Error += run<3, glm::uint64>();
  434. Error += run<4, glm::uint64>();
  435. Error += run<1, glm::int8>();
  436. Error += run<2, glm::int8>();
  437. Error += run<3, glm::int8>();
  438. Error += run<4, glm::int8>();
  439. Error += run<1, glm::int16>();
  440. Error += run<2, glm::int16>();
  441. Error += run<3, glm::int16>();
  442. Error += run<4, glm::int16>();
  443. Error += run<1, glm::int32>();
  444. Error += run<2, glm::int32>();
  445. Error += run<3, glm::int32>();
  446. Error += run<4, glm::int32>();
  447. Error += run<1, glm::int64>();
  448. Error += run<2, glm::int64>();
  449. Error += run<3, glm::int64>();
  450. Error += run<4, glm::int64>();
  451. return Error;
  452. }
  453. }//namespace findNSB
  454. #if GLM_COMPILER & GLM_COMPILER_CLANG
  455. # pragma clang diagnostic push
  456. # pragma clang diagnostic ignored "-Wpadded"
  457. #endif
  458. template<typename T, typename B>
  459. struct test_mix_entry
  460. {
  461. T x;
  462. T y;
  463. B a;
  464. T Result;
  465. };
  466. #if GLM_COMPILER & GLM_COMPILER_CLANG
  467. # pragma clang diagnostic pop
  468. #endif
  469. static int test_mix()
  470. {
  471. test_mix_entry<int, bool> const TestBool[] =
  472. {
  473. {0, 1, false, 0},
  474. {0, 1, true, 1},
  475. {-1, 1, false, -1},
  476. {-1, 1, true, 1}
  477. };
  478. test_mix_entry<int, int> const TestInt[] =
  479. {
  480. {0, 1, 0, 0},
  481. {0, 1, 1, 1},
  482. {-1, 1, 0, -1},
  483. {-1, 1, 1, 1}
  484. };
  485. test_mix_entry<glm::ivec2, bool> const TestVec2Bool[] =
  486. {
  487. {glm::ivec2(0), glm::ivec2(1), false, glm::ivec2(0)},
  488. {glm::ivec2(0), glm::ivec2(1), true, glm::ivec2(1)},
  489. {glm::ivec2(-1), glm::ivec2(1), false, glm::ivec2(-1)},
  490. {glm::ivec2(-1), glm::ivec2(1), true, glm::ivec2(1)}
  491. };
  492. test_mix_entry<glm::ivec2, glm::bvec2> const TestBVec2[] =
  493. {
  494. {glm::ivec2(0), glm::ivec2(1), glm::bvec2(false), glm::ivec2(0)},
  495. {glm::ivec2(0), glm::ivec2(1), glm::bvec2(true), glm::ivec2(1)},
  496. {glm::ivec2(-1), glm::ivec2(1), glm::bvec2(false), glm::ivec2(-1)},
  497. {glm::ivec2(-1), glm::ivec2(1), glm::bvec2(true), glm::ivec2(1)},
  498. {glm::ivec2(-1), glm::ivec2(1), glm::bvec2(true, false), glm::ivec2(1, -1)}
  499. };
  500. test_mix_entry<glm::ivec3, bool> const TestVec3Bool[] =
  501. {
  502. {glm::ivec3(0), glm::ivec3(1), false, glm::ivec3(0)},
  503. {glm::ivec3(0), glm::ivec3(1), true, glm::ivec3(1)},
  504. {glm::ivec3(-1), glm::ivec3(1), false, glm::ivec3(-1)},
  505. {glm::ivec3(-1), glm::ivec3(1), true, glm::ivec3(1)}
  506. };
  507. test_mix_entry<glm::ivec3, glm::bvec3> const TestBVec3[] =
  508. {
  509. {glm::ivec3(0), glm::ivec3(1), glm::bvec3(false), glm::ivec3(0)},
  510. {glm::ivec3(0), glm::ivec3(1), glm::bvec3(true), glm::ivec3(1)},
  511. {glm::ivec3(-1), glm::ivec3(1), glm::bvec3(false), glm::ivec3(-1)},
  512. {glm::ivec3(-1), glm::ivec3(1), glm::bvec3(true), glm::ivec3(1)},
  513. {glm::ivec3(1, 2, 3), glm::ivec3(4, 5, 6), glm::bvec3(true, false, true), glm::ivec3(4, 2, 6)}
  514. };
  515. test_mix_entry<glm::ivec4, bool> const TestVec4Bool[] =
  516. {
  517. {glm::ivec4(0), glm::ivec4(1), false, glm::ivec4(0)},
  518. {glm::ivec4(0), glm::ivec4(1), true, glm::ivec4(1)},
  519. {glm::ivec4(-1), glm::ivec4(1), false, glm::ivec4(-1)},
  520. {glm::ivec4(-1), glm::ivec4(1), true, glm::ivec4(1)}
  521. };
  522. test_mix_entry<glm::ivec4, glm::bvec4> const TestBVec4[] =
  523. {
  524. {glm::ivec4(0, 0, 1, 1), glm::ivec4(2, 2, 3, 3), glm::bvec4(false, true, false, true), glm::ivec4(0, 2, 1, 3)},
  525. {glm::ivec4(0), glm::ivec4(1), glm::bvec4(true), glm::ivec4(1)},
  526. {glm::ivec4(-1), glm::ivec4(1), glm::bvec4(false), glm::ivec4(-1)},
  527. {glm::ivec4(-1), glm::ivec4(1), glm::bvec4(true), glm::ivec4(1)},
  528. {glm::ivec4(1, 2, 3, 4), glm::ivec4(5, 6, 7, 8), glm::bvec4(true, false, true, false), glm::ivec4(5, 2, 7, 4)}
  529. };
  530. int Error = 0;
  531. // Float with bool
  532. {
  533. for(std::size_t i = 0; i < sizeof(TestBool) / sizeof(test_mix_entry<int, bool>); ++i)
  534. {
  535. int const Result = glm::mix(TestBool[i].x, TestBool[i].y, TestBool[i].a);
  536. Error += Result == TestBool[i].Result ? 0 : 1;
  537. }
  538. }
  539. // Float with float
  540. {
  541. for(std::size_t i = 0; i < sizeof(TestInt) / sizeof(test_mix_entry<int, int>); ++i)
  542. {
  543. int const Result = glm::mix(TestInt[i].x, TestInt[i].y, TestInt[i].a);
  544. Error += Result == TestInt[i].Result ? 0 : 1;
  545. }
  546. }
  547. // vec2 with bool
  548. {
  549. for(std::size_t i = 0; i < sizeof(TestVec2Bool) / sizeof(test_mix_entry<glm::ivec2, bool>); ++i)
  550. {
  551. glm::ivec2 const Result = glm::mix(TestVec2Bool[i].x, TestVec2Bool[i].y, TestVec2Bool[i].a);
  552. Error += glm::all(glm::equal(Result, TestVec2Bool[i].Result)) ? 0 : 1;
  553. }
  554. }
  555. // vec2 with bvec2
  556. {
  557. for(std::size_t i = 0; i < sizeof(TestBVec2) / sizeof(test_mix_entry<glm::ivec2, glm::bvec2>); ++i)
  558. {
  559. glm::ivec2 const Result = glm::mix(TestBVec2[i].x, TestBVec2[i].y, TestBVec2[i].a);
  560. Error += glm::all(glm::equal(Result, TestBVec2[i].Result)) ? 0 : 1;
  561. }
  562. }
  563. // vec3 with bool
  564. {
  565. for(std::size_t i = 0; i < sizeof(TestVec3Bool) / sizeof(test_mix_entry<glm::ivec3, bool>); ++i)
  566. {
  567. glm::ivec3 const Result = glm::mix(TestVec3Bool[i].x, TestVec3Bool[i].y, TestVec3Bool[i].a);
  568. Error += glm::all(glm::equal(Result, TestVec3Bool[i].Result)) ? 0 : 1;
  569. }
  570. }
  571. // vec3 with bvec3
  572. {
  573. for(std::size_t i = 0; i < sizeof(TestBVec3) / sizeof(test_mix_entry<glm::ivec3, glm::bvec3>); ++i)
  574. {
  575. glm::ivec3 const Result = glm::mix(TestBVec3[i].x, TestBVec3[i].y, TestBVec3[i].a);
  576. Error += glm::all(glm::equal(Result, TestBVec3[i].Result)) ? 0 : 1;
  577. }
  578. }
  579. // vec4 with bool
  580. {
  581. for(std::size_t i = 0; i < sizeof(TestVec4Bool) / sizeof(test_mix_entry<glm::ivec4, bool>); ++i)
  582. {
  583. glm::ivec4 const Result = glm::mix(TestVec4Bool[i].x, TestVec4Bool[i].y, TestVec4Bool[i].a);
  584. Error += glm::all(glm::equal(Result, TestVec4Bool[i].Result)) ? 0 : 1;
  585. }
  586. }
  587. // vec4 with bvec4
  588. {
  589. for(std::size_t i = 0; i < sizeof(TestBVec4) / sizeof(test_mix_entry<glm::ivec4, glm::bvec4>); ++i)
  590. {
  591. glm::ivec4 const Result = glm::mix(TestBVec4[i].x, TestBVec4[i].y, TestBVec4[i].a);
  592. Error += glm::all(glm::equal(Result, TestBVec4[i].Result)) ? 0 : 1;
  593. }
  594. }
  595. return Error;
  596. }
  597. int main()
  598. {
  599. int Error = 0;
  600. Error += isPowerOfTwo::test();
  601. Error += prevPowerOfTwo::test();
  602. Error += nextPowerOfTwo::test();
  603. Error += prevMultiple::test();
  604. Error += nextMultiple::test();
  605. Error += findNSB::test();
  606. Error += test_mix();
  607. return Error;
  608. }