Collection of DPF-based plugins for packaging
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

186 lines
5.5KB

  1. /// @ref gtx_hash
  2. /// @file glm/gtx/hash.inl
  3. ///
  4. /// @see core (dependence)
  5. ///
  6. /// @defgroup gtx_hash GLM_GTX_hash
  7. /// @ingroup gtx
  8. ///
  9. /// @brief Add std::hash support for glm types
  10. ///
  11. /// <glm/gtx/hash.inl> need to be included to use the features of this extension.
  12. namespace glm {
  13. namespace detail
  14. {
  15. GLM_INLINE void hash_combine(size_t &seed, size_t hash)
  16. {
  17. hash += 0x9e3779b9 + (seed << 6) + (seed >> 2);
  18. seed ^= hash;
  19. }
  20. }}
  21. namespace std
  22. {
  23. template<typename T, glm::qualifier Q>
  24. GLM_FUNC_QUALIFIER size_t hash<glm::vec<1, T, Q>>::operator()(glm::vec<1, T, Q> const& v) const
  25. {
  26. hash<T> hasher;
  27. return hasher(v.x);
  28. }
  29. template<typename T, glm::qualifier Q>
  30. GLM_FUNC_QUALIFIER size_t hash<glm::vec<2, T, Q>>::operator()(glm::vec<2, T, Q> const& v) const
  31. {
  32. size_t seed = 0;
  33. hash<T> hasher;
  34. glm::detail::hash_combine(seed, hasher(v.x));
  35. glm::detail::hash_combine(seed, hasher(v.y));
  36. return seed;
  37. }
  38. template<typename T, glm::qualifier Q>
  39. GLM_FUNC_QUALIFIER size_t hash<glm::vec<3, T, Q>>::operator()(glm::vec<3, T, Q> const& v) const
  40. {
  41. size_t seed = 0;
  42. hash<T> hasher;
  43. glm::detail::hash_combine(seed, hasher(v.x));
  44. glm::detail::hash_combine(seed, hasher(v.y));
  45. glm::detail::hash_combine(seed, hasher(v.z));
  46. return seed;
  47. }
  48. template<typename T, glm::qualifier Q>
  49. GLM_FUNC_QUALIFIER size_t hash<glm::vec<4, T, Q>>::operator()(glm::vec<4, T, Q> const& v) const
  50. {
  51. size_t seed = 0;
  52. hash<T> hasher;
  53. glm::detail::hash_combine(seed, hasher(v.x));
  54. glm::detail::hash_combine(seed, hasher(v.y));
  55. glm::detail::hash_combine(seed, hasher(v.z));
  56. glm::detail::hash_combine(seed, hasher(v.w));
  57. return seed;
  58. }
  59. template<typename T, glm::qualifier Q>
  60. GLM_FUNC_QUALIFIER size_t hash<glm::tquat<T, Q>>::operator()(glm::tquat<T,Q> const& q) const
  61. {
  62. size_t seed = 0;
  63. hash<T> hasher;
  64. glm::detail::hash_combine(seed, hasher(q.x));
  65. glm::detail::hash_combine(seed, hasher(q.y));
  66. glm::detail::hash_combine(seed, hasher(q.z));
  67. glm::detail::hash_combine(seed, hasher(q.w));
  68. return seed;
  69. }
  70. template<typename T, glm::qualifier Q>
  71. GLM_FUNC_QUALIFIER size_t hash<glm::tdualquat<T, Q>>::operator()(glm::tdualquat<T, Q> const& q) const
  72. {
  73. size_t seed = 0;
  74. hash<glm::tquat<T, Q>> hasher;
  75. glm::detail::hash_combine(seed, hasher(q.real));
  76. glm::detail::hash_combine(seed, hasher(q.dual));
  77. return seed;
  78. }
  79. template<typename T, glm::qualifier Q>
  80. GLM_FUNC_QUALIFIER size_t hash<glm::mat<2, 2, T, Q>>::operator()(glm::mat<2, 2, T, Q> const& m) const
  81. {
  82. size_t seed = 0;
  83. hash<glm::vec<2, T, Q>> hasher;
  84. glm::detail::hash_combine(seed, hasher(m[0]));
  85. glm::detail::hash_combine(seed, hasher(m[1]));
  86. return seed;
  87. }
  88. template<typename T, glm::qualifier Q>
  89. GLM_FUNC_QUALIFIER size_t hash<glm::mat<2, 3, T, Q>>::operator()(glm::mat<2, 3, T, Q> const& m) const
  90. {
  91. size_t seed = 0;
  92. hash<glm::vec<3, T, Q>> hasher;
  93. glm::detail::hash_combine(seed, hasher(m[0]));
  94. glm::detail::hash_combine(seed, hasher(m[1]));
  95. return seed;
  96. }
  97. template<typename T, glm::qualifier Q>
  98. GLM_FUNC_QUALIFIER size_t hash<glm::mat<2, 4, T, Q>>::operator()(glm::mat<2, 4, T, Q> const& m) const
  99. {
  100. size_t seed = 0;
  101. hash<glm::vec<4, T, Q>> hasher;
  102. glm::detail::hash_combine(seed, hasher(m[0]));
  103. glm::detail::hash_combine(seed, hasher(m[1]));
  104. return seed;
  105. }
  106. template<typename T, glm::qualifier Q>
  107. GLM_FUNC_QUALIFIER size_t hash<glm::mat<3, 2, T, Q>>::operator()(glm::mat<3, 2, T, Q> const& m) const
  108. {
  109. size_t seed = 0;
  110. hash<glm::vec<2, T, Q>> hasher;
  111. glm::detail::hash_combine(seed, hasher(m[0]));
  112. glm::detail::hash_combine(seed, hasher(m[1]));
  113. glm::detail::hash_combine(seed, hasher(m[2]));
  114. return seed;
  115. }
  116. template<typename T, glm::qualifier Q>
  117. GLM_FUNC_QUALIFIER size_t hash<glm::mat<3, 3, T, Q>>::operator()(glm::mat<3, 3, T, Q> const& m) const
  118. {
  119. size_t seed = 0;
  120. hash<glm::vec<3, T, Q>> hasher;
  121. glm::detail::hash_combine(seed, hasher(m[0]));
  122. glm::detail::hash_combine(seed, hasher(m[1]));
  123. glm::detail::hash_combine(seed, hasher(m[2]));
  124. return seed;
  125. }
  126. template<typename T, glm::qualifier Q>
  127. GLM_FUNC_QUALIFIER size_t hash<glm::mat<3, 4, T, Q>>::operator()(glm::mat<3, 4, T, Q> const& m) const
  128. {
  129. size_t seed = 0;
  130. hash<glm::vec<4, T, Q>> hasher;
  131. glm::detail::hash_combine(seed, hasher(m[0]));
  132. glm::detail::hash_combine(seed, hasher(m[1]));
  133. glm::detail::hash_combine(seed, hasher(m[2]));
  134. return seed;
  135. }
  136. template<typename T, glm::qualifier Q>
  137. GLM_FUNC_QUALIFIER size_t hash<glm::mat<4, 2, T,Q>>::operator()(glm::mat<4, 2, T,Q> const& m) const
  138. {
  139. size_t seed = 0;
  140. hash<glm::vec<2, T, Q>> hasher;
  141. glm::detail::hash_combine(seed, hasher(m[0]));
  142. glm::detail::hash_combine(seed, hasher(m[1]));
  143. glm::detail::hash_combine(seed, hasher(m[2]));
  144. glm::detail::hash_combine(seed, hasher(m[3]));
  145. return seed;
  146. }
  147. template<typename T, glm::qualifier Q>
  148. GLM_FUNC_QUALIFIER size_t hash<glm::mat<4, 3, T,Q>>::operator()(glm::mat<4, 3, T,Q> const& m) const
  149. {
  150. size_t seed = 0;
  151. hash<glm::vec<3, T, Q>> hasher;
  152. glm::detail::hash_combine(seed, hasher(m[0]));
  153. glm::detail::hash_combine(seed, hasher(m[1]));
  154. glm::detail::hash_combine(seed, hasher(m[2]));
  155. glm::detail::hash_combine(seed, hasher(m[3]));
  156. return seed;
  157. }
  158. template<typename T, glm::qualifier Q>
  159. GLM_FUNC_QUALIFIER size_t hash<glm::mat<4, 4, T,Q>>::operator()(glm::mat<4, 4, T, Q> const& m) const
  160. {
  161. size_t seed = 0;
  162. hash<glm::vec<4, T, Q>> hasher;
  163. glm::detail::hash_combine(seed, hasher(m[0]));
  164. glm::detail::hash_combine(seed, hasher(m[1]));
  165. glm::detail::hash_combine(seed, hasher(m[2]));
  166. glm::detail::hash_combine(seed, hasher(m[3]));
  167. return seed;
  168. }
  169. }