Skip to content

Commit de92b8f

Browse files
committed
Remove overloads in glm::hash and specilize correctly
1 parent a04b1af commit de92b8f

File tree

3 files changed

+39
-138
lines changed

3 files changed

+39
-138
lines changed

glm/gtx/hash.hpp

Lines changed: 19 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,17 @@
4141
#include "../mat4x4.hpp"
4242

4343
#if defined(_MSC_VER)
44-
// MSVC uses _MSVC_LANG instead of __cplusplus
45-
#if _MSVC_LANG < 201103L
46-
#pragma message("GLM_GTX_hash requires C++11 standard library support")
47-
#endif
44+
// MSVC uses _MSVC_LANG instead of __cplusplus
45+
#if _MSVC_LANG < 201103L
46+
#pragma message("GLM_GTX_hash requires C++11 standard library support")
47+
#endif
4848
#elif defined(__GNUC__) || defined(__clang__)
49-
// GNU and Clang use __cplusplus
50-
#if __cplusplus < 201103L
51-
#pragma message("GLM_GTX_hash requires C++11 standard library support")
52-
#endif
49+
// GNU and Clang use __cplusplus
50+
#if __cplusplus < 201103L
51+
#pragma message("GLM_GTX_hash requires C++11 standard library support")
52+
#endif
5353
#else
54-
#error "Unknown compiler"
54+
#error "Unknown compiler"
5555
#endif
5656

5757
#if GLM_LANG & GLM_LANG_CXX11
@@ -93,62 +93,27 @@ namespace std
9393
template<typename T, glm::qualifier Q>
9494
struct hash<glm::tdualquat<T, Q> >
9595
{
96-
GLM_FUNC_DECL size_t operator()(glm::tdualquat<T,Q> const& q) const GLM_NOEXCEPT;
97-
};
98-
99-
template<typename T, glm::qualifier Q>
100-
struct hash<glm::mat<2, 2, T, Q> >
101-
{
102-
GLM_FUNC_DECL size_t operator()(glm::mat<2, 2, T,Q> const& m) const GLM_NOEXCEPT;
103-
};
104-
105-
template<typename T, glm::qualifier Q>
106-
struct hash<glm::mat<2, 3, T, Q> >
107-
{
108-
GLM_FUNC_DECL size_t operator()(glm::mat<2, 3, T,Q> const& m) const GLM_NOEXCEPT;
109-
};
110-
111-
template<typename T, glm::qualifier Q>
112-
struct hash<glm::mat<2, 4, T, Q> >
113-
{
114-
GLM_FUNC_DECL size_t operator()(glm::mat<2, 4, T,Q> const& m) const GLM_NOEXCEPT;
96+
GLM_FUNC_DECL size_t operator()(glm::tdualquat<T, Q> const& q) const GLM_NOEXCEPT;
11597
};
11698

117-
template<typename T, glm::qualifier Q>
118-
struct hash<glm::mat<3, 2, T, Q> >
119-
{
120-
GLM_FUNC_DECL size_t operator()(glm::mat<3, 2, T,Q> const& m) const GLM_NOEXCEPT;
121-
};
122-
123-
template<typename T, glm::qualifier Q>
124-
struct hash<glm::mat<3, 3, T, Q> >
125-
{
126-
GLM_FUNC_DECL size_t operator()(glm::mat<3, 3, T,Q> const& m) const GLM_NOEXCEPT;
127-
};
128-
129-
template<typename T, glm::qualifier Q>
130-
struct hash<glm::mat<3, 4, T, Q> >
99+
template<glm::length_t R,typename T, glm::qualifier Q>
100+
struct hash<glm::mat<2, R, T, Q> >
131101
{
132-
GLM_FUNC_DECL size_t operator()(glm::mat<3, 4, T,Q> const& m) const GLM_NOEXCEPT;
102+
GLM_FUNC_DECL size_t operator()(glm::mat<2, R, T, Q> const& m) const GLM_NOEXCEPT;
133103
};
134104

135-
template<typename T, glm::qualifier Q>
136-
struct hash<glm::mat<4, 2, T, Q> >
105+
template<glm::length_t R,typename T, glm::qualifier Q>
106+
struct hash<glm::mat<3, R, T, Q> >
137107
{
138-
GLM_FUNC_DECL size_t operator()(glm::mat<4, 2, T,Q> const& m) const GLM_NOEXCEPT;
108+
GLM_FUNC_DECL size_t operator()(glm::mat<3, R, T, Q> const& m) const GLM_NOEXCEPT;
139109
};
140110

141-
template<typename T, glm::qualifier Q>
142-
struct hash<glm::mat<4, 3, T, Q> >
111+
template<glm::length_t R,typename T, glm::qualifier Q>
112+
struct hash<glm::mat<4, R, T, Q> >
143113
{
144-
GLM_FUNC_DECL size_t operator()(glm::mat<4, 3, T,Q> const& m) const GLM_NOEXCEPT;
114+
GLM_FUNC_DECL size_t operator()(glm::mat<4, R, T, Q> const& m) const GLM_NOEXCEPT;
145115
};
146116

147-
template<typename T, glm::qualifier Q>
148-
struct hash<glm::mat<4, 4, T, Q> >
149-
{
150-
GLM_FUNC_DECL size_t operator()(glm::mat<4, 4, T,Q> const& m) const GLM_NOEXCEPT;
151-
};
152117
} // namespace std
153118

154119
#include "hash.inl"

glm/gtx/hash.inl

Lines changed: 19 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
/// @ref gtx_hash
22

33
namespace glm {
4-
namespace detail
5-
{
6-
GLM_INLINE void hash_combine(size_t &seed, size_t hash)
4+
namespace detail
75
{
8-
hash += 0x9e3779b9 + (seed << 6) + (seed >> 2);
9-
seed ^= hash;
6+
GLM_INLINE void hash_combine(size_t& seed, size_t hash)
7+
{
8+
hash += 0x9e3779b9 + (seed << 6) + (seed >> 2);
9+
seed ^= hash;
10+
}
1011
}
11-
}}
12+
}
13+
14+
namespace std {
1215

13-
namespace std
14-
{
1516
template<typename T, glm::qualifier Q>
1617
GLM_FUNC_QUALIFIER size_t hash<glm::vec<1, T, Q> >::operator()(glm::vec<1, T, Q> const& v) const GLM_NOEXCEPT
1718
{
@@ -53,7 +54,7 @@ namespace std
5354
}
5455

5556
template<typename T, glm::qualifier Q>
56-
GLM_FUNC_QUALIFIER size_t hash<glm::qua<T, Q> >::operator()(glm::qua<T,Q> const& q) const GLM_NOEXCEPT
57+
GLM_FUNC_QUALIFIER size_t hash<glm::qua<T, Q> >::operator()(glm::qua<T, Q> const& q) const GLM_NOEXCEPT
5758
{
5859
size_t seed = 0;
5960
hash<T> hasher;
@@ -74,102 +75,37 @@ namespace std
7475
return seed;
7576
}
7677

77-
template<typename T, glm::qualifier Q>
78-
GLM_FUNC_QUALIFIER size_t hash<glm::mat<2, 2, T, Q> >::operator()(glm::mat<2, 2, T, Q> const& m) const GLM_NOEXCEPT
79-
{
80-
size_t seed = 0;
81-
hash<glm::vec<2, T, Q> > hasher;
82-
glm::detail::hash_combine(seed, hasher(m[0]));
83-
glm::detail::hash_combine(seed, hasher(m[1]));
84-
return seed;
85-
}
86-
87-
template<typename T, glm::qualifier Q>
88-
GLM_FUNC_QUALIFIER size_t hash<glm::mat<2, 3, T, Q> >::operator()(glm::mat<2, 3, T, Q> const& m) const GLM_NOEXCEPT
89-
{
90-
size_t seed = 0;
91-
hash<glm::vec<3, T, Q> > hasher;
92-
glm::detail::hash_combine(seed, hasher(m[0]));
93-
glm::detail::hash_combine(seed, hasher(m[1]));
94-
return seed;
95-
}
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 GLM_NOEXCEPT
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-
107-
template<typename T, glm::qualifier Q>
108-
GLM_FUNC_QUALIFIER size_t hash<glm::mat<3, 2, T, Q> >::operator()(glm::mat<3, 2, T, Q> const& m) const GLM_NOEXCEPT
109-
{
110-
size_t seed = 0;
111-
hash<glm::vec<2, T, Q> > hasher;
112-
glm::detail::hash_combine(seed, hasher(m[0]));
113-
glm::detail::hash_combine(seed, hasher(m[1]));
114-
glm::detail::hash_combine(seed, hasher(m[2]));
115-
return seed;
116-
}
117-
118-
template<typename T, glm::qualifier Q>
119-
GLM_FUNC_QUALIFIER size_t hash<glm::mat<3, 3, T, Q> >::operator()(glm::mat<3, 3, T, Q> const& m) const GLM_NOEXCEPT
78+
template<glm::length_t R, typename T, glm::qualifier Q>
79+
GLM_FUNC_QUALIFIER size_t hash<glm::mat<2, R, T, Q> >::operator()(glm::mat<2, R, T, Q> const& m) const GLM_NOEXCEPT
12080
{
12181
size_t seed = 0;
122-
hash<glm::vec<3, T, Q> > hasher;
82+
hash<glm::vec<R, T, Q> > hasher;
12383
glm::detail::hash_combine(seed, hasher(m[0]));
12484
glm::detail::hash_combine(seed, hasher(m[1]));
125-
glm::detail::hash_combine(seed, hasher(m[2]));
12685
return seed;
12786
}
12887

129-
template<typename T, glm::qualifier Q>
130-
GLM_FUNC_QUALIFIER size_t hash<glm::mat<3, 4, T, Q> >::operator()(glm::mat<3, 4, T, Q> const& m) const GLM_NOEXCEPT
88+
template<glm::length_t R, typename T, glm::qualifier Q>
89+
GLM_FUNC_QUALIFIER size_t hash<glm::mat<3, R, T, Q> >::operator()(glm::mat<3, R, T, Q> const& m) const GLM_NOEXCEPT
13190
{
13291
size_t seed = 0;
133-
hash<glm::vec<4, T, Q> > hasher;
92+
hash<glm::vec<R, T, Q> > hasher;
13493
glm::detail::hash_combine(seed, hasher(m[0]));
13594
glm::detail::hash_combine(seed, hasher(m[1]));
13695
glm::detail::hash_combine(seed, hasher(m[2]));
13796
return seed;
13897
}
13998

140-
template<typename T, glm::qualifier Q>
141-
GLM_FUNC_QUALIFIER size_t hash<glm::mat<4, 2, T,Q> >::operator()(glm::mat<4, 2, T,Q> const& m) const GLM_NOEXCEPT
99+
template<glm::length_t R, typename T, glm::qualifier Q >
100+
GLM_FUNC_QUALIFIER size_t hash<glm::mat<4, R, T, Q> >::operator()(glm::mat<4, R, T, Q> const& m) const GLM_NOEXCEPT
142101
{
143102
size_t seed = 0;
144-
hash<glm::vec<2, T, Q> > hasher;
103+
hash<glm::vec<R, T, Q> > hasher;
145104
glm::detail::hash_combine(seed, hasher(m[0]));
146105
glm::detail::hash_combine(seed, hasher(m[1]));
147106
glm::detail::hash_combine(seed, hasher(m[2]));
148107
glm::detail::hash_combine(seed, hasher(m[3]));
149108
return seed;
150109
}
151110

152-
template<typename T, glm::qualifier Q>
153-
GLM_FUNC_QUALIFIER size_t hash<glm::mat<4, 3, T,Q> >::operator()(glm::mat<4, 3, T,Q> const& m) const GLM_NOEXCEPT
154-
{
155-
size_t seed = 0;
156-
hash<glm::vec<3, T, Q> > hasher;
157-
glm::detail::hash_combine(seed, hasher(m[0]));
158-
glm::detail::hash_combine(seed, hasher(m[1]));
159-
glm::detail::hash_combine(seed, hasher(m[2]));
160-
glm::detail::hash_combine(seed, hasher(m[3]));
161-
return seed;
162-
}
163-
164-
template<typename T, glm::qualifier Q>
165-
GLM_FUNC_QUALIFIER size_t hash<glm::mat<4, 4, T,Q> >::operator()(glm::mat<4, 4, T, Q> const& m) const GLM_NOEXCEPT
166-
{
167-
size_t seed = 0;
168-
hash<glm::vec<4, T, Q> > hasher;
169-
glm::detail::hash_combine(seed, hasher(m[0]));
170-
glm::detail::hash_combine(seed, hasher(m[1]));
171-
glm::detail::hash_combine(seed, hasher(m[2]));
172-
glm::detail::hash_combine(seed, hasher(m[3]));
173-
return seed;
174-
}
175111
}

test/gtx/gtx_hash.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#if __cplusplus >= 201103L
1+
#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSVC_LANG >= 201103L)
22

33
#include <glm/detail/setup.hpp>
44

0 commit comments

Comments
 (0)