1/// @ref core
2
3#include "./compute_vector_relational.hpp"
4
5namespace glm
6{
7	// -- Implicit basic constructors --
8
9#	if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE
10		template<typename T, qualifier Q>
11		GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec()
12#			if GLM_CONFIG_CTOR_INIT != GLM_CTOR_INIT_DISABLE
13				: x(0)
14#			endif
15		{}
16
17		template<typename T, qualifier Q>
18		GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<1, T, Q> const& v)
19			: x(v.x)
20		{}
21#	endif
22
23	template<typename T, qualifier Q>
24	template<qualifier P>
25	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<1, T, P> const& v)
26		: x(v.x)
27	{}
28
29	// -- Explicit basic constructors --
30
31	template<typename T, qualifier Q>
32	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(T scalar)
33		: x(scalar)
34	{}
35
36	// -- Conversion vector constructors --
37
38	template<typename T, qualifier Q>
39	template<typename U, qualifier P>
40	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<1, U, P> const& v)
41		: x(static_cast<T>(v.x))
42	{}
43
44	template<typename T, qualifier Q>
45	template<typename U, qualifier P>
46	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<2, U, P> const& v)
47		: x(static_cast<T>(v.x))
48	{}
49
50	template<typename T, qualifier Q>
51	template<typename U, qualifier P>
52	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<3, U, P> const& v)
53		: x(static_cast<T>(v.x))
54	{}
55
56	template<typename T, qualifier Q>
57	template<typename U, qualifier P>
58	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<4, U, P> const& v)
59		: x(static_cast<T>(v.x))
60	{}
61
62	// -- Component accesses --
63
64	template<typename T, qualifier Q>
65	GLM_FUNC_QUALIFIER GLM_CONSTEXPR T & vec<1, T, Q>::operator[](typename vec<1, T, Q>::length_type)
66	{
67		return x;
68	}
69
70	template<typename T, qualifier Q>
71	GLM_FUNC_QUALIFIER GLM_CONSTEXPR T const& vec<1, T, Q>::operator[](typename vec<1, T, Q>::length_type) const
72	{
73		return x;
74	}
75
76	// -- Unary arithmetic operators --
77
78#	if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE
79		template<typename T, qualifier Q>
80		GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator=(vec<1, T, Q> const& v)
81		{
82			this->x = v.x;
83			return *this;
84		}
85#	endif
86
87	template<typename T, qualifier Q>
88	template<typename U>
89	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator=(vec<1, U, Q> const& v)
90	{
91		this->x = static_cast<T>(v.x);
92		return *this;
93	}
94
95	template<typename T, qualifier Q>
96	template<typename U>
97	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator+=(U scalar)
98	{
99		this->x += static_cast<T>(scalar);
100		return *this;
101	}
102
103	template<typename T, qualifier Q>
104	template<typename U>
105	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator+=(vec<1, U, Q> const& v)
106	{
107		this->x += static_cast<T>(v.x);
108		return *this;
109	}
110
111	template<typename T, qualifier Q>
112	template<typename U>
113	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator-=(U scalar)
114	{
115		this->x -= static_cast<T>(scalar);
116		return *this;
117	}
118
119	template<typename T, qualifier Q>
120	template<typename U>
121	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator-=(vec<1, U, Q> const& v)
122	{
123		this->x -= static_cast<T>(v.x);
124		return *this;
125	}
126
127	template<typename T, qualifier Q>
128	template<typename U>
129	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator*=(U scalar)
130	{
131		this->x *= static_cast<T>(scalar);
132		return *this;
133	}
134
135	template<typename T, qualifier Q>
136	template<typename U>
137	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator*=(vec<1, U, Q> const& v)
138	{
139		this->x *= static_cast<T>(v.x);
140		return *this;
141	}
142
143	template<typename T, qualifier Q>
144	template<typename U>
145	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator/=(U scalar)
146	{
147		this->x /= static_cast<T>(scalar);
148		return *this;
149	}
150
151	template<typename T, qualifier Q>
152	template<typename U>
153	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator/=(vec<1, U, Q> const& v)
154	{
155		this->x /= static_cast<T>(v.x);
156		return *this;
157	}
158
159	// -- Increment and decrement operators --
160
161	template<typename T, qualifier Q>
162	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator++()
163	{
164		++this->x;
165		return *this;
166	}
167
168	template<typename T, qualifier Q>
169	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator--()
170	{
171		--this->x;
172		return *this;
173	}
174
175	template<typename T, qualifier Q>
176	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> vec<1, T, Q>::operator++(int)
177	{
178		vec<1, T, Q> Result(*this);
179		++*this;
180		return Result;
181	}
182
183	template<typename T, qualifier Q>
184	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> vec<1, T, Q>::operator--(int)
185	{
186		vec<1, T, Q> Result(*this);
187		--*this;
188		return Result;
189	}
190
191	// -- Unary bit operators --
192
193	template<typename T, qualifier Q>
194	template<typename U>
195	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator%=(U scalar)
196	{
197		this->x %= static_cast<T>(scalar);
198		return *this;
199	}
200
201	template<typename T, qualifier Q>
202	template<typename U>
203	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator%=(vec<1, U, Q> const& v)
204	{
205		this->x %= static_cast<T>(v.x);
206		return *this;
207	}
208
209	template<typename T, qualifier Q>
210	template<typename U>
211	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator&=(U scalar)
212	{
213		this->x &= static_cast<T>(scalar);
214		return *this;
215	}
216
217	template<typename T, qualifier Q>
218	template<typename U>
219	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator&=(vec<1, U, Q> const& v)
220	{
221		this->x &= static_cast<T>(v.x);
222		return *this;
223	}
224
225	template<typename T, qualifier Q>
226	template<typename U>
227	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator|=(U scalar)
228	{
229		this->x |= static_cast<T>(scalar);
230		return *this;
231	}
232
233	template<typename T, qualifier Q>
234	template<typename U>
235	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator|=(vec<1, U, Q> const& v)
236	{
237		this->x |= U(v.x);
238		return *this;
239	}
240
241	template<typename T, qualifier Q>
242	template<typename U>
243	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator^=(U scalar)
244	{
245		this->x ^= static_cast<T>(scalar);
246		return *this;
247	}
248
249	template<typename T, qualifier Q>
250	template<typename U>
251	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator^=(vec<1, U, Q> const& v)
252	{
253		this->x ^= static_cast<T>(v.x);
254		return *this;
255	}
256
257	template<typename T, qualifier Q>
258	template<typename U>
259	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator<<=(U scalar)
260	{
261		this->x <<= static_cast<T>(scalar);
262		return *this;
263	}
264
265	template<typename T, qualifier Q>
266	template<typename U>
267	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator<<=(vec<1, U, Q> const& v)
268	{
269		this->x <<= static_cast<T>(v.x);
270		return *this;
271	}
272
273	template<typename T, qualifier Q>
274	template<typename U>
275	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator>>=(U scalar)
276	{
277		this->x >>= static_cast<T>(scalar);
278		return *this;
279	}
280
281	template<typename T, qualifier Q>
282	template<typename U>
283	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator>>=(vec<1, U, Q> const& v)
284	{
285		this->x >>= static_cast<T>(v.x);
286		return *this;
287	}
288
289	// -- Unary constant operators --
290
291	template<typename T, qualifier Q>
292	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator+(vec<1, T, Q> const& v)
293	{
294		return v;
295	}
296
297	template<typename T, qualifier Q>
298	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator-(vec<1, T, Q> const& v)
299	{
300		return vec<1, T, Q>(
301			-v.x);
302	}
303
304	// -- Binary arithmetic operators --
305
306	template<typename T, qualifier Q>
307	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator+(vec<1, T, Q> const& v, T scalar)
308	{
309		return vec<1, T, Q>(
310			v.x + scalar);
311	}
312
313	template<typename T, qualifier Q>
314	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator+(T scalar, vec<1, T, Q> const& v)
315	{
316		return vec<1, T, Q>(
317			scalar + v.x);
318	}
319
320	template<typename T, qualifier Q>
321	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator+(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
322	{
323		return vec<1, T, Q>(
324			v1.x + v2.x);
325	}
326
327	//operator-
328	template<typename T, qualifier Q>
329	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator-(vec<1, T, Q> const& v, T scalar)
330	{
331		return vec<1, T, Q>(
332			v.x - scalar);
333	}
334
335	template<typename T, qualifier Q>
336	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator-(T scalar, vec<1, T, Q> const& v)
337	{
338		return vec<1, T, Q>(
339			scalar - v.x);
340	}
341
342	template<typename T, qualifier Q>
343	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator-(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
344	{
345		return vec<1, T, Q>(
346			v1.x - v2.x);
347	}
348
349	template<typename T, qualifier Q>
350	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator*(vec<1, T, Q> const& v, T scalar)
351	{
352		return vec<1, T, Q>(
353			v.x * scalar);
354	}
355
356	template<typename T, qualifier Q>
357	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator*(T scalar, vec<1, T, Q> const& v)
358	{
359		return vec<1, T, Q>(
360			scalar * v.x);
361	}
362
363	template<typename T, qualifier Q>
364	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator*(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
365	{
366		return vec<1, T, Q>(
367			v1.x * v2.x);
368	}
369
370	template<typename T, qualifier Q>
371	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator/(vec<1, T, Q> const& v, T scalar)
372	{
373		return vec<1, T, Q>(
374			v.x / scalar);
375	}
376
377	template<typename T, qualifier Q>
378	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator/(T scalar, vec<1, T, Q> const& v)
379	{
380		return vec<1, T, Q>(
381			scalar / v.x);
382	}
383
384	template<typename T, qualifier Q>
385	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator/(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
386	{
387		return vec<1, T, Q>(
388			v1.x / v2.x);
389	}
390
391	// -- Binary bit operators --
392
393	template<typename T, qualifier Q>
394	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator%(vec<1, T, Q> const& v, T scalar)
395	{
396		return vec<1, T, Q>(
397			v.x % scalar);
398	}
399
400	template<typename T, qualifier Q>
401	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator%(T scalar, vec<1, T, Q> const& v)
402	{
403		return vec<1, T, Q>(
404			scalar % v.x);
405	}
406
407	template<typename T, qualifier Q>
408	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator%(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
409	{
410		return vec<1, T, Q>(
411			v1.x % v2.x);
412	}
413
414	template<typename T, qualifier Q>
415	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator&(vec<1, T, Q> const& v, T scalar)
416	{
417		return vec<1, T, Q>(
418			v.x & scalar);
419	}
420
421	template<typename T, qualifier Q>
422	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator&(T scalar, vec<1, T, Q> const& v)
423	{
424		return vec<1, T, Q>(
425			scalar & v.x);
426	}
427
428	template<typename T, qualifier Q>
429	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator&(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
430	{
431		return vec<1, T, Q>(
432			v1.x & v2.x);
433	}
434
435	template<typename T, qualifier Q>
436	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator|(vec<1, T, Q> const& v, T scalar)
437	{
438		return vec<1, T, Q>(
439			v.x | scalar);
440	}
441
442	template<typename T, qualifier Q>
443	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator|(T scalar, vec<1, T, Q> const& v)
444	{
445		return vec<1, T, Q>(
446			scalar | v.x);
447	}
448
449	template<typename T, qualifier Q>
450	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator|(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
451	{
452		return vec<1, T, Q>(
453			v1.x | v2.x);
454	}
455
456	template<typename T, qualifier Q>
457	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator^(vec<1, T, Q> const& v, T scalar)
458	{
459		return vec<1, T, Q>(
460			v.x ^ scalar);
461	}
462
463	template<typename T, qualifier Q>
464	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator^(T scalar, vec<1, T, Q> const& v)
465	{
466		return vec<1, T, Q>(
467			scalar ^ v.x);
468	}
469
470	template<typename T, qualifier Q>
471	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator^(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
472	{
473		return vec<1, T, Q>(
474			v1.x ^ v2.x);
475	}
476
477	template<typename T, qualifier Q>
478	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator<<(vec<1, T, Q> const& v, T scalar)
479	{
480		return vec<1, T, Q>(
481			static_cast<T>(v.x << scalar));
482	}
483
484	template<typename T, qualifier Q>
485	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator<<(T scalar, vec<1, T, Q> const& v)
486	{
487		return vec<1, T, Q>(
488			static_cast<T>(scalar << v.x));
489	}
490
491	template<typename T, qualifier Q>
492	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator<<(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
493	{
494		return vec<1, T, Q>(
495			static_cast<T>(v1.x << v2.x));
496	}
497
498	template<typename T, qualifier Q>
499	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator>>(vec<1, T, Q> const& v, T scalar)
500	{
501		return vec<1, T, Q>(
502			static_cast<T>(v.x >> scalar));
503	}
504
505	template<typename T, qualifier Q>
506	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator>>(T scalar, vec<1, T, Q> const& v)
507	{
508		return vec<1, T, Q>(
509			static_cast<T>(scalar >> v.x));
510	}
511
512	template<typename T, qualifier Q>
513	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator>>(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
514	{
515		return vec<1, T, Q>(
516			static_cast<T>(v1.x >> v2.x));
517	}
518
519	template<typename T, qualifier Q>
520	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator~(vec<1, T, Q> const& v)
521	{
522		return vec<1, T, Q>(
523			~v.x);
524	}
525
526	// -- Boolean operators --
527
528	template<typename T, qualifier Q>
529	GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator==(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
530	{
531		return detail::compute_equal<T, std::numeric_limits<T>::is_iec559>::call(v1.x, v2.x);
532	}
533
534	template<typename T, qualifier Q>
535	GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator!=(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
536	{
537		return !(v1 == v2);
538	}
539
540	template<qualifier Q>
541	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, bool, Q> operator&&(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2)
542	{
543		return vec<1, bool, Q>(v1.x && v2.x);
544	}
545
546	template<qualifier Q>
547	GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, bool, Q> operator||(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2)
548	{
549		return vec<1, bool, Q>(v1.x || v2.x);
550	}
551}//namespace glm
552