@@ -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