1 //Copyright (c) 2008-2017 Emil Dotchevski and Reverge Studios, Inc.
3 //Distributed under the Boost Software License, Version 1.0. (See accompanying
4 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 #ifndef BOOST_QVM_BF14D67E2DDC8E6683EF574961FF698F
7 #define BOOST_QVM_BF14D67E2DDC8E6683EF574961FF698F
9 //This file was generated by a program. Do not edit manually.
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>
25 template <class A,class B>
26 BOOST_QVM_INLINE_OPERATIONS
27 typename lazy_enable_if_c<
28 vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
29 deduce_vec2<A,B,4> >::type
30 operator+( A const & a, B const & b )
32 typedef typename deduce_vec2<A,B,4>::type R;
33 BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==4);
35 vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)+vec_traits<B>::template read_element<0>(b);
36 vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)+vec_traits<B>::template read_element<1>(b);
37 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)+vec_traits<B>::template read_element<2>(b);
38 vec_traits<R>::template write_element<3>(r)=vec_traits<A>::template read_element<3>(a)+vec_traits<B>::template read_element<3>(b);
45 using ::boost::qvm::operator+;
52 struct plus_vv_defined;
58 static bool const value=true;
62 template <class A,class B>
63 BOOST_QVM_INLINE_OPERATIONS
64 typename lazy_enable_if_c<
65 vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
66 deduce_vec2<A,B,4> >::type
67 operator-( A const & a, B const & b )
69 typedef typename deduce_vec2<A,B,4>::type R;
70 BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==4);
72 vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)-vec_traits<B>::template read_element<0>(b);
73 vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)-vec_traits<B>::template read_element<1>(b);
74 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)-vec_traits<B>::template read_element<2>(b);
75 vec_traits<R>::template write_element<3>(r)=vec_traits<A>::template read_element<3>(a)-vec_traits<B>::template read_element<3>(b);
82 using ::boost::qvm::operator-;
89 struct minus_vv_defined;
95 static bool const value=true;
99 template <class A,class B>
100 BOOST_QVM_INLINE_OPERATIONS
101 typename enable_if_c<
102 vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
104 operator+=( A & a, B const & b )
106 vec_traits<A>::template write_element<0>(a)+=vec_traits<B>::template read_element<0>(b);
107 vec_traits<A>::template write_element<1>(a)+=vec_traits<B>::template read_element<1>(b);
108 vec_traits<A>::template write_element<2>(a)+=vec_traits<B>::template read_element<2>(b);
109 vec_traits<A>::template write_element<3>(a)+=vec_traits<B>::template read_element<3>(b);
116 using ::boost::qvm::operator+=;
123 struct plus_eq_vv_defined;
127 plus_eq_vv_defined<4>
129 static bool const value=true;
133 template <class A,class B>
134 BOOST_QVM_INLINE_OPERATIONS
135 typename enable_if_c<
136 vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
138 operator-=( A & a, B const & b )
140 vec_traits<A>::template write_element<0>(a)-=vec_traits<B>::template read_element<0>(b);
141 vec_traits<A>::template write_element<1>(a)-=vec_traits<B>::template read_element<1>(b);
142 vec_traits<A>::template write_element<2>(a)-=vec_traits<B>::template read_element<2>(b);
143 vec_traits<A>::template write_element<3>(a)-=vec_traits<B>::template read_element<3>(b);
150 using ::boost::qvm::operator-=;
157 struct minus_eq_vv_defined;
161 minus_eq_vv_defined<4>
163 static bool const value=true;
167 template <class A,class B>
168 BOOST_QVM_INLINE_OPERATIONS
169 typename lazy_enable_if_c<
170 vec_traits<A>::dim==4 && is_scalar<B>::value,
171 deduce_vec<A> >::type
172 operator*( A const & a, B b )
174 typedef typename deduce_vec<A>::type R;
176 vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)*b;
177 vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)*b;
178 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)*b;
179 vec_traits<R>::template write_element<3>(r)=vec_traits<A>::template read_element<3>(a)*b;
186 using ::boost::qvm::operator*;
193 struct mul_vs_defined;
199 static bool const value=true;
203 template <class A,class B>
204 BOOST_QVM_INLINE_OPERATIONS
205 typename lazy_enable_if_c<
206 is_scalar<A>::value && vec_traits<B>::dim==4,
207 deduce_vec<B> >::type
208 operator*( A a, B const & b )
210 typedef typename deduce_vec<B>::type R;
212 vec_traits<R>::template write_element<0>(r)=a*vec_traits<B>::template read_element<0>(b);
213 vec_traits<R>::template write_element<1>(r)=a*vec_traits<B>::template read_element<1>(b);
214 vec_traits<R>::template write_element<2>(r)=a*vec_traits<B>::template read_element<2>(b);
215 vec_traits<R>::template write_element<3>(r)=a*vec_traits<B>::template read_element<3>(b);
222 using ::boost::qvm::operator*;
229 struct mul_sv_defined;
235 static bool const value=true;
239 template <class A,class B>
240 BOOST_QVM_INLINE_OPERATIONS
241 typename enable_if_c<
242 vec_traits<A>::dim==4 && is_scalar<B>::value,
244 operator*=( A & a, B b )
246 vec_traits<A>::template write_element<0>(a)*=b;
247 vec_traits<A>::template write_element<1>(a)*=b;
248 vec_traits<A>::template write_element<2>(a)*=b;
249 vec_traits<A>::template write_element<3>(a)*=b;
256 using ::boost::qvm::operator*=;
263 struct mul_eq_vs_defined;
269 static bool const value=true;
273 template <class A,class B>
274 BOOST_QVM_INLINE_OPERATIONS
275 typename lazy_enable_if_c<
276 vec_traits<A>::dim==4 && is_scalar<B>::value,
277 deduce_vec<A> >::type
278 operator/( A const & a, B b )
280 typedef typename deduce_vec<A>::type R;
282 vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)/b;
283 vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)/b;
284 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)/b;
285 vec_traits<R>::template write_element<3>(r)=vec_traits<A>::template read_element<3>(a)/b;
292 using ::boost::qvm::operator/;
299 struct div_vs_defined;
305 static bool const value=true;
309 template <class A,class B>
310 BOOST_QVM_INLINE_OPERATIONS
311 typename enable_if_c<
312 vec_traits<A>::dim==4 && is_scalar<B>::value,
314 operator/=( A & a, B b )
316 vec_traits<A>::template write_element<0>(a)/=b;
317 vec_traits<A>::template write_element<1>(a)/=b;
318 vec_traits<A>::template write_element<2>(a)/=b;
319 vec_traits<A>::template write_element<3>(a)/=b;
326 using ::boost::qvm::operator/=;
333 struct div_eq_vs_defined;
339 static bool const value=true;
343 template <class R,class A>
344 BOOST_QVM_INLINE_OPERATIONS
345 typename enable_if_c<
347 vec_traits<R>::dim==4 && vec_traits<A>::dim==4,
349 convert_to( A const & a )
352 vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a);
353 vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a);
354 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a);
355 vec_traits<R>::template write_element<3>(r)=vec_traits<A>::template read_element<3>(a);
362 using ::boost::qvm::convert_to;
369 struct convert_to_v_defined;
373 convert_to_v_defined<4>
375 static bool const value=true;
379 template <class A,class B>
380 BOOST_QVM_INLINE_OPERATIONS
381 typename enable_if_c<
382 vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
384 operator==( A const & a, B const & b )
387 vec_traits<A>::template read_element<0>(a)==vec_traits<B>::template read_element<0>(b) &&
388 vec_traits<A>::template read_element<1>(a)==vec_traits<B>::template read_element<1>(b) &&
389 vec_traits<A>::template read_element<2>(a)==vec_traits<B>::template read_element<2>(b) &&
390 vec_traits<A>::template read_element<3>(a)==vec_traits<B>::template read_element<3>(b);
396 using ::boost::qvm::operator==;
403 struct eq_vv_defined;
409 static bool const value=true;
413 template <class A,class B>
414 BOOST_QVM_INLINE_OPERATIONS
415 typename enable_if_c<
416 vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
418 operator!=( A const & a, B const & b )
421 !(vec_traits<A>::template read_element<0>(a)==vec_traits<B>::template read_element<0>(b)) ||
422 !(vec_traits<A>::template read_element<1>(a)==vec_traits<B>::template read_element<1>(b)) ||
423 !(vec_traits<A>::template read_element<2>(a)==vec_traits<B>::template read_element<2>(b)) ||
424 !(vec_traits<A>::template read_element<3>(a)==vec_traits<B>::template read_element<3>(b));
430 using ::boost::qvm::operator!=;
437 struct neq_vv_defined;
443 static bool const value=true;
448 BOOST_QVM_INLINE_OPERATIONS
449 typename lazy_enable_if_c<
450 vec_traits<A>::dim==4,
451 deduce_vec<A> >::type
452 operator-( A const & a )
454 typedef typename deduce_vec<A>::type R;
456 vec_traits<R>::template write_element<0>(r)=-vec_traits<A>::template read_element<0>(a);
457 vec_traits<R>::template write_element<1>(r)=-vec_traits<A>::template read_element<1>(a);
458 vec_traits<R>::template write_element<2>(r)=-vec_traits<A>::template read_element<2>(a);
459 vec_traits<R>::template write_element<3>(r)=-vec_traits<A>::template read_element<3>(a);
466 using ::boost::qvm::operator-;
473 struct minus_v_defined;
479 static bool const value=true;
484 BOOST_QVM_INLINE_OPERATIONS
485 typename enable_if_c<
486 is_vec<A>::value && vec_traits<A>::dim==4,
487 typename vec_traits<A>::scalar_type>::type
490 typedef typename vec_traits<A>::scalar_type T;
491 T const a0=vec_traits<A>::template read_element<0>(a);
492 T const a1=vec_traits<A>::template read_element<1>(a);
493 T const a2=vec_traits<A>::template read_element<2>(a);
494 T const a3=vec_traits<A>::template read_element<3>(a);
495 T const m2=a0*a0+a1*a1+a2*a2+a3*a3;
496 T const mag=sqrt<T>(m2);
503 using ::boost::qvm::mag;
510 struct mag_v_defined;
516 static bool const value=true;
521 BOOST_QVM_INLINE_OPERATIONS
522 typename enable_if_c<
523 is_vec<A>::value && vec_traits<A>::dim==4,
524 typename vec_traits<A>::scalar_type>::type
525 mag_sqr( A const & a )
527 typedef typename vec_traits<A>::scalar_type T;
528 T const a0=vec_traits<A>::template read_element<0>(a);
529 T const a1=vec_traits<A>::template read_element<1>(a);
530 T const a2=vec_traits<A>::template read_element<2>(a);
531 T const a3=vec_traits<A>::template read_element<3>(a);
532 T const m2=a0*a0+a1*a1+a2*a2+a3*a3;
539 using ::boost::qvm::mag_sqr;
546 struct mag_sqr_v_defined;
552 static bool const value=true;
557 BOOST_QVM_INLINE_OPERATIONS
558 typename lazy_enable_if_c<
559 vec_traits<A>::dim==4,
560 deduce_vec<A> >::type
561 normalized( A const & a )
563 typedef typename vec_traits<A>::scalar_type T;
564 T const a0=vec_traits<A>::template read_element<0>(a);
565 T const a1=vec_traits<A>::template read_element<1>(a);
566 T const a2=vec_traits<A>::template read_element<2>(a);
567 T const a3=vec_traits<A>::template read_element<3>(a);
568 T const m2=a0*a0+a1*a1+a2*a2+a3*a3;
569 if( m2==scalar_traits<typename vec_traits<A>::scalar_type>::value(0) )
570 BOOST_QVM_THROW_EXCEPTION(zero_magnitude_error());
571 T const rm=scalar_traits<T>::value(1)/sqrt<T>(m2);
572 typedef typename deduce_vec<A>::type R;
574 vec_traits<R>::template write_element<0>(r)=a0*rm;
575 vec_traits<R>::template write_element<1>(r)=a1*rm;
576 vec_traits<R>::template write_element<2>(r)=a2*rm;
577 vec_traits<R>::template write_element<3>(r)=a3*rm;
584 using ::boost::qvm::normalized;
588 BOOST_QVM_INLINE_OPERATIONS
589 typename enable_if_c<
590 vec_traits<A>::dim==4,
594 typedef typename vec_traits<A>::scalar_type T;
595 T const a0=vec_traits<A>::template read_element<0>(a);
596 T const a1=vec_traits<A>::template read_element<1>(a);
597 T const a2=vec_traits<A>::template read_element<2>(a);
598 T const a3=vec_traits<A>::template read_element<3>(a);
599 T const m2=a0*a0+a1*a1+a2*a2+a3*a3;
600 if( m2==scalar_traits<typename vec_traits<A>::scalar_type>::value(0) )
601 BOOST_QVM_THROW_EXCEPTION(zero_magnitude_error());
602 T const rm=scalar_traits<T>::value(1)/sqrt<T>(m2);
603 vec_traits<A>::template write_element<0>(a)*=rm;
604 vec_traits<A>::template write_element<1>(a)*=rm;
605 vec_traits<A>::template write_element<2>(a)*=rm;
606 vec_traits<A>::template write_element<3>(a)*=rm;
612 using ::boost::qvm::normalize;
619 struct normalize_v_defined;
623 normalize_v_defined<4>
625 static bool const value=true;
629 template <class A,class B>
630 BOOST_QVM_INLINE_OPERATIONS
631 typename lazy_enable_if_c<
632 vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
633 deduce_scalar<typename vec_traits<A>::scalar_type,typename vec_traits<B>::scalar_type> >::type
634 dot( A const & a, B const & b )
636 typedef typename vec_traits<A>::scalar_type Ta;
637 typedef typename vec_traits<B>::scalar_type Tb;
638 typedef typename deduce_scalar<Ta,Tb>::type Tr;
639 Ta const a0=vec_traits<A>::template read_element<0>(a);
640 Ta const a1=vec_traits<A>::template read_element<1>(a);
641 Ta const a2=vec_traits<A>::template read_element<2>(a);
642 Ta const a3=vec_traits<A>::template read_element<3>(a);
643 Tb const b0=vec_traits<B>::template read_element<0>(b);
644 Tb const b1=vec_traits<B>::template read_element<1>(b);
645 Tb const b2=vec_traits<B>::template read_element<2>(b);
646 Tb const b3=vec_traits<B>::template read_element<3>(b);
647 Tr const dot=a0*b0+a1*b1+a2*b2+a3*b3;
654 using ::boost::qvm::dot;
661 struct dot_vv_defined;
667 static bool const value=true;