gtx_bit.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. ///////////////////////////////////////////////////////////////////////////////////////////////////
  2. // OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net)
  3. ///////////////////////////////////////////////////////////////////////////////////////////////////
  4. // Created : 2010-09-16
  5. // Updated : 2010-09-16
  6. // Licence : This source is under MIT licence
  7. // File : test/gtx/bit.cpp
  8. ///////////////////////////////////////////////////////////////////////////////////////////////////
  9. #include <glm/glm.hpp>
  10. #include <glm/gtx/number_precision.hpp>
  11. #include <glm/gtx/bit.hpp>
  12. #include <iostream>
  13. enum result
  14. {
  15. SUCCESS,
  16. FAIL,
  17. ASSERT,
  18. STATIC_ASSERT
  19. };
  20. namespace extractField
  21. {
  22. template <typename genType, typename sizeType>
  23. struct type
  24. {
  25. genType Value;
  26. sizeType BitFirst;
  27. sizeType BitCount;
  28. genType Return;
  29. result Result;
  30. };
  31. typedef type<glm::uint64, glm::uint> typeU64;
  32. #if(((GLM_COMPILER & GLM_COMPILER_GCC) == GLM_COMPILER_GCC) && (GLM_COMPILER < GLM_COMPILER_GCC44))
  33. typeU64 const Data64[] =
  34. {
  35. {0xffffffffffffffffLLU, 8, 0, 0x0000000000000000LLU, SUCCESS},
  36. {0x0000000000000000LLU, 0,64, 0x0000000000000000LLU, SUCCESS},
  37. {0xffffffffffffffffLLU, 0,64, 0xffffffffffffffffLLU, SUCCESS},
  38. {0x0f0f0f0f0f0f0f0fLLU, 0,64, 0x0f0f0f0f0f0f0f0fLLU, SUCCESS},
  39. {0x0000000000000000LLU, 8, 0, 0x0000000000000000LLU, SUCCESS},
  40. {0x8000000000000000LLU,63, 1, 0x0000000000000001LLU, SUCCESS},
  41. {0x7fffffffffffffffLLU,63, 1, 0x0000000000000000LLU, SUCCESS},
  42. {0x0000000000000300LLU, 8, 8, 0x0000000000000003LLU, SUCCESS},
  43. {0x000000000000ff00LLU, 8, 8, 0x00000000000000ffLLU, SUCCESS},
  44. {0xfffffffffffffff0LLU, 0, 5, 0x0000000000000010LLU, SUCCESS},
  45. {0x00000000000000ffLLU, 1, 3, 0x0000000000000007LLU, SUCCESS},
  46. {0x00000000000000ffLLU, 0, 3, 0x0000000000000007LLU, SUCCESS},
  47. {0x0000000000000000LLU, 0, 2, 0x0000000000000000LLU, SUCCESS},
  48. {0xffffffffffffffffLLU, 0, 8, 0x00000000000000ffLLU, SUCCESS},
  49. {0xffffffff00000000LLU,32,32, 0x00000000ffffffffLLU, SUCCESS},
  50. {0xfffffffffffffff0LLU, 0, 8, 0x0000000000000000LLU, FAIL},
  51. {0xffffffffffffffffLLU,32,32, 0x0000000000000000LLU, FAIL},
  52. //{0xffffffffffffffffLLU,64, 1, 0x0000000000000000LLU, ASSERT}, // Throw an assert
  53. //{0xffffffffffffffffLLU, 0,65, 0x0000000000000000LLU, ASSERT}, // Throw an assert
  54. //{0xffffffffffffffffLLU,33,32, 0x0000000000000000LLU, ASSERT}, // Throw an assert
  55. };
  56. #else
  57. typeU64 const Data64[] =
  58. {
  59. {0xffffffffffffffff, 8, 0, 0x0000000000000000, SUCCESS},
  60. {0x0000000000000000, 0,64, 0x0000000000000000, SUCCESS},
  61. {0xffffffffffffffff, 0,64, 0xffffffffffffffff, SUCCESS},
  62. {0x0f0f0f0f0f0f0f0f, 0,64, 0x0f0f0f0f0f0f0f0f, SUCCESS},
  63. {0x0000000000000000, 8, 0, 0x0000000000000000, SUCCESS},
  64. {0x8000000000000000,63, 1, 0x0000000000000001, SUCCESS},
  65. {0x7fffffffffffffff,63, 1, 0x0000000000000000, SUCCESS},
  66. {0x0000000000000300, 8, 8, 0x0000000000000003, SUCCESS},
  67. {0x000000000000ff00, 8, 8, 0x00000000000000ff, SUCCESS},
  68. {0xfffffffffffffff0, 0, 5, 0x0000000000000010, SUCCESS},
  69. {0x00000000000000ff, 1, 3, 0x0000000000000007, SUCCESS},
  70. {0x00000000000000ff, 0, 3, 0x0000000000000007, SUCCESS},
  71. {0x0000000000000000, 0, 2, 0x0000000000000000, SUCCESS},
  72. {0xffffffffffffffff, 0, 8, 0x00000000000000ff, SUCCESS},
  73. {0xffffffff00000000,32,32, 0x00000000ffffffff, SUCCESS},
  74. {0xfffffffffffffff0, 0, 8, 0x0000000000000000, FAIL},
  75. {0xffffffffffffffff,32,32, 0x0000000000000000, FAIL},
  76. //{0xffffffffffffffff,64, 1, 0x0000000000000000, ASSERT}, // Throw an assert
  77. //{0xffffffffffffffff, 0,65, 0x0000000000000000, ASSERT}, // Throw an assert
  78. //{0xffffffffffffffff,33,32, 0x0000000000000000, ASSERT}, // Throw an assert
  79. };
  80. #endif
  81. int test()
  82. {
  83. glm::uint32 count = sizeof(Data64) / sizeof(typeU64);
  84. for(glm::uint32 i = 0; i < count; ++i)
  85. {
  86. glm::uint64 Return = glm::extractField(
  87. Data64[i].Value,
  88. Data64[i].BitFirst,
  89. Data64[i].BitCount);
  90. bool Compare = Data64[i].Return == Return;
  91. if(Data64[i].Result == SUCCESS && Compare)
  92. continue;
  93. else if(Data64[i].Result == FAIL && !Compare)
  94. continue;
  95. std::cout << "glm::extractfield test fail on test " << i << std::endl;
  96. return 1;
  97. }
  98. return 0;
  99. }
  100. }//extractField
  101. namespace bitRevert
  102. {
  103. template <typename genType>
  104. struct type
  105. {
  106. genType Value;
  107. genType Return;
  108. result Result;
  109. };
  110. typedef type<glm::uint64> typeU64;
  111. #if(((GLM_COMPILER & GLM_COMPILER_GCC) == GLM_COMPILER_GCC) && (GLM_COMPILER < GLM_COMPILER_GCC44))
  112. typeU64 const Data64[] =
  113. {
  114. {0xffffffffffffffffLLU, 0xffffffffffffffffLLU, SUCCESS},
  115. {0x0000000000000000LLU, 0x0000000000000000LLU, SUCCESS},
  116. {0xf000000000000000LLU, 0x000000000000000fLLU, SUCCESS},
  117. };
  118. #else
  119. typeU64 const Data64[] =
  120. {
  121. {0xffffffffffffffff, 0xffffffffffffffff, SUCCESS},
  122. {0x0000000000000000, 0x0000000000000000, SUCCESS},
  123. {0xf000000000000000, 0x000000000000000f, SUCCESS},
  124. };
  125. #endif
  126. int test()
  127. {
  128. glm::uint32 count = sizeof(Data64) / sizeof(typeU64);
  129. for(glm::uint32 i = 0; i < count; ++i)
  130. {
  131. glm::uint64 Return = glm::bitRevert(
  132. Data64[i].Value);
  133. bool Compare = Data64[i].Return == Return;
  134. if(Data64[i].Result == SUCCESS && Compare)
  135. continue;
  136. else if(Data64[i].Result == FAIL && !Compare)
  137. continue;
  138. std::cout << "glm::extractfield test fail on test " << i << std::endl;
  139. return 1;
  140. }
  141. return 0;
  142. }
  143. }//bitRevert
  144. int main()
  145. {
  146. int Error = 0;
  147. Error += ::extractField::test();
  148. Error += ::bitRevert::test();
  149. return Error;
  150. }