1 //Copyright (c) 2008-2016 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_209A50EE407836FD124932F69E7D49DC
7 #define BOOST_QVM_209A50EE407836FD124932F69E7D49DC
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/enable_if.hpp>
14 #include <boost/qvm/error.hpp>
15 #include <boost/qvm/inline.hpp>
16 #include <boost/qvm/math.hpp>
17 #include <boost/qvm/static_assert.hpp>
18 #include <boost/qvm/throw_exception.hpp>
19 #include <boost/qvm/vec_traits.hpp>
27 template <class A,class B>
28 BOOST_QVM_INLINE_OPERATIONS
29 typename lazy_enable_if_c<
30 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
31 deduce_vec2<A,B,3> >::type
32 operator+( A const & a, B const & b )
34 typedef typename deduce_vec2<A,B,3>::type R;
35 BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==3);
37 vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)+vec_traits<B>::template read_element<0>(b);
38 vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)+vec_traits<B>::template read_element<1>(b);
39 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)+vec_traits<B>::template read_element<2>(b);
46 using ::boost::qvm::operator+;
53 struct plus_vv_defined;
59 static bool const value=true;
63 template <class A,class B>
64 BOOST_QVM_INLINE_OPERATIONS
65 typename lazy_enable_if_c<
66 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
67 deduce_vec2<A,B,3> >::type
68 operator-( A const & a, B const & b )
70 typedef typename deduce_vec2<A,B,3>::type R;
71 BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==3);
73 vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)-vec_traits<B>::template read_element<0>(b);
74 vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)-vec_traits<B>::template read_element<1>(b);
75 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)-vec_traits<B>::template read_element<2>(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==3 && vec_traits<B>::dim==3,
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);
115 using ::boost::qvm::operator+=;
122 struct plus_eq_vv_defined;
126 plus_eq_vv_defined<3>
128 static bool const value=true;
132 template <class A,class B>
133 BOOST_QVM_INLINE_OPERATIONS
134 typename enable_if_c<
135 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
137 operator-=( A & a, B const & b )
139 vec_traits<A>::template write_element<0>(a)-=vec_traits<B>::template read_element<0>(b);
140 vec_traits<A>::template write_element<1>(a)-=vec_traits<B>::template read_element<1>(b);
141 vec_traits<A>::template write_element<2>(a)-=vec_traits<B>::template read_element<2>(b);
148 using ::boost::qvm::operator-=;
155 struct minus_eq_vv_defined;
159 minus_eq_vv_defined<3>
161 static bool const value=true;
165 template <class A,class B>
166 BOOST_QVM_INLINE_OPERATIONS
167 typename lazy_enable_if_c<
168 vec_traits<A>::dim==3 && is_scalar<B>::value,
169 deduce_vec<A> >::type
170 operator*( A const & a, B b )
172 typedef typename deduce_vec<A>::type R;
174 vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)*b;
175 vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)*b;
176 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)*b;
183 using ::boost::qvm::operator*;
190 struct mul_vs_defined;
196 static bool const value=true;
200 template <class A,class B>
201 BOOST_QVM_INLINE_OPERATIONS
202 typename enable_if_c<
203 vec_traits<A>::dim==3 && is_scalar<B>::value,
205 operator*=( A & a, B b )
207 vec_traits<A>::template write_element<0>(a)*=b;
208 vec_traits<A>::template write_element<1>(a)*=b;
209 vec_traits<A>::template write_element<2>(a)*=b;
216 using ::boost::qvm::operator*=;
223 struct mul_eq_vs_defined;
229 static bool const value=true;
233 template <class A,class B>
234 BOOST_QVM_INLINE_OPERATIONS
235 typename lazy_enable_if_c<
236 vec_traits<A>::dim==3 && is_scalar<B>::value,
237 deduce_vec<A> >::type
238 operator/( A const & a, B b )
240 typedef typename deduce_vec<A>::type R;
242 vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)/b;
243 vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)/b;
244 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)/b;
251 using ::boost::qvm::operator/;
258 struct div_vs_defined;
264 static bool const value=true;
268 template <class A,class B>
269 BOOST_QVM_INLINE_OPERATIONS
270 typename enable_if_c<
271 vec_traits<A>::dim==3 && is_scalar<B>::value,
273 operator/=( A & a, B b )
275 vec_traits<A>::template write_element<0>(a)/=b;
276 vec_traits<A>::template write_element<1>(a)/=b;
277 vec_traits<A>::template write_element<2>(a)/=b;
284 using ::boost::qvm::operator/=;
291 struct div_eq_vs_defined;
297 static bool const value=true;
301 template <class A,class B>
302 BOOST_QVM_INLINE_OPERATIONS
303 typename enable_if_c<
304 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
306 assign( A & a, B const & b )
308 vec_traits<A>::template write_element<0>(a)=vec_traits<B>::template read_element<0>(b);
309 vec_traits<A>::template write_element<1>(a)=vec_traits<B>::template read_element<1>(b);
310 vec_traits<A>::template write_element<2>(a)=vec_traits<B>::template read_element<2>(b);
317 using ::boost::qvm::assign;
324 struct assign_vv_defined;
330 static bool const value=true;
334 template <class R,class A>
335 BOOST_QVM_INLINE_OPERATIONS
336 typename enable_if_c<
338 vec_traits<R>::dim==3 && vec_traits<A>::dim==3,
340 convert_to( A const & a )
343 vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a);
344 vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a);
345 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a);
352 using ::boost::qvm::convert_to;
359 struct convert_to_v_defined;
363 convert_to_v_defined<3>
365 static bool const value=true;
369 template <class A,class B>
370 BOOST_QVM_INLINE_OPERATIONS
371 typename enable_if_c<
372 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
374 operator==( A const & a, B const & b )
377 vec_traits<A>::template read_element<0>(a)==vec_traits<B>::template read_element<0>(b) &&
378 vec_traits<A>::template read_element<1>(a)==vec_traits<B>::template read_element<1>(b) &&
379 vec_traits<A>::template read_element<2>(a)==vec_traits<B>::template read_element<2>(b);
385 using ::boost::qvm::operator==;
392 struct eq_vv_defined;
398 static bool const value=true;
402 template <class A,class B>
403 BOOST_QVM_INLINE_OPERATIONS
404 typename enable_if_c<
405 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
407 operator!=( A const & a, B const & b )
410 !(vec_traits<A>::template read_element<0>(a)==vec_traits<B>::template read_element<0>(b)) ||
411 !(vec_traits<A>::template read_element<1>(a)==vec_traits<B>::template read_element<1>(b)) ||
412 !(vec_traits<A>::template read_element<2>(a)==vec_traits<B>::template read_element<2>(b));
418 using ::boost::qvm::operator!=;
425 struct neq_vv_defined;
431 static bool const value=true;
436 BOOST_QVM_INLINE_OPERATIONS
437 typename lazy_enable_if_c<
438 vec_traits<A>::dim==3,
439 deduce_vec<A> >::type
440 operator-( A const & a )
442 typedef typename deduce_vec<A>::type R;
444 vec_traits<R>::template write_element<0>(r)=-vec_traits<A>::template read_element<0>(a);
445 vec_traits<R>::template write_element<1>(r)=-vec_traits<A>::template read_element<1>(a);
446 vec_traits<R>::template write_element<2>(r)=-vec_traits<A>::template read_element<2>(a);
453 using ::boost::qvm::operator-;
460 struct minus_v_defined;
466 static bool const value=true;
471 BOOST_QVM_INLINE_OPERATIONS
472 typename enable_if_c<
473 is_vec<A>::value && vec_traits<A>::dim==3,
474 typename vec_traits<A>::scalar_type>::type
477 typedef typename vec_traits<A>::scalar_type T;
478 T const a0=vec_traits<A>::template read_element<0>(a);
479 T const a1=vec_traits<A>::template read_element<1>(a);
480 T const a2=vec_traits<A>::template read_element<2>(a);
481 T const m2=a0*a0+a1*a1+a2*a2;
482 T const mag=sqrt<T>(m2);
489 using ::boost::qvm::mag;
496 struct mag_v_defined;
502 static bool const value=true;
507 BOOST_QVM_INLINE_OPERATIONS
508 typename enable_if_c<
509 is_vec<A>::value && vec_traits<A>::dim==3,
510 typename vec_traits<A>::scalar_type>::type
511 mag_sqr( A const & a )
513 typedef typename vec_traits<A>::scalar_type T;
514 T const a0=vec_traits<A>::template read_element<0>(a);
515 T const a1=vec_traits<A>::template read_element<1>(a);
516 T const a2=vec_traits<A>::template read_element<2>(a);
517 T const m2=a0*a0+a1*a1+a2*a2;
524 using ::boost::qvm::mag_sqr;
531 struct mag_sqr_v_defined;
537 static bool const value=true;
542 BOOST_QVM_INLINE_OPERATIONS
543 typename lazy_enable_if_c<
544 vec_traits<A>::dim==3,
545 deduce_vec<A> >::type
546 normalized( A const & a )
548 typedef typename vec_traits<A>::scalar_type T;
549 T const a0=vec_traits<A>::template read_element<0>(a);
550 T const a1=vec_traits<A>::template read_element<1>(a);
551 T const a2=vec_traits<A>::template read_element<2>(a);
552 T const m2=a0*a0+a1*a1+a2*a2;
553 if( m2==scalar_traits<typename vec_traits<A>::scalar_type>::value(0) )
554 BOOST_QVM_THROW_EXCEPTION(zero_magnitude_error());
555 T const rm=scalar_traits<T>::value(1)/sqrt<T>(m2);
556 typedef typename deduce_vec<A>::type R;
558 vec_traits<R>::template write_element<0>(r)=a0*rm;
559 vec_traits<R>::template write_element<1>(r)=a1*rm;
560 vec_traits<R>::template write_element<2>(r)=a2*rm;
567 using ::boost::qvm::normalized;
571 BOOST_QVM_INLINE_OPERATIONS
572 typename enable_if_c<
573 vec_traits<A>::dim==3,
577 typedef typename vec_traits<A>::scalar_type T;
578 T const a0=vec_traits<A>::template read_element<0>(a);
579 T const a1=vec_traits<A>::template read_element<1>(a);
580 T const a2=vec_traits<A>::template read_element<2>(a);
581 T const m2=a0*a0+a1*a1+a2*a2;
582 if( m2==scalar_traits<typename vec_traits<A>::scalar_type>::value(0) )
583 BOOST_QVM_THROW_EXCEPTION(zero_magnitude_error());
584 T const rm=scalar_traits<T>::value(1)/sqrt<T>(m2);
585 vec_traits<A>::template write_element<0>(a)*=rm;
586 vec_traits<A>::template write_element<1>(a)*=rm;
587 vec_traits<A>::template write_element<2>(a)*=rm;
593 using ::boost::qvm::normalize;
600 struct normalize_v_defined;
604 normalize_v_defined<3>
606 static bool const value=true;
610 template <class A,class B>
611 BOOST_QVM_INLINE_OPERATIONS
612 typename lazy_enable_if_c<
613 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
614 deduce_scalar<typename vec_traits<A>::scalar_type,typename vec_traits<B>::scalar_type> >::type
615 dot( A const & a, B const & b )
617 typedef typename vec_traits<A>::scalar_type Ta;
618 typedef typename vec_traits<B>::scalar_type Tb;
619 typedef typename deduce_scalar<Ta,Tb>::type Tr;
620 Ta const a0=vec_traits<A>::template read_element<0>(a);
621 Ta const a1=vec_traits<A>::template read_element<1>(a);
622 Ta const a2=vec_traits<A>::template read_element<2>(a);
623 Tb const b0=vec_traits<B>::template read_element<0>(b);
624 Tb const b1=vec_traits<B>::template read_element<1>(b);
625 Tb const b2=vec_traits<B>::template read_element<2>(b);
626 Tr const dot=a0*b0+a1*b1+a2*b2;
633 using ::boost::qvm::dot;
640 struct dot_vv_defined;
646 static bool const value=true;