ext_vector_integer.cpp 17 KB

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