1#ifndef BOOST_QVM_GEN_VEC_OPERATIONS4_HPP_INCLUDED
2#define BOOST_QVM_GEN_VEC_OPERATIONS4_HPP_INCLUDED
3
4// Copyright 2008-2022 Emil Dotchevski and Reverge Studios, Inc.
5
6// Distributed under the Boost Software License, Version 1.0. (See accompanying
7// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8
9// This file was generated by a program. Do not edit manually.
10
11#include <boost/qvm/deduce_scalar.hpp>
12#include <boost/qvm/deduce_vec.hpp>
13#include <boost/qvm/error.hpp>
14#include <boost/qvm/gen/vec_assign4.hpp>
15#include <boost/qvm/math.hpp>
16#include <boost/qvm/static_assert.hpp>
17#include <boost/qvm/throw_exception.hpp>
18
19namespace boost { namespace qvm {
20
21template <class A,class B>
22BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
23typename lazy_enable_if_c<
24 vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
25 deduce_vec2<A,B,4> >::type
26operator+( A const & a, B const & b )
27 {
28 typedef typename deduce_vec2<A,B,4>::type R;
29 BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==4);
30 R r;
31 write_vec_element<0>(r,vec_traits<A>::template read_element<0>(a)+vec_traits<B>::template read_element<0>(b));
32 write_vec_element<1>(r,vec_traits<A>::template read_element<1>(a)+vec_traits<B>::template read_element<1>(b));
33 write_vec_element<2>(r,vec_traits<A>::template read_element<2>(a)+vec_traits<B>::template read_element<2>(b));
34 write_vec_element<3>(r,vec_traits<A>::template read_element<3>(a)+vec_traits<B>::template read_element<3>(b));
35 return r;
36 }
37
38namespace
39sfinae
40 {
41 using ::boost::qvm::operator+;
42 }
43
44namespace
45qvm_detail
46 {
47 template <int D>
48 struct plus_vv_defined;
49
50 template <>
51 struct
52 plus_vv_defined<4>
53 {
54 static bool const value=true;
55 };
56 }
57
58template <class A,class B>
59BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
60typename lazy_enable_if_c<
61 vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
62 deduce_vec2<A,B,4> >::type
63operator-( A const & a, B const & b )
64 {
65 typedef typename deduce_vec2<A,B,4>::type R;
66 BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==4);
67 R r;
68 write_vec_element<0>(r,vec_traits<A>::template read_element<0>(a)-vec_traits<B>::template read_element<0>(b));
69 write_vec_element<1>(r,vec_traits<A>::template read_element<1>(a)-vec_traits<B>::template read_element<1>(b));
70 write_vec_element<2>(r,vec_traits<A>::template read_element<2>(a)-vec_traits<B>::template read_element<2>(b));
71 write_vec_element<3>(r,vec_traits<A>::template read_element<3>(a)-vec_traits<B>::template read_element<3>(b));
72 return r;
73 }
74
75namespace
76sfinae
77 {
78 using ::boost::qvm::operator-;
79 }
80
81namespace
82qvm_detail
83 {
84 template <int D>
85 struct minus_vv_defined;
86
87 template <>
88 struct
89 minus_vv_defined<4>
90 {
91 static bool const value=true;
92 };
93 }
94
95template <class A,class B>
96BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
97typename enable_if_c<
98 vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
99 A &>::type
100operator+=( A & a, B const & b )
101 {
102 write_vec_element<0>(a,vec_traits<A>::template read_element<0>(a)+vec_traits<B>::template read_element<0>(b));
103 write_vec_element<1>(a,vec_traits<A>::template read_element<1>(a)+vec_traits<B>::template read_element<1>(b));
104 write_vec_element<2>(a,vec_traits<A>::template read_element<2>(a)+vec_traits<B>::template read_element<2>(b));
105 write_vec_element<3>(a,vec_traits<A>::template read_element<3>(a)+vec_traits<B>::template read_element<3>(b));
106 return a;
107 }
108
109namespace
110sfinae
111 {
112 using ::boost::qvm::operator+=;
113 }
114
115namespace
116qvm_detail
117 {
118 template <int D>
119 struct plus_eq_vv_defined;
120
121 template <>
122 struct
123 plus_eq_vv_defined<4>
124 {
125 static bool const value=true;
126 };
127 }
128
129template <class A,class B>
130BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
131typename enable_if_c<
132 vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
133 A &>::type
134operator-=( A & a, B const & b )
135 {
136 write_vec_element<0>(a,vec_traits<A>::template read_element<0>(a)-vec_traits<B>::template read_element<0>(b));
137 write_vec_element<1>(a,vec_traits<A>::template read_element<1>(a)-vec_traits<B>::template read_element<1>(b));
138 write_vec_element<2>(a,vec_traits<A>::template read_element<2>(a)-vec_traits<B>::template read_element<2>(b));
139 write_vec_element<3>(a,vec_traits<A>::template read_element<3>(a)-vec_traits<B>::template read_element<3>(b));
140 return a;
141 }
142
143namespace
144sfinae
145 {
146 using ::boost::qvm::operator-=;
147 }
148
149namespace
150qvm_detail
151 {
152 template <int D>
153 struct minus_eq_vv_defined;
154
155 template <>
156 struct
157 minus_eq_vv_defined<4>
158 {
159 static bool const value=true;
160 };
161 }
162
163template <class A,class B>
164BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
165typename lazy_enable_if_c<
166 vec_traits<A>::dim==4 && is_scalar<B>::value,
167 deduce_vec2<A,B,vec_traits<A>::dim> >::type
168operator*( A const & a, B b )
169 {
170 typedef typename deduce_vec2<A,B,vec_traits<A>::dim>::type R;
171 R r;
172 write_vec_element<0>(r,vec_traits<A>::template read_element<0>(a)*b);
173 write_vec_element<1>(r,vec_traits<A>::template read_element<1>(a)*b);
174 write_vec_element<2>(r,vec_traits<A>::template read_element<2>(a)*b);
175 write_vec_element<3>(r,vec_traits<A>::template read_element<3>(a)*b);
176 return r;
177 }
178
179namespace
180sfinae
181 {
182 using ::boost::qvm::operator*;
183 }
184
185namespace
186qvm_detail
187 {
188 template <int D>
189 struct mul_vs_defined;
190
191 template <>
192 struct
193 mul_vs_defined<4>
194 {
195 static bool const value=true;
196 };
197 }
198
199template <class A,class B>
200BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
201typename lazy_enable_if_c<
202 is_scalar<A>::value && vec_traits<B>::dim==4,
203 deduce_vec2<A,B,vec_traits<B>::dim> >::type
204operator*( A a, B const & b )
205 {
206 typedef typename deduce_vec2<A,B,vec_traits<B>::dim>::type R;
207 R r;
208 write_vec_element<0>(r,a*vec_traits<B>::template read_element<0>(b));
209 write_vec_element<1>(r,a*vec_traits<B>::template read_element<1>(b));
210 write_vec_element<2>(r,a*vec_traits<B>::template read_element<2>(b));
211 write_vec_element<3>(r,a*vec_traits<B>::template read_element<3>(b));
212 return r;
213 }
214
215namespace
216sfinae
217 {
218 using ::boost::qvm::operator*;
219 }
220
221namespace
222qvm_detail
223 {
224 template <int D>
225 struct mul_sv_defined;
226
227 template <>
228 struct
229 mul_sv_defined<4>
230 {
231 static bool const value=true;
232 };
233 }
234
235template <class A,class B>
236BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
237typename enable_if_c<
238 vec_traits<A>::dim==4 && is_scalar<B>::value,
239 A &>::type
240operator*=( A & a, B b )
241 {
242 write_vec_element<0>(a, vec_traits<A>::template read_element<0>(a)*b);
243 write_vec_element<1>(a, vec_traits<A>::template read_element<1>(a)*b);
244 write_vec_element<2>(a, vec_traits<A>::template read_element<2>(a)*b);
245 write_vec_element<3>(a, vec_traits<A>::template read_element<3>(a)*b);
246 return a;
247 }
248
249namespace
250sfinae
251 {
252 using ::boost::qvm::operator*=;
253 }
254
255namespace
256qvm_detail
257 {
258 template <int D>
259 struct mul_eq_vs_defined;
260
261 template <>
262 struct
263 mul_eq_vs_defined<4>
264 {
265 static bool const value=true;
266 };
267 }
268
269template <class A,class B>
270BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
271typename lazy_enable_if_c<
272 vec_traits<A>::dim==4 && is_scalar<B>::value,
273 deduce_vec2<A,B,vec_traits<A>::dim> >::type
274operator/( A const & a, B b )
275 {
276 typedef typename deduce_vec2<A,B,vec_traits<A>::dim>::type R;
277 R r;
278 write_vec_element<0>(r,vec_traits<A>::template read_element<0>(a)/b);
279 write_vec_element<1>(r,vec_traits<A>::template read_element<1>(a)/b);
280 write_vec_element<2>(r,vec_traits<A>::template read_element<2>(a)/b);
281 write_vec_element<3>(r,vec_traits<A>::template read_element<3>(a)/b);
282 return r;
283 }
284
285namespace
286sfinae
287 {
288 using ::boost::qvm::operator/;
289 }
290
291namespace
292qvm_detail
293 {
294 template <int D>
295 struct div_vs_defined;
296
297 template <>
298 struct
299 div_vs_defined<4>
300 {
301 static bool const value=true;
302 };
303 }
304
305template <class A,class B>
306BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
307typename enable_if_c<
308 vec_traits<A>::dim==4 && is_scalar<B>::value,
309 A &>::type
310operator/=( A & a, B b )
311 {
312 write_vec_element<0>(a, vec_traits<A>::template read_element<0>(a)/b);
313 write_vec_element<1>(a, vec_traits<A>::template read_element<1>(a)/b);
314 write_vec_element<2>(a, vec_traits<A>::template read_element<2>(a)/b);
315 write_vec_element<3>(a, vec_traits<A>::template read_element<3>(a)/b);
316 return a;
317 }
318
319namespace
320sfinae
321 {
322 using ::boost::qvm::operator/=;
323 }
324
325namespace
326qvm_detail
327 {
328 template <int D>
329 struct div_eq_vs_defined;
330
331 template <>
332 struct
333 div_eq_vs_defined<4>
334 {
335 static bool const value=true;
336 };
337 }
338
339template <class R,class A>
340BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
341typename enable_if_c<
342 is_vec<A>::value &&
343 vec_traits<R>::dim==4 && vec_traits<A>::dim==4,
344 R>::type
345convert_to( A const & a )
346 {
347 R r;
348 write_vec_element<0>(r,vec_traits<A>::template read_element<0>(a));
349 write_vec_element<1>(r,vec_traits<A>::template read_element<1>(a));
350 write_vec_element<2>(r,vec_traits<A>::template read_element<2>(a));
351 write_vec_element<3>(r,vec_traits<A>::template read_element<3>(a));
352 return r;
353 }
354
355namespace
356sfinae
357 {
358 using ::boost::qvm::convert_to;
359 }
360
361namespace
362qvm_detail
363 {
364 template <int D>
365 struct convert_to_v_defined;
366
367 template <>
368 struct
369 convert_to_v_defined<4>
370 {
371 static bool const value=true;
372 };
373 }
374
375template <class A,class B>
376BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
377typename enable_if_c<
378 vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
379bool>::type
380operator==( A const & a, B const & b )
381 {
382 return
383 vec_traits<A>::template read_element<0>(a)==vec_traits<B>::template read_element<0>(b) &&
384 vec_traits<A>::template read_element<1>(a)==vec_traits<B>::template read_element<1>(b) &&
385 vec_traits<A>::template read_element<2>(a)==vec_traits<B>::template read_element<2>(b) &&
386 vec_traits<A>::template read_element<3>(a)==vec_traits<B>::template read_element<3>(b);
387 }
388
389namespace
390sfinae
391 {
392 using ::boost::qvm::operator==;
393 }
394
395namespace
396qvm_detail
397 {
398 template <int D>
399 struct eq_vv_defined;
400
401 template <>
402 struct
403 eq_vv_defined<4>
404 {
405 static bool const value=true;
406 };
407 }
408
409template <class A,class B>
410BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
411typename enable_if_c<
412 vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
413bool>::type
414operator!=( A const & a, B const & b )
415 {
416 return
417 !(vec_traits<A>::template read_element<0>(a)==vec_traits<B>::template read_element<0>(b)) ||
418 !(vec_traits<A>::template read_element<1>(a)==vec_traits<B>::template read_element<1>(b)) ||
419 !(vec_traits<A>::template read_element<2>(a)==vec_traits<B>::template read_element<2>(b)) ||
420 !(vec_traits<A>::template read_element<3>(a)==vec_traits<B>::template read_element<3>(b));
421 }
422
423namespace
424sfinae
425 {
426 using ::boost::qvm::operator!=;
427 }
428
429namespace
430qvm_detail
431 {
432 template <int D>
433 struct neq_vv_defined;
434
435 template <>
436 struct
437 neq_vv_defined<4>
438 {
439 static bool const value=true;
440 };
441 }
442
443template <class A>
444BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
445typename lazy_enable_if_c<
446 vec_traits<A>::dim==4,
447 deduce_vec<A> >::type
448operator-( A const & a )
449 {
450 typedef typename deduce_vec<A>::type R;
451 R r;
452 write_vec_element<0>(r,-vec_traits<A>::template read_element<0>(a));
453 write_vec_element<1>(r,-vec_traits<A>::template read_element<1>(a));
454 write_vec_element<2>(r,-vec_traits<A>::template read_element<2>(a));
455 write_vec_element<3>(r,-vec_traits<A>::template read_element<3>(a));
456 return r;
457 }
458
459namespace
460sfinae
461 {
462 using ::boost::qvm::operator-;
463 }
464
465namespace
466qvm_detail
467 {
468 template <int D>
469 struct minus_v_defined;
470
471 template <>
472 struct
473 minus_v_defined<4>
474 {
475 static bool const value=true;
476 };
477 }
478
479template <class A>
480BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
481typename enable_if_c<
482 is_vec<A>::value && vec_traits<A>::dim==4,
483 typename vec_traits<A>::scalar_type>::type
484mag( A const & a )
485 {
486 typedef typename vec_traits<A>::scalar_type T;
487 T const a0=vec_traits<A>::template read_element<0>(a);
488 T const a1=vec_traits<A>::template read_element<1>(a);
489 T const a2=vec_traits<A>::template read_element<2>(a);
490 T const a3=vec_traits<A>::template read_element<3>(a);
491 T const m2=a0*a0+a1*a1+a2*a2+a3*a3;
492 T const mag=sqrt(m2);
493 return mag;
494 }
495
496namespace
497sfinae
498 {
499 using ::boost::qvm::mag;
500 }
501
502namespace
503qvm_detail
504 {
505 template <int D>
506 struct mag_v_defined;
507
508 template <>
509 struct
510 mag_v_defined<4>
511 {
512 static bool const value=true;
513 };
514 }
515
516template <class A>
517BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
518typename enable_if_c<
519 is_vec<A>::value && vec_traits<A>::dim==4,
520 typename vec_traits<A>::scalar_type>::type
521mag_sqr( A const & a )
522 {
523 typedef typename vec_traits<A>::scalar_type T;
524 T const a0=vec_traits<A>::template read_element<0>(a);
525 T const a1=vec_traits<A>::template read_element<1>(a);
526 T const a2=vec_traits<A>::template read_element<2>(a);
527 T const a3=vec_traits<A>::template read_element<3>(a);
528 T const m2=a0*a0+a1*a1+a2*a2+a3*a3;
529 return m2;
530 }
531
532namespace
533sfinae
534 {
535 using ::boost::qvm::mag_sqr;
536 }
537
538namespace
539qvm_detail
540 {
541 template <int D>
542 struct mag_sqr_v_defined;
543
544 template <>
545 struct
546 mag_sqr_v_defined<4>
547 {
548 static bool const value=true;
549 };
550 }
551
552template <class A>
553BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
554typename lazy_enable_if_c<
555 vec_traits<A>::dim==4,
556 deduce_vec<A> >::type
557normalized( A const & a )
558 {
559 typedef typename vec_traits<A>::scalar_type T;
560 T const a0=vec_traits<A>::template read_element<0>(a);
561 T const a1=vec_traits<A>::template read_element<1>(a);
562 T const a2=vec_traits<A>::template read_element<2>(a);
563 T const a3=vec_traits<A>::template read_element<3>(a);
564 T const m2=a0*a0+a1*a1+a2*a2+a3*a3;
565 if( m2==scalar_traits<typename vec_traits<A>::scalar_type>::value(0) )
566 BOOST_QVM_THROW_EXCEPTION(e: zero_magnitude_error());
567 T const rm=scalar_traits<T>::value(1)/sqrt(m2);
568 typedef typename deduce_vec<A>::type R;
569 R r;
570 write_vec_element<0>(r,a0*rm);
571 write_vec_element<1>(r,a1*rm);
572 write_vec_element<2>(r,a2*rm);
573 write_vec_element<3>(r,a3*rm);
574 return r;
575 }
576
577namespace
578sfinae
579 {
580 using ::boost::qvm::normalized;
581 }
582
583template <class A>
584BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
585typename enable_if_c<
586 vec_traits<A>::dim==4,
587 void>::type
588normalize( A & a )
589 {
590 typedef typename vec_traits<A>::scalar_type T;
591 T const a0=vec_traits<A>::template read_element<0>(a);
592 T const a1=vec_traits<A>::template read_element<1>(a);
593 T const a2=vec_traits<A>::template read_element<2>(a);
594 T const a3=vec_traits<A>::template read_element<3>(a);
595 T const m2=a0*a0+a1*a1+a2*a2+a3*a3;
596 if( m2==scalar_traits<typename vec_traits<A>::scalar_type>::value(0) )
597 BOOST_QVM_THROW_EXCEPTION(e: zero_magnitude_error());
598 T const rm=scalar_traits<T>::value(1)/sqrt(m2);
599 write_vec_element<0>(a,vec_traits<A>::template read_element<0>(a)*rm);
600 write_vec_element<1>(a,vec_traits<A>::template read_element<1>(a)*rm);
601 write_vec_element<2>(a,vec_traits<A>::template read_element<2>(a)*rm);
602 write_vec_element<3>(a,vec_traits<A>::template read_element<3>(a)*rm);
603 }
604
605namespace
606sfinae
607 {
608 using ::boost::qvm::normalize;
609 }
610
611namespace
612qvm_detail
613 {
614 template <int D>
615 struct normalize_v_defined;
616
617 template <>
618 struct
619 normalize_v_defined<4>
620 {
621 static bool const value=true;
622 };
623 }
624
625template <class A,class B>
626BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
627typename lazy_enable_if_c<
628 vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
629 deduce_scalar<typename vec_traits<A>::scalar_type,typename vec_traits<B>::scalar_type> >::type
630dot( A const & a, B const & b )
631 {
632 typedef typename vec_traits<A>::scalar_type Ta;
633 typedef typename vec_traits<B>::scalar_type Tb;
634 typedef typename deduce_scalar<Ta,Tb>::type Tr;
635 Ta const a0=vec_traits<A>::template read_element<0>(a);
636 Ta const a1=vec_traits<A>::template read_element<1>(a);
637 Ta const a2=vec_traits<A>::template read_element<2>(a);
638 Ta const a3=vec_traits<A>::template read_element<3>(a);
639 Tb const b0=vec_traits<B>::template read_element<0>(b);
640 Tb const b1=vec_traits<B>::template read_element<1>(b);
641 Tb const b2=vec_traits<B>::template read_element<2>(b);
642 Tb const b3=vec_traits<B>::template read_element<3>(b);
643 Tr const dot=a0*b0+a1*b1+a2*b2+a3*b3;
644 return dot;
645 }
646
647namespace
648sfinae
649 {
650 using ::boost::qvm::dot;
651 }
652
653namespace
654qvm_detail
655 {
656 template <int D>
657 struct dot_vv_defined;
658
659 template <>
660 struct
661 dot_vv_defined<4>
662 {
663 static bool const value=true;
664 };
665 }
666
667} }
668
669#endif
670

source code of boost/libs/qvm/include/boost/qvm/gen/vec_operations4.hpp