Skip to content

Commit 22fdd3b

Browse files
Reliable aligned types
1 parent d34c19e commit 22fdd3b

15 files changed

+559
-881
lines changed

glm/detail/qualifier.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ namespace glm
3434

3535
template<length_t L, typename T, qualifier Q = defaultp> struct vec;
3636
template<length_t C, length_t R, typename T, qualifier Q = defaultp> struct mat;
37-
template<typename T, qualifier Q = defaultp> struct qua;
37+
template<typename T, qualifier Q = defaultp, std::size_t N = alignof(T)> struct qua;
3838

3939
template <typename T, qualifier Q = defaultp> using tvec1 = vec<1, T, Q>;
4040
template <typename T, qualifier Q = defaultp> using tvec2 = vec<2, T, Q>;

glm/detail/type_quat.hpp

Lines changed: 43 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ namespace glm
1919
# if GLM_COMPILER & GLM_COMPILER_GCC
2020
# pragma GCC diagnostic push
2121
# pragma GCC diagnostic ignored "-Wpedantic"
22+
# pragma GCC diagnostic ignored "-Wattributes" // for alignas(1), packed types
2223
# elif GLM_COMPILER & GLM_COMPILER_CLANG
2324
# pragma clang diagnostic push
2425
# pragma clang diagnostic ignored "-Wgnu-anonymous-struct"
@@ -29,8 +30,8 @@ namespace glm
2930
# endif
3031
# endif
3132

32-
template<typename T, qualifier Q>
33-
struct qua
33+
template<typename T, qualifier Q, std::size_t N>
34+
struct alignas(N) qua
3435
{
3536
// -- Implementation detail --
3637

@@ -71,9 +72,9 @@ namespace glm
7172
// -- Implicit basic constructors --
7273

7374
GLM_DEFAULTED_DEFAULT_CTOR_DECL GLM_CONSTEXPR qua() GLM_DEFAULT_CTOR;
74-
GLM_CTOR_DECL qua(qua<T, Q> const& q) = default;
75+
GLM_CTOR_DECL qua(qua<T, Q, N> const& q) = default;
7576
template<qualifier P>
76-
GLM_CTOR_DECL qua(qua<T, P> const& q);
77+
GLM_CTOR_DECL qua(qua<T, P, N> const& q);
7778

7879
// -- Explicit basic constructors --
7980

@@ -85,12 +86,12 @@ namespace glm
8586
GLM_CTOR_DECL qua(T w, T x, T y, T z);
8687
# endif
8788

88-
GLM_FUNC_DECL static GLM_CONSTEXPR qua<T, Q> wxyz(T w, T x, T y, T z);
89+
GLM_FUNC_DECL static GLM_CONSTEXPR qua<T, Q, N> wxyz(T w, T x, T y, T z);
8990

9091
// -- Conversion constructors --
9192

92-
template<typename U, qualifier P>
93-
GLM_CTOR_DECL GLM_EXPLICIT qua(qua<U, P> const& q);
93+
template<typename U, qualifier P, std::size_t M>
94+
GLM_CTOR_DECL GLM_EXPLICIT qua(qua<U, P, M> const& q);
9495

9596
GLM_FUNC_DECL explicit operator mat<3, 3, T, Q>() const;
9697
GLM_FUNC_DECL explicit operator mat<4, 4, T, Q>() const;
@@ -110,20 +111,20 @@ namespace glm
110111

111112
// -- Unary arithmetic operators --
112113

113-
GLM_FUNC_DISCARD_DECL GLM_CONSTEXPR qua<T, Q>& operator=(qua<T, Q> const& q) = default;
114+
GLM_FUNC_DISCARD_DECL GLM_CONSTEXPR qua<T, Q, N>& operator=(qua<T, Q, N> const& q) = default;
114115

115116
template<typename U>
116-
GLM_FUNC_DISCARD_DECL GLM_CONSTEXPR qua<T, Q>& operator=(qua<U, Q> const& q);
117+
GLM_FUNC_DISCARD_DECL GLM_CONSTEXPR qua<T, Q, N>& operator=(qua<U, Q, N> const& q);
117118
template<typename U>
118-
GLM_FUNC_DISCARD_DECL GLM_CONSTEXPR qua<T, Q>& operator+=(qua<U, Q> const& q);
119+
GLM_FUNC_DISCARD_DECL GLM_CONSTEXPR qua<T, Q, N>& operator+=(qua<U, Q, N> const& q);
119120
template<typename U>
120-
GLM_FUNC_DISCARD_DECL GLM_CONSTEXPR qua<T, Q>& operator-=(qua<U, Q> const& q);
121+
GLM_FUNC_DISCARD_DECL GLM_CONSTEXPR qua<T, Q, N>& operator-=(qua<U, Q, N> const& q);
121122
template<typename U>
122-
GLM_FUNC_DISCARD_DECL GLM_CONSTEXPR qua<T, Q>& operator*=(qua<U, Q> const& q);
123+
GLM_FUNC_DISCARD_DECL GLM_CONSTEXPR qua<T, Q, N>& operator*=(qua<U, Q, N> const& q);
123124
template<typename U>
124-
GLM_FUNC_DISCARD_DECL GLM_CONSTEXPR qua<T, Q>& operator*=(U s);
125+
GLM_FUNC_DISCARD_DECL GLM_CONSTEXPR qua<T, Q, N>& operator*=(U s);
125126
template<typename U>
126-
GLM_FUNC_DISCARD_DECL GLM_CONSTEXPR qua<T, Q>& operator/=(U s);
127+
GLM_FUNC_DISCARD_DECL GLM_CONSTEXPR qua<T, Q, N>& operator/=(U s);
127128
};
128129

129130
# if GLM_SILENT_WARNINGS == GLM_ENABLE
@@ -138,51 +139,51 @@ namespace glm
138139

139140
// -- Unary bit operators --
140141

141-
template<typename T, qualifier Q>
142-
GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q> operator+(qua<T, Q> const& q);
142+
template<typename T, qualifier Q, std::size_t N>
143+
GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q, N> operator+(qua<T, Q, N> const& q);
143144

144-
template<typename T, qualifier Q>
145-
GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q> operator-(qua<T, Q> const& q);
145+
template<typename T, qualifier Q, std::size_t N>
146+
GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q, N> operator-(qua<T, Q, N> const& q);
146147

147148
// -- Binary operators --
148149

149-
template<typename T, qualifier Q>
150-
GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q> operator+(qua<T, Q> const& q, qua<T, Q> const& p);
150+
template<typename T, qualifier Q, std::size_t N>
151+
GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q, N> operator+(qua<T, Q, N> const& q, qua<T, Q, N> const& p);
151152

152-
template<typename T, qualifier Q>
153-
GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q> operator-(qua<T, Q> const& q, qua<T, Q> const& p);
153+
template<typename T, qualifier Q, std::size_t N>
154+
GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q, N> operator-(qua<T, Q, N> const& q, qua<T, Q, N> const& p);
154155

155-
template<typename T, qualifier Q>
156-
GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q> operator*(qua<T, Q> const& q, qua<T, Q> const& p);
156+
template<typename T, qualifier Q, std::size_t N>
157+
GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q, N> operator*(qua<T, Q, N> const& q, qua<T, Q, N> const& p);
157158

158-
template<typename T, qualifier Q>
159-
GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator*(qua<T, Q> const& q, vec<3, T, Q> const& v);
159+
template<typename T, qualifier Q, std::size_t N>
160+
GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator*(qua<T, Q, N> const& q, vec<3, T, Q> const& v);
160161

161-
template<typename T, qualifier Q>
162-
GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v, qua<T, Q> const& q);
162+
template<typename T, qualifier Q, std::size_t N>
163+
GLM_FUNC_DECL GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v, qua<T, Q, N> const& q);
163164

164-
template<typename T, qualifier Q>
165-
GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(qua<T, Q> const& q, vec<4, T, Q> const& v);
165+
template<typename T, qualifier Q, std::size_t N>
166+
GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(qua<T, Q, N> const& q, vec<4, T, Q> const& v);
166167

167-
template<typename T, qualifier Q>
168-
GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v, qua<T, Q> const& q);
168+
template<typename T, qualifier Q, std::size_t N>
169+
GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v, qua<T, Q, N> const& q);
169170

170-
template<typename T, qualifier Q>
171-
GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q> operator*(qua<T, Q> const& q, T const& s);
171+
template<typename T, qualifier Q, std::size_t N>
172+
GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q, N> operator*(qua<T, Q, N> const& q, T const& s);
172173

173-
template<typename T, qualifier Q>
174-
GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q> operator*(T const& s, qua<T, Q> const& q);
174+
template<typename T, qualifier Q, std::size_t N>
175+
GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q, N> operator*(T const& s, qua<T, Q, N> const& q);
175176

176-
template<typename T, qualifier Q>
177-
GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q> operator/(qua<T, Q> const& q, T const& s);
177+
template<typename T, qualifier Q, std::size_t N>
178+
GLM_FUNC_DECL GLM_CONSTEXPR qua<T, Q, N> operator/(qua<T, Q, N> const& q, T const& s);
178179

179180
// -- Boolean operators --
180181

181-
template<typename T, qualifier Q>
182-
GLM_FUNC_DECL GLM_CONSTEXPR bool operator==(qua<T, Q> const& q1, qua<T, Q> const& q2);
182+
template<typename T, qualifier Q, std::size_t N>
183+
GLM_FUNC_DECL GLM_CONSTEXPR bool operator==(qua<T, Q, N> const& q1, qua<T, Q, N> const& q2);
183184

184-
template<typename T, qualifier Q>
185-
GLM_FUNC_DECL GLM_CONSTEXPR bool operator!=(qua<T, Q> const& q1, qua<T, Q> const& q2);
185+
template<typename T, qualifier Q, std::size_t N>
186+
GLM_FUNC_DECL GLM_CONSTEXPR bool operator!=(qua<T, Q, N> const& q1, qua<T, Q, N> const& q2);
186187
} //namespace glm
187188

188189
#ifndef GLM_EXTERNAL_TEMPLATE

0 commit comments

Comments
 (0)