compute_vector_decl.hpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #pragma once
  2. #include <functional>
  3. #include "_vectorize.hpp"
  4. namespace glm {
  5. namespace detail
  6. {
  7. template<length_t L, typename T, qualifier Q, bool UseSimd>
  8. struct compute_vec_add {};
  9. template<length_t L, typename T, qualifier Q, bool UseSimd>
  10. struct compute_vec_sub {};
  11. template<length_t L, typename T, qualifier Q, bool UseSimd>
  12. struct compute_vec_mul {};
  13. template<length_t L, typename T, qualifier Q, bool UseSimd>
  14. struct compute_vec_div {};
  15. template<length_t L, typename T, qualifier Q, bool UseSimd>
  16. struct compute_vec_mod {};
  17. template<length_t L, typename T, qualifier Q, bool UseSimd>
  18. struct compute_splat {};
  19. template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
  20. struct compute_vec_and {};
  21. template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
  22. struct compute_vec_or {};
  23. template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
  24. struct compute_vec_xor {};
  25. template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
  26. struct compute_vec_shift_left {};
  27. template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
  28. struct compute_vec_shift_right {};
  29. template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
  30. struct compute_vec_equal {};
  31. template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
  32. struct compute_vec_nequal {};
  33. template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
  34. struct compute_vec_bitwise_not {};
  35. template<length_t L, typename T, qualifier Q>
  36. struct compute_vec_add<L, T, Q, false>
  37. {
  38. GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
  39. {
  40. return detail::functor2<vec, L, T, Q>::call(std::plus<T>(), a, b);
  41. }
  42. };
  43. template<length_t L, typename T, qualifier Q>
  44. struct compute_vec_sub<L, T, Q, false>
  45. {
  46. GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
  47. {
  48. return detail::functor2<vec, L, T, Q>::call(std::minus<T>(), a, b);
  49. }
  50. };
  51. template<length_t L, typename T, qualifier Q>
  52. struct compute_vec_mul<L, T, Q, false>
  53. {
  54. GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
  55. {
  56. return detail::functor2<vec, L, T, Q>::call(std::multiplies<T>(), a, b);
  57. }
  58. };
  59. template<length_t L, typename T, qualifier Q>
  60. struct compute_vec_div<L, T, Q, false>
  61. {
  62. GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
  63. {
  64. return detail::functor2<vec, L, T, Q>::call(std::divides<T>(), a, b);
  65. }
  66. };
  67. template<length_t L, typename T, qualifier Q>
  68. struct compute_vec_mod<L, T, Q, false>
  69. {
  70. GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
  71. {
  72. return detail::functor2<vec, L, T, Q>::call(std::modulus<T>(), a, b);
  73. }
  74. };
  75. template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size>
  76. struct compute_vec_and<L, T, Q, IsInt, Size, false>
  77. {
  78. GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
  79. {
  80. vec<L, T, Q> v(a);
  81. for (length_t i = 0; i < L; ++i)
  82. v[i] &= static_cast<T>(b[i]);
  83. return v;
  84. }
  85. };
  86. template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size>
  87. struct compute_vec_or<L, T, Q, IsInt, Size, false>
  88. {
  89. GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
  90. {
  91. vec<L, T, Q> v(a);
  92. for (length_t i = 0; i < L; ++i)
  93. v[i] |= static_cast<T>(b[i]);
  94. return v;
  95. }
  96. };
  97. template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size>
  98. struct compute_vec_xor<L, T, Q, IsInt, Size, false>
  99. {
  100. GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
  101. {
  102. vec<L, T, Q> v(a);
  103. for (length_t i = 0; i < L; ++i)
  104. v[i] ^= static_cast<T>(b[i]);
  105. return v;
  106. }
  107. };
  108. template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size>
  109. struct compute_vec_shift_left<L, T, Q, IsInt, Size, false>
  110. {
  111. GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
  112. {
  113. vec<L, T, Q> v(a);
  114. for (length_t i = 0; i < L; ++i)
  115. v[i] <<= static_cast<T>(b[i]);
  116. return v;
  117. }
  118. };
  119. template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size>
  120. struct compute_vec_shift_right<L, T, Q, IsInt, Size, false>
  121. {
  122. GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
  123. {
  124. vec<L, T, Q> v(a);
  125. for (length_t i = 0; i < L; ++i)
  126. v[i] >>= static_cast<T>(b[i]);
  127. return v;
  128. }
  129. };
  130. template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size>
  131. struct compute_vec_equal<L, T, Q, IsInt, Size, false>
  132. {
  133. GLM_FUNC_QUALIFIER GLM_CONSTEXPR static bool call(vec<L, T, Q> const& v1, vec<L, T, Q> const& v2)
  134. {
  135. bool b = true;
  136. for (length_t i = 0; i < L; ++i)
  137. b = b && detail::compute_equal<T, std::numeric_limits<T>::is_iec559>::call(v1.x, v2.x);
  138. return b;
  139. }
  140. };
  141. template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size>
  142. struct compute_vec_nequal<L, T, Q, IsInt, Size, false>
  143. {
  144. GLM_FUNC_QUALIFIER GLM_CONSTEXPR static bool call(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)
  145. {
  146. return !compute_vec_equal<L, T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(v1, v2);
  147. }
  148. };
  149. template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size>
  150. struct compute_vec_bitwise_not<L, T, Q, IsInt, Size, false>
  151. {
  152. GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a)
  153. {
  154. vec<L, T, Q> v(a);
  155. for (length_t i = 0; i < L; ++i)
  156. v[i] = ~v[i];
  157. return v;
  158. }
  159. };
  160. }
  161. }