ext_vector_relational.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. #include <glm/ext/vector_relational.hpp>
  2. #include <glm/ext/vector_float1.hpp>
  3. #include <glm/ext/vector_float1_precision.hpp>
  4. #include <glm/ext/vector_float2.hpp>
  5. #include <glm/ext/vector_float2_precision.hpp>
  6. #include <glm/ext/vector_float3.hpp>
  7. #include <glm/ext/vector_float3_precision.hpp>
  8. #include <glm/ext/vector_float4.hpp>
  9. #include <glm/ext/vector_float4_precision.hpp>
  10. #include <glm/ext/vector_double1.hpp>
  11. #include <glm/ext/vector_double1_precision.hpp>
  12. #include <glm/ext/vector_double2.hpp>
  13. #include <glm/ext/vector_double2_precision.hpp>
  14. #include <glm/ext/vector_double3.hpp>
  15. #include <glm/ext/vector_double3_precision.hpp>
  16. #include <glm/ext/vector_double4.hpp>
  17. #include <glm/ext/vector_double4_precision.hpp>
  18. template <typename vecType>
  19. static int test_equal()
  20. {
  21. typedef typename vecType::value_type valType;
  22. valType const A = static_cast<valType>(1.01f);
  23. valType const B = static_cast<valType>(1.02f);
  24. valType const Epsilon1 = static_cast<valType>(0.1f);
  25. valType const Epsilon2 = static_cast<valType>(0.001f);
  26. int Error = 0;
  27. Error += glm::all(glm::equal(vecType(A), vecType(B), Epsilon1)) ? 0 : 1;
  28. Error += glm::all(glm::equal(vecType(A), vecType(B), vecType(Epsilon1))) ? 0 : 1;
  29. Error += !glm::any(glm::equal(vecType(A), vecType(B), Epsilon2)) ? 0 : 1;
  30. Error += !glm::any(glm::equal(vecType(A), vecType(B), vecType(Epsilon2))) ? 0 : 1;
  31. return Error;
  32. }
  33. template <typename vecType>
  34. static int test_notEqual()
  35. {
  36. typedef typename vecType::value_type valType;
  37. valType const A = static_cast<valType>(1.01f);
  38. valType const B = static_cast<valType>(1.02f);
  39. valType const Epsilon1 = static_cast<valType>(0.1f);
  40. valType const Epsilon2 = static_cast<valType>(0.001f);
  41. int Error = 0;
  42. Error += glm::all(glm::notEqual(vecType(A), vecType(B), Epsilon2)) ? 0 : 1;
  43. Error += glm::all(glm::notEqual(vecType(A), vecType(B), vecType(Epsilon2))) ? 0 : 1;
  44. Error += !glm::any(glm::notEqual(vecType(A), vecType(B), Epsilon1)) ? 0 : 1;
  45. Error += !glm::any(glm::notEqual(vecType(A), vecType(B), vecType(Epsilon1))) ? 0 : 1;
  46. return Error;
  47. }
  48. template <typename genType, typename valType>
  49. static int test_constexpr()
  50. {
  51. # if GLM_CONFIG_CONSTEXP == GLM_ENABLE
  52. static_assert(glm::all(glm::equal(genType(static_cast<valType>(1.01f)), genType(static_cast<valType>(1.02f)), static_cast<valType>(0.1f))), "GLM: Failed constexpr");
  53. # endif
  54. return 0;
  55. }
  56. template <typename T>
  57. static int test_equal_ulps()
  58. {
  59. typedef glm::vec<4, T, glm::defaultp> vec4;
  60. T const Zero(0);
  61. T const One(1);
  62. T const Two(2);
  63. vec4 const Ones(1);
  64. int Error = 0;
  65. T const ULP1Plus = std::nextafter(One, Two);
  66. Error += glm::all(glm::equal(Ones, vec4(ULP1Plus), 1)) ? 0 : 1;
  67. T const ULP2Plus = std::nextafter(ULP1Plus, Two);
  68. Error += !glm::all(glm::equal(Ones, vec4(ULP2Plus), 1)) ? 0 : 1;
  69. T const ULP1Minus = std::nextafter(One, Zero);
  70. Error += glm::all(glm::equal(Ones, vec4(ULP1Minus), 1)) ? 0 : 1;
  71. T const ULP2Minus = std::nextafter(ULP1Minus, Zero);
  72. Error += !glm::all(glm::equal(Ones, vec4(ULP2Minus), 1)) ? 0 : 1;
  73. return Error;
  74. }
  75. template <typename T>
  76. static int test_notEqual_ulps()
  77. {
  78. typedef glm::vec<4, T, glm::defaultp> vec4;
  79. T const Zero(0);
  80. T const One(1);
  81. T const Two(2);
  82. vec4 const Ones(1);
  83. int Error = 0;
  84. T const ULP1Plus = std::nextafter(One, Two);
  85. Error += !glm::all(glm::notEqual(Ones, vec4(ULP1Plus), 1)) ? 0 : 1;
  86. T const ULP2Plus = std::nextafter(ULP1Plus, Two);
  87. Error += glm::all(glm::notEqual(Ones, vec4(ULP2Plus), 1)) ? 0 : 1;
  88. T const ULP1Minus = std::nextafter(One, Zero);
  89. Error += !glm::all(glm::notEqual(Ones, vec4(ULP1Minus), 1)) ? 0 : 1;
  90. T const ULP2Minus = std::nextafter(ULP1Minus, Zero);
  91. Error += glm::all(glm::notEqual(Ones, vec4(ULP2Minus), 1)) ? 0 : 1;
  92. return Error;
  93. }
  94. int main()
  95. {
  96. int Error = 0;
  97. Error += test_equal_ulps<float>();
  98. Error += test_equal_ulps<double>();
  99. Error += test_notEqual_ulps<float>();
  100. Error += test_notEqual_ulps<double>();
  101. Error += test_equal<glm::vec1>();
  102. Error += test_equal<glm::lowp_vec1>();
  103. Error += test_equal<glm::mediump_vec1>();
  104. Error += test_equal<glm::highp_vec1>();
  105. Error += test_equal<glm::vec2>();
  106. Error += test_equal<glm::lowp_vec2>();
  107. Error += test_equal<glm::mediump_vec2>();
  108. Error += test_equal<glm::highp_vec2>();
  109. Error += test_equal<glm::vec3>();
  110. Error += test_equal<glm::lowp_vec3>();
  111. Error += test_equal<glm::mediump_vec3>();
  112. Error += test_equal<glm::highp_vec3>();
  113. Error += test_equal<glm::vec4>();
  114. Error += test_equal<glm::lowp_vec4>();
  115. Error += test_equal<glm::mediump_vec4>();
  116. Error += test_equal<glm::highp_vec4>();
  117. Error += test_equal<glm::dvec1>();
  118. Error += test_equal<glm::lowp_dvec1>();
  119. Error += test_equal<glm::mediump_dvec1>();
  120. Error += test_equal<glm::highp_dvec1>();
  121. Error += test_equal<glm::dvec2>();
  122. Error += test_equal<glm::lowp_dvec2>();
  123. Error += test_equal<glm::mediump_dvec2>();
  124. Error += test_equal<glm::highp_dvec2>();
  125. Error += test_equal<glm::dvec3>();
  126. Error += test_equal<glm::lowp_dvec3>();
  127. Error += test_equal<glm::mediump_dvec3>();
  128. Error += test_equal<glm::highp_dvec3>();
  129. Error += test_equal<glm::dvec4>();
  130. Error += test_equal<glm::lowp_dvec4>();
  131. Error += test_equal<glm::mediump_dvec4>();
  132. Error += test_equal<glm::highp_dvec4>();
  133. Error += test_notEqual<glm::vec1>();
  134. Error += test_notEqual<glm::lowp_vec1>();
  135. Error += test_notEqual<glm::mediump_vec1>();
  136. Error += test_notEqual<glm::highp_vec1>();
  137. Error += test_notEqual<glm::vec2>();
  138. Error += test_notEqual<glm::lowp_vec2>();
  139. Error += test_notEqual<glm::mediump_vec2>();
  140. Error += test_notEqual<glm::highp_vec2>();
  141. Error += test_notEqual<glm::vec3>();
  142. Error += test_notEqual<glm::lowp_vec3>();
  143. Error += test_notEqual<glm::mediump_vec3>();
  144. Error += test_notEqual<glm::highp_vec3>();
  145. Error += test_notEqual<glm::vec4>();
  146. Error += test_notEqual<glm::lowp_vec4>();
  147. Error += test_notEqual<glm::mediump_vec4>();
  148. Error += test_notEqual<glm::highp_vec4>();
  149. Error += test_notEqual<glm::dvec1>();
  150. Error += test_notEqual<glm::lowp_dvec1>();
  151. Error += test_notEqual<glm::mediump_dvec1>();
  152. Error += test_notEqual<glm::highp_dvec1>();
  153. Error += test_notEqual<glm::dvec2>();
  154. Error += test_notEqual<glm::lowp_dvec2>();
  155. Error += test_notEqual<glm::mediump_dvec2>();
  156. Error += test_notEqual<glm::highp_dvec2>();
  157. Error += test_notEqual<glm::dvec3>();
  158. Error += test_notEqual<glm::lowp_dvec3>();
  159. Error += test_notEqual<glm::mediump_dvec3>();
  160. Error += test_notEqual<glm::highp_dvec3>();
  161. Error += test_notEqual<glm::dvec4>();
  162. Error += test_notEqual<glm::lowp_dvec4>();
  163. Error += test_notEqual<glm::mediump_dvec4>();
  164. Error += test_notEqual<glm::highp_dvec4>();
  165. Error += test_constexpr<glm::vec1, float>();
  166. Error += test_constexpr<glm::vec2, float>();
  167. Error += test_constexpr<glm::vec3, float>();
  168. Error += test_constexpr<glm::vec4, float>();
  169. return Error;
  170. }