1 /// @ref core
2 /// @file glm/detail/type_vec4.hpp
3 
4 #pragma once
5 
6 #include "qualifier.hpp"
7 #if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR
8 #	include "_swizzle.hpp"
9 #elif GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION
10 #	include "_swizzle_func.hpp"
11 #endif
12 #include <cstddef>
13 
14 namespace glm
15 {
16 	template<typename T, qualifier Q>
17 	struct vec<4, T, Q>
18 	{
19 		// -- Implementation detail --
20 
21 		typedef T value_type;
22 		typedef vec<4, T, Q> type;
23 		typedef vec<4, bool, Q> bool_type;
24 
25 		// -- Data --
26 
27 #		if GLM_SILENT_WARNINGS == GLM_ENABLE
28 #			if GLM_COMPILER & GLM_COMPILER_GCC
29 #				pragma GCC diagnostic push
30 #				pragma GCC diagnostic ignored "-Wpedantic"
31 #			elif GLM_COMPILER & GLM_COMPILER_CLANG
32 #				pragma clang diagnostic push
33 #				pragma clang diagnostic ignored "-Wgnu-anonymous-struct"
34 #				pragma clang diagnostic ignored "-Wnested-anon-types"
35 #			elif GLM_COMPILER & GLM_COMPILER_VC
36 #				pragma warning(push)
37 #				pragma warning(disable: 4201)  // nonstandard extension used : nameless struct/union
38 #			endif
39 #		endif
40 
41 #		if GLM_CONFIG_XYZW_ONLY
42 			T x, y, z, w;
43 #		elif GLM_CONFIG_ANONYMOUS_STRUCT == GLM_ENABLE
44 			union
45 			{
46 				struct { T x, y, z, w; };
47 				struct { T r, g, b, a; };
48 				struct { T s, t, p, q; };
49 
50 				typename detail::storage<4, T, detail::is_aligned<Q>::value>::type data;
51 
52 #				if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR
53 					GLM_SWIZZLE4_2_MEMBERS(T, Q, x, y, z, w)
54 					GLM_SWIZZLE4_2_MEMBERS(T, Q, r, g, b, a)
55 					GLM_SWIZZLE4_2_MEMBERS(T, Q, s, t, p, q)
56 					GLM_SWIZZLE4_3_MEMBERS(T, Q, x, y, z, w)
57 					GLM_SWIZZLE4_3_MEMBERS(T, Q, r, g, b, a)
58 					GLM_SWIZZLE4_3_MEMBERS(T, Q, s, t, p, q)
59 					GLM_SWIZZLE4_4_MEMBERS(T, Q, x, y, z, w)
60 					GLM_SWIZZLE4_4_MEMBERS(T, Q, r, g, b, a)
61 					GLM_SWIZZLE4_4_MEMBERS(T, Q, s, t, p, q)
62 #				endif
63 			};
64 #		else
65 			union { T x, r, s; };
66 			union { T y, g, t; };
67 			union { T z, b, p; };
68 			union { T w, a, q; };
69 
70 #			if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_FUNCTION
71 				GLM_SWIZZLE_GEN_VEC_FROM_VEC4(T, Q)
72 #			endif
73 #		endif
74 
75 #		if GLM_SILENT_WARNINGS == GLM_ENABLE
76 #			if GLM_COMPILER & GLM_COMPILER_CLANG
77 #				pragma clang diagnostic pop
78 #			elif GLM_COMPILER & GLM_COMPILER_GCC
79 #				pragma GCC diagnostic pop
80 #			elif GLM_COMPILER & GLM_COMPILER_VC
81 #				pragma warning(pop)
82 #			endif
83 #		endif
84 
85 		// -- Component accesses --
86 
87 		typedef length_t length_type;
88 
89 		/// Return the count of components of the vector
lengthglm::vec90 		GLM_FUNC_DECL static GLM_CONSTEXPR length_type length(){return 4;}
91 
92 		GLM_FUNC_DECL GLM_CONSTEXPR T & operator[](length_type i);
93 		GLM_FUNC_DECL GLM_CONSTEXPR T const& operator[](length_type i) const;
94 
95 		// -- Implicit basic constructors --
96 
97 		GLM_FUNC_DECL GLM_CONSTEXPR vec() GLM_DEFAULT;
98 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<4, T, Q> const& v) GLM_DEFAULT;
99 		template<qualifier P>
100 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<4, T, P> const& v);
101 
102 		// -- Explicit basic constructors --
103 
104 		GLM_FUNC_DECL GLM_CONSTEXPR explicit vec(T scalar);
105 		GLM_FUNC_DECL GLM_CONSTEXPR vec(T x, T y, T z, T w);
106 
107 		// -- Conversion scalar constructors --
108 
109 		template<typename U, qualifier P>
110 		GLM_FUNC_DECL GLM_CONSTEXPR explicit vec(vec<1, U, P> const& v);
111 
112 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
113 		template<typename X, typename Y, typename Z, typename W>
114 		GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, Y _y, Z _z, W _w);
115 		template<typename X, typename Y, typename Z, typename W>
116 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, Y _y, Z _z, W _w);
117 		template<typename X, typename Y, typename Z, typename W>
118 		GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, vec<1, Y, Q> const& _y, Z _z, W _w);
119 		template<typename X, typename Y, typename Z, typename W>
120 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, Z _z, W _w);
121 		template<typename X, typename Y, typename Z, typename W>
122 		GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, Y _y, vec<1, Z, Q> const& _z, W _w);
123 		template<typename X, typename Y, typename Z, typename W>
124 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, Y _y, vec<1, Z, Q> const& _z, W _w);
125 		template<typename X, typename Y, typename Z, typename W>
126 		GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, W _w);
127 		template<typename X, typename Y, typename Z, typename W>
128 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, W _w);
129 		template<typename X, typename Y, typename Z, typename W>
130 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, Y _y, Z _z, vec<1, W, Q> const& _w);
131 		template<typename X, typename Y, typename Z, typename W>
132 		GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, vec<1, Y, Q> const& _y, Z _z, vec<1, W, Q> const& _w);
133 		template<typename X, typename Y, typename Z, typename W>
134 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, Z _z, vec<1, W, Q> const& _w);
135 		template<typename X, typename Y, typename Z, typename W>
136 		GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, Y _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w);
137 		template<typename X, typename Y, typename Z, typename W>
138 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, Y _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w);
139 		template<typename X, typename Y, typename Z, typename W>
140 		GLM_FUNC_DECL GLM_CONSTEXPR vec(X _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w);
141 		template<typename X, typename Y, typename Z, typename W>
142 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _Y, vec<1, Z, Q> const& _z, vec<1, W, Q> const& _w);
143 
144 		// -- Conversion vector constructors --
145 
146 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
147 		template<typename A, typename B, typename C, qualifier P>
148 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, B _z, C _w);
149 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
150 		template<typename A, typename B, typename C, qualifier P>
151 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z, C _w);
152 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
153 		template<typename A, typename B, typename C, qualifier P>
154 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, B _z, vec<1, C, P> const& _w);
155 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
156 		template<typename A, typename B, typename C, qualifier P>
157 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z, vec<1, C, P> const& _w);
158 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
159 		template<typename A, typename B, typename C, qualifier P>
160 		GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, vec<2, B, P> const& _yz, C _w);
161 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
162 		template<typename A, typename B, typename C, qualifier P>
163 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz, C _w);
164 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
165 		template<typename A, typename B, typename C, qualifier P>
166 		GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, vec<2, B, P> const& _yz, vec<1, C, P> const& _w);
167 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
168 		template<typename A, typename B, typename C, qualifier P>
169 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz, vec<1, C, P> const& _w);
170 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
171 		template<typename A, typename B, typename C, qualifier P>
172 		GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, B _y, vec<2, C, P> const& _zw);
173 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
174 		template<typename A, typename B, typename C, qualifier P>
175 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, B _y, vec<2, C, P> const& _zw);
176 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
177 		template<typename A, typename B, typename C, qualifier P>
178 		GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, vec<1, B, P> const& _y, vec<2, C, P> const& _zw);
179 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
180 		template<typename A, typename B, typename C, qualifier P>
181 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, vec<1, B, P> const& _y, vec<2, C, P> const& _zw);
182 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
183 		template<typename A, typename B, qualifier P>
184 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<3, A, P> const& _xyz, B _w);
185 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
186 		template<typename A, typename B, qualifier P>
187 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<3, A, P> const& _xyz, vec<1, B, P> const& _w);
188 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
189 		template<typename A, typename B, qualifier P>
190 		GLM_FUNC_DECL GLM_CONSTEXPR vec(A _x, vec<3, B, P> const& _yzw);
191 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
192 		template<typename A, typename B, qualifier P>
193 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<1, A, P> const& _x, vec<3, B, P> const& _yzw);
194 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
195 		template<typename A, typename B, qualifier P>
196 		GLM_FUNC_DECL GLM_CONSTEXPR vec(vec<2, A, P> const& _xy, vec<2, B, P> const& _zw);
197 
198 		/// Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification)
199 		template<typename U, qualifier P>
200 		GLM_FUNC_DECL GLM_CONSTEXPR GLM_EXPLICIT vec(vec<4, U, P> const& v);
201 
202 		// -- Swizzle constructors --
203 #		if GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR
204 			template<int E0, int E1, int E2, int E3>
vecglm::vec205 			GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<4, T, Q, E0, E1, E2, E3> const& that)
206 			{
207 				*this = that();
208 			}
209 
210 			template<int E0, int E1, int F0, int F1>
vecglm::vec211 			GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, detail::_swizzle<2, T, Q, F0, F1, -1, -2> const& u)
212 			{
213 				*this = vec<4, T, Q>(v(), u());
214 			}
215 
216 			template<int E0, int E1>
vecglm::vec217 			GLM_FUNC_DECL GLM_CONSTEXPR vec(T const& x, T const& y, detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v)
218 			{
219 				*this = vec<4, T, Q>(x, y, v());
220 			}
221 
222 			template<int E0, int E1>
vecglm::vec223 			GLM_FUNC_DECL GLM_CONSTEXPR vec(T const& x, detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, T const& w)
224 			{
225 				*this = vec<4, T, Q>(x, v(), w);
226 			}
227 
228 			template<int E0, int E1>
vecglm::vec229 			GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<2, T, Q, E0, E1, -1, -2> const& v, T const& z, T const& w)
230 			{
231 				*this = vec<4, T, Q>(v(), z, w);
232 			}
233 
234 			template<int E0, int E1, int E2>
vecglm::vec235 			GLM_FUNC_DECL GLM_CONSTEXPR vec(detail::_swizzle<3, T, Q, E0, E1, E2, -1> const& v, T const& w)
236 			{
237 				*this = vec<4, T, Q>(v(), w);
238 			}
239 
240 			template<int E0, int E1, int E2>
vecglm::vec241 			GLM_FUNC_DECL GLM_CONSTEXPR vec(T const& x, detail::_swizzle<3, T, Q, E0, E1, E2, -1> const& v)
242 			{
243 				*this = vec<4, T, Q>(x, v());
244 			}
245 #		endif//GLM_CONFIG_SWIZZLE == GLM_SWIZZLE_OPERATOR
246 
247 		// -- Unary arithmetic operators --
248 
249 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator=(vec<4, T, Q> const& v) GLM_DEFAULT;
250 
251 		template<typename U>
252 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator=(vec<4, U, Q> const& v);
253 		template<typename U>
254 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator+=(U scalar);
255 		template<typename U>
256 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator+=(vec<1, U, Q> const& v);
257 		template<typename U>
258 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator+=(vec<4, U, Q> const& v);
259 		template<typename U>
260 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator-=(U scalar);
261 		template<typename U>
262 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator-=(vec<1, U, Q> const& v);
263 		template<typename U>
264 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator-=(vec<4, U, Q> const& v);
265 		template<typename U>
266 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator*=(U scalar);
267 		template<typename U>
268 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator*=(vec<1, U, Q> const& v);
269 		template<typename U>
270 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator*=(vec<4, U, Q> const& v);
271 		template<typename U>
272 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator/=(U scalar);
273 		template<typename U>
274 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator/=(vec<1, U, Q> const& v);
275 		template<typename U>
276 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q>& operator/=(vec<4, U, Q> const& v);
277 
278 		// -- Increment and decrement operators --
279 
280 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator++();
281 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator--();
282 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator++(int);
283 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator--(int);
284 
285 		// -- Unary bit operators --
286 
287 		template<typename U>
288 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator%=(U scalar);
289 		template<typename U>
290 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator%=(vec<1, U, Q> const& v);
291 		template<typename U>
292 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator%=(vec<4, U, Q> const& v);
293 		template<typename U>
294 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator&=(U scalar);
295 		template<typename U>
296 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator&=(vec<1, U, Q> const& v);
297 		template<typename U>
298 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator&=(vec<4, U, Q> const& v);
299 		template<typename U>
300 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator|=(U scalar);
301 		template<typename U>
302 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator|=(vec<1, U, Q> const& v);
303 		template<typename U>
304 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator|=(vec<4, U, Q> const& v);
305 		template<typename U>
306 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator^=(U scalar);
307 		template<typename U>
308 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator^=(vec<1, U, Q> const& v);
309 		template<typename U>
310 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator^=(vec<4, U, Q> const& v);
311 		template<typename U>
312 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator<<=(U scalar);
313 		template<typename U>
314 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator<<=(vec<1, U, Q> const& v);
315 		template<typename U>
316 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator<<=(vec<4, U, Q> const& v);
317 		template<typename U>
318 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator>>=(U scalar);
319 		template<typename U>
320 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator>>=(vec<1, U, Q> const& v);
321 		template<typename U>
322 		GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> & operator>>=(vec<4, U, Q> const& v);
323 	};
324 
325 	// -- Unary operators --
326 
327 	template<typename T, qualifier Q>
328 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v);
329 
330 	template<typename T, qualifier Q>
331 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v);
332 
333 	// -- Binary operators --
334 
335 	template<typename T, qualifier Q>
336 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v, T const & scalar);
337 
338 	template<typename T, qualifier Q>
339 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2);
340 
341 	template<typename T, qualifier Q>
342 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(T scalar, vec<4, T, Q> const& v);
343 
344 	template<typename T, qualifier Q>
345 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2);
346 
347 	template<typename T, qualifier Q>
348 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator+(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);
349 
350 	template<typename T, qualifier Q>
351 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v, T const & scalar);
352 
353 	template<typename T, qualifier Q>
354 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2);
355 
356 	template<typename T, qualifier Q>
357 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(T scalar, vec<4, T, Q> const& v);
358 
359 	template<typename T, qualifier Q>
360 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2);
361 
362 	template<typename T, qualifier Q>
363 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator-(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);
364 
365 	template<typename T, qualifier Q>
366 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v, T const & scalar);
367 
368 	template<typename T, qualifier Q>
369 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2);
370 
371 	template<typename T, qualifier Q>
372 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(T scalar, vec<4, T, Q> const& v);
373 
374 	template<typename T, qualifier Q>
375 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2);
376 
377 	template<typename T, qualifier Q>
378 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator*(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);
379 
380 	template<typename T, qualifier Q>
381 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator/(vec<4, T, Q> const& v, T const & scalar);
382 
383 	template<typename T, qualifier Q>
384 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<1, T, Q> const& v2);
385 
386 	template<typename T, qualifier Q>
387 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator/(T scalar, vec<4, T, Q> const& v);
388 
389 	template<typename T, qualifier Q>
390 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator/(vec<1, T, Q> const& v1, vec<4, T, Q> const& v2);
391 
392 	template<typename T, qualifier Q>
393 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator/(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);
394 
395 	template<typename T, qualifier Q>
396 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator%(vec<4, T, Q> const& v, T scalar);
397 
398 	template<typename T, qualifier Q>
399 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator%(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar);
400 
401 	template<typename T, qualifier Q>
402 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator%(T scalar, vec<4, T, Q> const& v);
403 
404 	template<typename T, qualifier Q>
405 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator%(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v);
406 
407 	template<typename T, qualifier Q>
408 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator%(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);
409 
410 	template<typename T, qualifier Q>
411 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator&(vec<4, T, Q> const& v, T scalar);
412 
413 	template<typename T, qualifier Q>
414 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator&(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar);
415 
416 	template<typename T, qualifier Q>
417 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator&(T scalar, vec<4, T, Q> const& v);
418 
419 	template<typename T, qualifier Q>
420 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator&(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v);
421 
422 	template<typename T, qualifier Q>
423 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator&(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);
424 
425 	template<typename T, qualifier Q>
426 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator|(vec<4, T, Q> const& v, T scalar);
427 
428 	template<typename T, qualifier Q>
429 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator|(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar);
430 
431 	template<typename T, qualifier Q>
432 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator|(T scalar, vec<4, T, Q> const& v);
433 
434 	template<typename T, qualifier Q>
435 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator|(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v);
436 
437 	template<typename T, qualifier Q>
438 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator|(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);
439 
440 	template<typename T, qualifier Q>
441 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator^(vec<4, T, Q> const& v, T scalar);
442 
443 	template<typename T, qualifier Q>
444 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator^(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar);
445 
446 	template<typename T, qualifier Q>
447 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator^(T scalar, vec<4, T, Q> const& v);
448 
449 	template<typename T, qualifier Q>
450 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator^(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v);
451 
452 	template<typename T, qualifier Q>
453 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator^(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);
454 
455 	template<typename T, qualifier Q>
456 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<4, T, Q> const& v, T scalar);
457 
458 	template<typename T, qualifier Q>
459 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar);
460 
461 	template<typename T, qualifier Q>
462 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator<<(T scalar, vec<4, T, Q> const& v);
463 
464 	template<typename T, qualifier Q>
465 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v);
466 
467 	template<typename T, qualifier Q>
468 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator<<(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);
469 
470 	template<typename T, qualifier Q>
471 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<4, T, Q> const& v, T scalar);
472 
473 	template<typename T, qualifier Q>
474 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<4, T, Q> const& v, vec<1, T, Q> const& scalar);
475 
476 	template<typename T, qualifier Q>
477 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator>>(T scalar, vec<4, T, Q> const& v);
478 
479 	template<typename T, qualifier Q>
480 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<1, T, Q> const& scalar, vec<4, T, Q> const& v);
481 
482 	template<typename T, qualifier Q>
483 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator>>(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);
484 
485 	template<typename T, qualifier Q>
486 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, T, Q> operator~(vec<4, T, Q> const& v);
487 
488 	// -- Boolean operators --
489 
490 	template<typename T, qualifier Q>
491 	GLM_FUNC_DECL GLM_CONSTEXPR bool operator==(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);
492 
493 	template<typename T, qualifier Q>
494 	GLM_FUNC_DECL GLM_CONSTEXPR bool operator!=(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2);
495 
496 	template<qualifier Q>
497 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, bool, Q> operator&&(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2);
498 
499 	template<qualifier Q>
500 	GLM_FUNC_DECL GLM_CONSTEXPR vec<4, bool, Q> operator||(vec<4, bool, Q> const& v1, vec<4, bool, Q> const& v2);
501 }//namespace glm
502 
503 #ifndef GLM_EXTERNAL_TEMPLATE
504 #include "type_vec4.inl"
505 #endif//GLM_EXTERNAL_TEMPLATE
506