master
ブランチ master
VulkanExample / dep / include / glm / detail / type_vec2.inl
23.1 KB、896行 生 Blame 履歴
1/// @ref core
2
3#include "./compute_vector_relational.hpp"
4
5namespace glm
6{
7 // -- Implicit basic constructors --
8
9# if GLM_CONFIG_CTOR_INIT == GLM_ENABLE
10 template<typename T, qualifier Q>
11 GLM_DEFAULTED_DEFAULT_CTOR_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec()
12 : x(0), y(0)
13 {}
14# endif
15
16 template<typename T, qualifier Q>
17 template<qualifier P>
18 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<2, T, P> const& v)
19 : x(v.x), y(v.y)
20 {}
21
22 // -- Explicit basic constructors --
23
24 template<typename T, qualifier Q>
25 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(T scalar)
26 : x(scalar), y(scalar)
27 {}
28
29 template<typename T, qualifier Q>
30 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(T _x, T _y)
31 : x(_x), y(_y)
32 {}
33
34 // -- Conversion scalar constructors --
35
36 template<typename T, qualifier Q>
37 template<typename U, qualifier P>
38 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<1, U, P> const& v)
39 : x(static_cast<T>(v.x))
40 , y(static_cast<T>(v.x))
41 {}
42
43 template<typename T, qualifier Q>
44 template<typename A, typename B>
45 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(A _x, B _y)
46 : x(static_cast<T>(_x))
47 , y(static_cast<T>(_y))
48 {}
49
50 template<typename T, qualifier Q>
51 template<typename A, typename B>
52 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<1, A, Q> const& _x, B _y)
53 : x(static_cast<T>(_x.x))
54 , y(static_cast<T>(_y))
55 {}
56
57 template<typename T, qualifier Q>
58 template<typename A, typename B>
59 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(A _x, vec<1, B, Q> const& _y)
60 : x(static_cast<T>(_x))
61 , y(static_cast<T>(_y.x))
62 {}
63
64 template<typename T, qualifier Q>
65 template<typename A, typename B>
66 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<1, A, Q> const& _x, vec<1, B, Q> const& _y)
67 : x(static_cast<T>(_x.x))
68 , y(static_cast<T>(_y.x))
69 {}
70
71 // -- Conversion vector constructors --
72
73 template<typename T, qualifier Q>
74 template<typename U, qualifier P>
75 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<2, U, P> const& v)
76 : x(static_cast<T>(v.x))
77 , y(static_cast<T>(v.y))
78 {}
79
80 template<typename T, qualifier Q>
81 template<typename U, qualifier P>
82 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<3, U, P> const& v)
83 : x(static_cast<T>(v.x))
84 , y(static_cast<T>(v.y))
85 {}
86
87 template<typename T, qualifier Q>
88 template<typename U, qualifier P>
89 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q>::vec(vec<4, U, P> const& v)
90 : x(static_cast<T>(v.x))
91 , y(static_cast<T>(v.y))
92 {}
93
94 // -- Component accesses --
95
96 template<typename T, qualifier Q>
97 GLM_FUNC_QUALIFIER GLM_CONSTEXPR T & vec<2, T, Q>::operator[](typename vec<2, T, Q>::length_type i)
98 {
99 GLM_ASSERT_LENGTH(i, this->length());
100 switch(i)
101 {
102 default:
103 case 0:
104 return x;
105 case 1:
106 return y;
107 }
108 }
109
110 template<typename T, qualifier Q>
111 GLM_FUNC_QUALIFIER GLM_CONSTEXPR T const& vec<2, T, Q>::operator[](typename vec<2, T, Q>::length_type i) const
112 {
113 GLM_ASSERT_LENGTH(i, this->length());
114 switch(i)
115 {
116 default:
117 case 0:
118 return x;
119 case 1:
120 return y;
121 }
122 }
123
124 // -- Unary arithmetic operators --
125
126 template<typename T, qualifier Q>
127 template<typename U>
128 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator=(vec<2, U, Q> const& v)
129 {
130 this->x = static_cast<T>(v.x);
131 this->y = static_cast<T>(v.y);
132 return *this;
133 }
134
135 template<typename T, qualifier Q>
136 template<typename U>
137 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator+=(U scalar)
138 {
139 this->x += static_cast<T>(scalar);
140 this->y += static_cast<T>(scalar);
141 return *this;
142 }
143
144 template<typename T, qualifier Q>
145 template<typename U>
146 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator+=(vec<1, U, Q> const& v)
147 {
148 this->x += static_cast<T>(v.x);
149 this->y += static_cast<T>(v.x);
150 return *this;
151 }
152
153 template<typename T, qualifier Q>
154 template<typename U>
155 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator+=(vec<2, U, Q> const& v)
156 {
157 this->x += static_cast<T>(v.x);
158 this->y += static_cast<T>(v.y);
159 return *this;
160 }
161
162 template<typename T, qualifier Q>
163 template<typename U>
164 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator-=(U scalar)
165 {
166 this->x -= static_cast<T>(scalar);
167 this->y -= static_cast<T>(scalar);
168 return *this;
169 }
170
171 template<typename T, qualifier Q>
172 template<typename U>
173 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator-=(vec<1, U, Q> const& v)
174 {
175 this->x -= static_cast<T>(v.x);
176 this->y -= static_cast<T>(v.x);
177 return *this;
178 }
179
180 template<typename T, qualifier Q>
181 template<typename U>
182 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator-=(vec<2, U, Q> const& v)
183 {
184 this->x -= static_cast<T>(v.x);
185 this->y -= static_cast<T>(v.y);
186 return *this;
187 }
188
189 template<typename T, qualifier Q>
190 template<typename U>
191 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator*=(U scalar)
192 {
193 this->x *= static_cast<T>(scalar);
194 this->y *= static_cast<T>(scalar);
195 return *this;
196 }
197
198 template<typename T, qualifier Q>
199 template<typename U>
200 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator*=(vec<1, U, Q> const& v)
201 {
202 this->x *= static_cast<T>(v.x);
203 this->y *= static_cast<T>(v.x);
204 return *this;
205 }
206
207 template<typename T, qualifier Q>
208 template<typename U>
209 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator*=(vec<2, U, Q> const& v)
210 {
211 this->x *= static_cast<T>(v.x);
212 this->y *= static_cast<T>(v.y);
213 return *this;
214 }
215
216 template<typename T, qualifier Q>
217 template<typename U>
218 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator/=(U scalar)
219 {
220 this->x /= static_cast<T>(scalar);
221 this->y /= static_cast<T>(scalar);
222 return *this;
223 }
224
225 template<typename T, qualifier Q>
226 template<typename U>
227 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator/=(vec<1, U, Q> const& v)
228 {
229 this->x /= static_cast<T>(v.x);
230 this->y /= static_cast<T>(v.x);
231 return *this;
232 }
233
234 template<typename T, qualifier Q>
235 template<typename U>
236 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator/=(vec<2, U, Q> const& v)
237 {
238 this->x /= static_cast<T>(v.x);
239 this->y /= static_cast<T>(v.y);
240 return *this;
241 }
242
243 // -- Increment and decrement operators --
244
245 template<typename T, qualifier Q>
246 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator++()
247 {
248 ++this->x;
249 ++this->y;
250 return *this;
251 }
252
253 template<typename T, qualifier Q>
254 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator--()
255 {
256 --this->x;
257 --this->y;
258 return *this;
259 }
260
261 template<typename T, qualifier Q>
262 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> vec<2, T, Q>::operator++(int)
263 {
264 vec<2, T, Q> Result(*this);
265 ++*this;
266 return Result;
267 }
268
269 template<typename T, qualifier Q>
270 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> vec<2, T, Q>::operator--(int)
271 {
272 vec<2, T, Q> Result(*this);
273 --*this;
274 return Result;
275 }
276
277 // -- Unary bit operators --
278
279 template<typename T, qualifier Q>
280 template<typename U>
281 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator%=(U scalar)
282 {
283 this->x %= static_cast<T>(scalar);
284 this->y %= static_cast<T>(scalar);
285 return *this;
286 }
287
288 template<typename T, qualifier Q>
289 template<typename U>
290 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator%=(vec<1, U, Q> const& v)
291 {
292 this->x %= static_cast<T>(v.x);
293 this->y %= static_cast<T>(v.x);
294 return *this;
295 }
296
297 template<typename T, qualifier Q>
298 template<typename U>
299 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator%=(vec<2, U, Q> const& v)
300 {
301 this->x %= static_cast<T>(v.x);
302 this->y %= static_cast<T>(v.y);
303 return *this;
304 }
305
306 template<typename T, qualifier Q>
307 template<typename U>
308 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator&=(U scalar)
309 {
310 this->x &= static_cast<T>(scalar);
311 this->y &= static_cast<T>(scalar);
312 return *this;
313 }
314
315 template<typename T, qualifier Q>
316 template<typename U>
317 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator&=(vec<1, U, Q> const& v)
318 {
319 this->x &= static_cast<T>(v.x);
320 this->y &= static_cast<T>(v.x);
321 return *this;
322 }
323
324 template<typename T, qualifier Q>
325 template<typename U>
326 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator&=(vec<2, U, Q> const& v)
327 {
328 this->x &= static_cast<T>(v.x);
329 this->y &= static_cast<T>(v.y);
330 return *this;
331 }
332
333 template<typename T, qualifier Q>
334 template<typename U>
335 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator|=(U scalar)
336 {
337 this->x |= static_cast<T>(scalar);
338 this->y |= static_cast<T>(scalar);
339 return *this;
340 }
341
342 template<typename T, qualifier Q>
343 template<typename U>
344 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator|=(vec<1, U, Q> const& v)
345 {
346 this->x |= static_cast<T>(v.x);
347 this->y |= static_cast<T>(v.x);
348 return *this;
349 }
350
351 template<typename T, qualifier Q>
352 template<typename U>
353 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator|=(vec<2, U, Q> const& v)
354 {
355 this->x |= static_cast<T>(v.x);
356 this->y |= static_cast<T>(v.y);
357 return *this;
358 }
359
360 template<typename T, qualifier Q>
361 template<typename U>
362 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator^=(U scalar)
363 {
364 this->x ^= static_cast<T>(scalar);
365 this->y ^= static_cast<T>(scalar);
366 return *this;
367 }
368
369 template<typename T, qualifier Q>
370 template<typename U>
371 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator^=(vec<1, U, Q> const& v)
372 {
373 this->x ^= static_cast<T>(v.x);
374 this->y ^= static_cast<T>(v.x);
375 return *this;
376 }
377
378 template<typename T, qualifier Q>
379 template<typename U>
380 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator^=(vec<2, U, Q> const& v)
381 {
382 this->x ^= static_cast<T>(v.x);
383 this->y ^= static_cast<T>(v.y);
384 return *this;
385 }
386
387 template<typename T, qualifier Q>
388 template<typename U>
389 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator<<=(U scalar)
390 {
391 this->x <<= static_cast<T>(scalar);
392 this->y <<= static_cast<T>(scalar);
393 return *this;
394 }
395
396 template<typename T, qualifier Q>
397 template<typename U>
398 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator<<=(vec<1, U, Q> const& v)
399 {
400 this->x <<= static_cast<T>(v.x);
401 this->y <<= static_cast<T>(v.x);
402 return *this;
403 }
404
405 template<typename T, qualifier Q>
406 template<typename U>
407 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator<<=(vec<2, U, Q> const& v)
408 {
409 this->x <<= static_cast<T>(v.x);
410 this->y <<= static_cast<T>(v.y);
411 return *this;
412 }
413
414 template<typename T, qualifier Q>
415 template<typename U>
416 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator>>=(U scalar)
417 {
418 this->x >>= static_cast<T>(scalar);
419 this->y >>= static_cast<T>(scalar);
420 return *this;
421 }
422
423 template<typename T, qualifier Q>
424 template<typename U>
425 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator>>=(vec<1, U, Q> const& v)
426 {
427 this->x >>= static_cast<T>(v.x);
428 this->y >>= static_cast<T>(v.x);
429 return *this;
430 }
431
432 template<typename T, qualifier Q>
433 template<typename U>
434 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> & vec<2, T, Q>::operator>>=(vec<2, U, Q> const& v)
435 {
436 this->x >>= static_cast<T>(v.x);
437 this->y >>= static_cast<T>(v.y);
438 return *this;
439 }
440
441 // -- Unary arithmetic operators --
442
443 template<typename T, qualifier Q>
444 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator+(vec<2, T, Q> const& v)
445 {
446 return v;
447 }
448
449 template<typename T, qualifier Q>
450 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator-(vec<2, T, Q> const& v)
451 {
452 return vec<2, T, Q>(
453 -v.x,
454 -v.y);
455 }
456
457 // -- Binary arithmetic operators --
458
459 template<typename T, qualifier Q>
460 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator+(vec<2, T, Q> const& v, T scalar)
461 {
462 return vec<2, T, Q>(
463 v.x + scalar,
464 v.y + scalar);
465 }
466
467 template<typename T, qualifier Q>
468 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator+(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2)
469 {
470 return vec<2, T, Q>(
471 v1.x + v2.x,
472 v1.y + v2.x);
473 }
474
475 template<typename T, qualifier Q>
476 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator+(T scalar, vec<2, T, Q> const& v)
477 {
478 return vec<2, T, Q>(
479 scalar + v.x,
480 scalar + v.y);
481 }
482
483 template<typename T, qualifier Q>
484 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator+(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2)
485 {
486 return vec<2, T, Q>(
487 v1.x + v2.x,
488 v1.x + v2.y);
489 }
490
491 template<typename T, qualifier Q>
492 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator+(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)
493 {
494 return vec<2, T, Q>(
495 v1.x + v2.x,
496 v1.y + v2.y);
497 }
498
499 template<typename T, qualifier Q>
500 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator-(vec<2, T, Q> const& v, T scalar)
501 {
502 return vec<2, T, Q>(
503 v.x - scalar,
504 v.y - scalar);
505 }
506
507 template<typename T, qualifier Q>
508 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator-(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2)
509 {
510 return vec<2, T, Q>(
511 v1.x - v2.x,
512 v1.y - v2.x);
513 }
514
515 template<typename T, qualifier Q>
516 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator-(T scalar, vec<2, T, Q> const& v)
517 {
518 return vec<2, T, Q>(
519 scalar - v.x,
520 scalar - v.y);
521 }
522
523 template<typename T, qualifier Q>
524 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator-(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2)
525 {
526 return vec<2, T, Q>(
527 v1.x - v2.x,
528 v1.x - v2.y);
529 }
530
531 template<typename T, qualifier Q>
532 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator-(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)
533 {
534 return vec<2, T, Q>(
535 v1.x - v2.x,
536 v1.y - v2.y);
537 }
538
539 template<typename T, qualifier Q>
540 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator*(vec<2, T, Q> const& v, T scalar)
541 {
542 return vec<2, T, Q>(
543 v.x * scalar,
544 v.y * scalar);
545 }
546
547 template<typename T, qualifier Q>
548 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator*(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2)
549 {
550 return vec<2, T, Q>(
551 v1.x * v2.x,
552 v1.y * v2.x);
553 }
554
555 template<typename T, qualifier Q>
556 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator*(T scalar, vec<2, T, Q> const& v)
557 {
558 return vec<2, T, Q>(
559 scalar * v.x,
560 scalar * v.y);
561 }
562
563 template<typename T, qualifier Q>
564 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator*(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2)
565 {
566 return vec<2, T, Q>(
567 v1.x * v2.x,
568 v1.x * v2.y);
569 }
570
571 template<typename T, qualifier Q>
572 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator*(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)
573 {
574 return vec<2, T, Q>(
575 v1.x * v2.x,
576 v1.y * v2.y);
577 }
578
579 template<typename T, qualifier Q>
580 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator/(vec<2, T, Q> const& v, T scalar)
581 {
582 return vec<2, T, Q>(
583 v.x / scalar,
584 v.y / scalar);
585 }
586
587 template<typename T, qualifier Q>
588 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator/(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2)
589 {
590 return vec<2, T, Q>(
591 v1.x / v2.x,
592 v1.y / v2.x);
593 }
594
595 template<typename T, qualifier Q>
596 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator/(T scalar, vec<2, T, Q> const& v)
597 {
598 return vec<2, T, Q>(
599 scalar / v.x,
600 scalar / v.y);
601 }
602
603 template<typename T, qualifier Q>
604 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator/(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2)
605 {
606 return vec<2, T, Q>(
607 v1.x / v2.x,
608 v1.x / v2.y);
609 }
610
611 template<typename T, qualifier Q>
612 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator/(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)
613 {
614 return vec<2, T, Q>(
615 v1.x / v2.x,
616 v1.y / v2.y);
617 }
618
619 // -- Binary bit operators --
620
621 template<typename T, qualifier Q>
622 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator%(vec<2, T, Q> const& v, T scalar)
623 {
624 return vec<2, T, Q>(
625 v.x % scalar,
626 v.y % scalar);
627 }
628
629 template<typename T, qualifier Q>
630 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator%(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2)
631 {
632 return vec<2, T, Q>(
633 v1.x % v2.x,
634 v1.y % v2.x);
635 }
636
637 template<typename T, qualifier Q>
638 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator%(T scalar, vec<2, T, Q> const& v)
639 {
640 return vec<2, T, Q>(
641 scalar % v.x,
642 scalar % v.y);
643 }
644
645 template<typename T, qualifier Q>
646 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator%(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2)
647 {
648 return vec<2, T, Q>(
649 v1.x % v2.x,
650 v1.x % v2.y);
651 }
652
653 template<typename T, qualifier Q>
654 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator%(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)
655 {
656 return vec<2, T, Q>(
657 v1.x % v2.x,
658 v1.y % v2.y);
659 }
660
661 template<typename T, qualifier Q>
662 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator&(vec<2, T, Q> const& v, T scalar)
663 {
664 return vec<2, T, Q>(
665 v.x & scalar,
666 v.y & scalar);
667 }
668
669 template<typename T, qualifier Q>
670 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator&(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2)
671 {
672 return vec<2, T, Q>(
673 v1.x & v2.x,
674 v1.y & v2.x);
675 }
676
677 template<typename T, qualifier Q>
678 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator&(T scalar, vec<2, T, Q> const& v)
679 {
680 return vec<2, T, Q>(
681 scalar & v.x,
682 scalar & v.y);
683 }
684
685 template<typename T, qualifier Q>
686 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator&(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2)
687 {
688 return vec<2, T, Q>(
689 v1.x & v2.x,
690 v1.x & v2.y);
691 }
692
693 template<typename T, qualifier Q>
694 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator&(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)
695 {
696 return vec<2, T, Q>(
697 v1.x & v2.x,
698 v1.y & v2.y);
699 }
700
701 template<typename T, qualifier Q>
702 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator|(vec<2, T, Q> const& v, T scalar)
703 {
704 return vec<2, T, Q>(
705 v.x | scalar,
706 v.y | scalar);
707 }
708
709 template<typename T, qualifier Q>
710 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator|(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2)
711 {
712 return vec<2, T, Q>(
713 v1.x | v2.x,
714 v1.y | v2.x);
715 }
716
717 template<typename T, qualifier Q>
718 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator|(T scalar, vec<2, T, Q> const& v)
719 {
720 return vec<2, T, Q>(
721 scalar | v.x,
722 scalar | v.y);
723 }
724
725 template<typename T, qualifier Q>
726 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator|(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2)
727 {
728 return vec<2, T, Q>(
729 v1.x | v2.x,
730 v1.x | v2.y);
731 }
732
733 template<typename T, qualifier Q>
734 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator|(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)
735 {
736 return vec<2, T, Q>(
737 v1.x | v2.x,
738 v1.y | v2.y);
739 }
740
741 template<typename T, qualifier Q>
742 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator^(vec<2, T, Q> const& v, T scalar)
743 {
744 return vec<2, T, Q>(
745 v.x ^ scalar,
746 v.y ^ scalar);
747 }
748
749 template<typename T, qualifier Q>
750 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator^(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2)
751 {
752 return vec<2, T, Q>(
753 v1.x ^ v2.x,
754 v1.y ^ v2.x);
755 }
756
757 template<typename T, qualifier Q>
758 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator^(T scalar, vec<2, T, Q> const& v)
759 {
760 return vec<2, T, Q>(
761 scalar ^ v.x,
762 scalar ^ v.y);
763 }
764
765 template<typename T, qualifier Q>
766 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator^(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2)
767 {
768 return vec<2, T, Q>(
769 v1.x ^ v2.x,
770 v1.x ^ v2.y);
771 }
772
773 template<typename T, qualifier Q>
774 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator^(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)
775 {
776 return vec<2, T, Q>(
777 v1.x ^ v2.x,
778 v1.y ^ v2.y);
779 }
780
781 template<typename T, qualifier Q>
782 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator<<(vec<2, T, Q> const& v, T scalar)
783 {
784 return vec<2, T, Q>(
785 v.x << scalar,
786 v.y << scalar);
787 }
788
789 template<typename T, qualifier Q>
790 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator<<(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2)
791 {
792 return vec<2, T, Q>(
793 v1.x << v2.x,
794 v1.y << v2.x);
795 }
796
797 template<typename T, qualifier Q>
798 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator<<(T scalar, vec<2, T, Q> const& v)
799 {
800 return vec<2, T, Q>(
801 scalar << v.x,
802 scalar << v.y);
803 }
804
805 template<typename T, qualifier Q>
806 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator<<(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2)
807 {
808 return vec<2, T, Q>(
809 v1.x << v2.x,
810 v1.x << v2.y);
811 }
812
813 template<typename T, qualifier Q>
814 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator<<(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)
815 {
816 return vec<2, T, Q>(
817 v1.x << v2.x,
818 v1.y << v2.y);
819 }
820
821 template<typename T, qualifier Q>
822 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator>>(vec<2, T, Q> const& v, T scalar)
823 {
824 return vec<2, T, Q>(
825 v.x >> scalar,
826 v.y >> scalar);
827 }
828
829 template<typename T, qualifier Q>
830 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator>>(vec<2, T, Q> const& v1, vec<1, T, Q> const& v2)
831 {
832 return vec<2, T, Q>(
833 v1.x >> v2.x,
834 v1.y >> v2.x);
835 }
836
837 template<typename T, qualifier Q>
838 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator>>(T scalar, vec<2, T, Q> const& v)
839 {
840 return vec<2, T, Q>(
841 scalar >> v.x,
842 scalar >> v.y);
843 }
844
845 template<typename T, qualifier Q>
846 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator>>(vec<1, T, Q> const& v1, vec<2, T, Q> const& v2)
847 {
848 return vec<2, T, Q>(
849 v1.x >> v2.x,
850 v1.x >> v2.y);
851 }
852
853 template<typename T, qualifier Q>
854 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator>>(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)
855 {
856 return vec<2, T, Q>(
857 v1.x >> v2.x,
858 v1.y >> v2.y);
859 }
860
861 template<typename T, qualifier Q>
862 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, T, Q> operator~(vec<2, T, Q> const& v)
863 {
864 return vec<2, T, Q>(
865 ~v.x,
866 ~v.y);
867 }
868
869 // -- Boolean operators --
870
871 template<typename T, qualifier Q>
872 GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator==(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)
873 {
874 return
875 detail::compute_equal<T, std::numeric_limits<T>::is_iec559>::call(v1.x, v2.x) &&
876 detail::compute_equal<T, std::numeric_limits<T>::is_iec559>::call(v1.y, v2.y);
877 }
878
879 template<typename T, qualifier Q>
880 GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator!=(vec<2, T, Q> const& v1, vec<2, T, Q> const& v2)
881 {
882 return !(v1 == v2);
883 }
884
885 template<qualifier Q>
886 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, bool, Q> operator&&(vec<2, bool, Q> const& v1, vec<2, bool, Q> const& v2)
887 {
888 return vec<2, bool, Q>(v1.x && v2.x, v1.y && v2.y);
889 }
890
891 template<qualifier Q>
892 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<2, bool, Q> operator||(vec<2, bool, Q> const& v1, vec<2, bool, Q> const& v2)
893 {
894 return vec<2, bool, Q>(v1.x || v2.x, v1.y || v2.y);
895 }
896}//namespace glm