1 //Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc.
\r
3 //Distributed under the Boost Software License, Version 1.0. (See accompanying
\r
4 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
\r
6 #ifndef BOOST_QVM_209A50EE407836FD124932F69E7D49DC
\r
7 #define BOOST_QVM_209A50EE407836FD124932F69E7D49DC
\r
9 //This file was generated by a program. Do not edit manually.
\r
11 #include <boost/qvm/deduce_scalar.hpp>
\r
12 #include <boost/qvm/deduce_vec.hpp>
\r
13 #include <boost/qvm/enable_if.hpp>
\r
14 #include <boost/qvm/error.hpp>
\r
15 #include <boost/qvm/inline.hpp>
\r
16 #include <boost/qvm/math.hpp>
\r
17 #include <boost/qvm/static_assert.hpp>
\r
18 #include <boost/qvm/throw_exception.hpp>
\r
19 #include <boost/qvm/vec_traits.hpp>
\r
27 template <class A,class B>
\r
28 BOOST_QVM_INLINE_OPERATIONS
\r
29 typename lazy_enable_if_c<
\r
30 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
\r
31 deduce_vec2<A,B,3> >::type
\r
32 operator+( A const & a, B const & b )
\r
34 typedef typename deduce_vec2<A,B,3>::type R;
\r
35 BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==3);
\r
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);
\r
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);
\r
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);
\r
46 using ::boost::qvm::operator+;
\r
53 struct plus_vv_defined;
\r
59 static bool const value=true;
\r
63 template <class A,class B>
\r
64 BOOST_QVM_INLINE_OPERATIONS
\r
65 typename lazy_enable_if_c<
\r
66 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
\r
67 deduce_vec2<A,B,3> >::type
\r
68 operator-( A const & a, B const & b )
\r
70 typedef typename deduce_vec2<A,B,3>::type R;
\r
71 BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==3);
\r
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);
\r
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);
\r
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);
\r
82 using ::boost::qvm::operator-;
\r
89 struct minus_vv_defined;
\r
95 static bool const value=true;
\r
99 template <class A,class B>
\r
100 BOOST_QVM_INLINE_OPERATIONS
\r
101 typename enable_if_c<
\r
102 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
\r
104 operator+=( A & a, B const & b )
\r
106 vec_traits<A>::template write_element<0>(a)+=vec_traits<B>::template read_element<0>(b);
\r
107 vec_traits<A>::template write_element<1>(a)+=vec_traits<B>::template read_element<1>(b);
\r
108 vec_traits<A>::template write_element<2>(a)+=vec_traits<B>::template read_element<2>(b);
\r
115 using ::boost::qvm::operator+=;
\r
122 struct plus_eq_vv_defined;
\r
126 plus_eq_vv_defined<3>
\r
128 static bool const value=true;
\r
132 template <class A,class B>
\r
133 BOOST_QVM_INLINE_OPERATIONS
\r
134 typename enable_if_c<
\r
135 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
\r
137 operator-=( A & a, B const & b )
\r
139 vec_traits<A>::template write_element<0>(a)-=vec_traits<B>::template read_element<0>(b);
\r
140 vec_traits<A>::template write_element<1>(a)-=vec_traits<B>::template read_element<1>(b);
\r
141 vec_traits<A>::template write_element<2>(a)-=vec_traits<B>::template read_element<2>(b);
\r
148 using ::boost::qvm::operator-=;
\r
155 struct minus_eq_vv_defined;
\r
159 minus_eq_vv_defined<3>
\r
161 static bool const value=true;
\r
165 template <class A,class B>
\r
166 BOOST_QVM_INLINE_OPERATIONS
\r
167 typename lazy_enable_if_c<
\r
168 vec_traits<A>::dim==3 && is_scalar<B>::value,
\r
169 deduce_vec<A> >::type
\r
170 operator*( A const & a, B b )
\r
172 typedef typename deduce_vec<A>::type R;
\r
174 vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)*b;
\r
175 vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)*b;
\r
176 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)*b;
\r
183 using ::boost::qvm::operator*;
\r
190 struct mul_vs_defined;
\r
196 static bool const value=true;
\r
200 template <class A,class B>
\r
201 BOOST_QVM_INLINE_OPERATIONS
\r
202 typename lazy_enable_if_c<
\r
203 is_scalar<A>::value && vec_traits<B>::dim==3,
\r
204 deduce_vec<B> >::type
\r
205 operator*( A a, B const & b )
\r
207 typedef typename deduce_vec<B>::type R;
\r
209 vec_traits<R>::template write_element<0>(r)=a*vec_traits<B>::template read_element<0>(b);
\r
210 vec_traits<R>::template write_element<1>(r)=a*vec_traits<B>::template read_element<1>(b);
\r
211 vec_traits<R>::template write_element<2>(r)=a*vec_traits<B>::template read_element<2>(b);
\r
218 using ::boost::qvm::operator*;
\r
225 struct mul_sv_defined;
\r
231 static bool const value=true;
\r
235 template <class A,class B>
\r
236 BOOST_QVM_INLINE_OPERATIONS
\r
237 typename enable_if_c<
\r
238 vec_traits<A>::dim==3 && is_scalar<B>::value,
\r
240 operator*=( A & a, B b )
\r
242 vec_traits<A>::template write_element<0>(a)*=b;
\r
243 vec_traits<A>::template write_element<1>(a)*=b;
\r
244 vec_traits<A>::template write_element<2>(a)*=b;
\r
251 using ::boost::qvm::operator*=;
\r
258 struct mul_eq_vs_defined;
\r
262 mul_eq_vs_defined<3>
\r
264 static bool const value=true;
\r
268 template <class A,class B>
\r
269 BOOST_QVM_INLINE_OPERATIONS
\r
270 typename lazy_enable_if_c<
\r
271 vec_traits<A>::dim==3 && is_scalar<B>::value,
\r
272 deduce_vec<A> >::type
\r
273 operator/( A const & a, B b )
\r
275 typedef typename deduce_vec<A>::type R;
\r
277 vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)/b;
\r
278 vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)/b;
\r
279 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)/b;
\r
286 using ::boost::qvm::operator/;
\r
293 struct div_vs_defined;
\r
299 static bool const value=true;
\r
303 template <class A,class B>
\r
304 BOOST_QVM_INLINE_OPERATIONS
\r
305 typename enable_if_c<
\r
306 vec_traits<A>::dim==3 && is_scalar<B>::value,
\r
308 operator/=( A & a, B b )
\r
310 vec_traits<A>::template write_element<0>(a)/=b;
\r
311 vec_traits<A>::template write_element<1>(a)/=b;
\r
312 vec_traits<A>::template write_element<2>(a)/=b;
\r
319 using ::boost::qvm::operator/=;
\r
326 struct div_eq_vs_defined;
\r
330 div_eq_vs_defined<3>
\r
332 static bool const value=true;
\r
336 template <class A,class B>
\r
337 BOOST_QVM_INLINE_OPERATIONS
\r
338 typename enable_if_c<
\r
339 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
\r
341 assign( A & a, B const & b )
\r
343 vec_traits<A>::template write_element<0>(a)=vec_traits<B>::template read_element<0>(b);
\r
344 vec_traits<A>::template write_element<1>(a)=vec_traits<B>::template read_element<1>(b);
\r
345 vec_traits<A>::template write_element<2>(a)=vec_traits<B>::template read_element<2>(b);
\r
352 using ::boost::qvm::assign;
\r
359 struct assign_vv_defined;
\r
363 assign_vv_defined<3>
\r
365 static bool const value=true;
\r
369 template <class R,class A>
\r
370 BOOST_QVM_INLINE_OPERATIONS
\r
371 typename enable_if_c<
\r
372 is_vec<A>::value &&
\r
373 vec_traits<R>::dim==3 && vec_traits<A>::dim==3,
\r
375 convert_to( A const & a )
\r
378 vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a);
\r
379 vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a);
\r
380 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a);
\r
387 using ::boost::qvm::convert_to;
\r
394 struct convert_to_v_defined;
\r
398 convert_to_v_defined<3>
\r
400 static bool const value=true;
\r
404 template <class A,class B>
\r
405 BOOST_QVM_INLINE_OPERATIONS
\r
406 typename enable_if_c<
\r
407 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
\r
409 operator==( A const & a, B const & b )
\r
412 vec_traits<A>::template read_element<0>(a)==vec_traits<B>::template read_element<0>(b) &&
\r
413 vec_traits<A>::template read_element<1>(a)==vec_traits<B>::template read_element<1>(b) &&
\r
414 vec_traits<A>::template read_element<2>(a)==vec_traits<B>::template read_element<2>(b);
\r
420 using ::boost::qvm::operator==;
\r
427 struct eq_vv_defined;
\r
433 static bool const value=true;
\r
437 template <class A,class B>
\r
438 BOOST_QVM_INLINE_OPERATIONS
\r
439 typename enable_if_c<
\r
440 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
\r
442 operator!=( A const & a, B const & b )
\r
445 !(vec_traits<A>::template read_element<0>(a)==vec_traits<B>::template read_element<0>(b)) ||
\r
446 !(vec_traits<A>::template read_element<1>(a)==vec_traits<B>::template read_element<1>(b)) ||
\r
447 !(vec_traits<A>::template read_element<2>(a)==vec_traits<B>::template read_element<2>(b));
\r
453 using ::boost::qvm::operator!=;
\r
460 struct neq_vv_defined;
\r
466 static bool const value=true;
\r
471 BOOST_QVM_INLINE_OPERATIONS
\r
472 typename lazy_enable_if_c<
\r
473 vec_traits<A>::dim==3,
\r
474 deduce_vec<A> >::type
\r
475 operator-( A const & a )
\r
477 typedef typename deduce_vec<A>::type R;
\r
479 vec_traits<R>::template write_element<0>(r)=-vec_traits<A>::template read_element<0>(a);
\r
480 vec_traits<R>::template write_element<1>(r)=-vec_traits<A>::template read_element<1>(a);
\r
481 vec_traits<R>::template write_element<2>(r)=-vec_traits<A>::template read_element<2>(a);
\r
488 using ::boost::qvm::operator-;
\r
495 struct minus_v_defined;
\r
501 static bool const value=true;
\r
506 BOOST_QVM_INLINE_OPERATIONS
\r
507 typename enable_if_c<
\r
508 is_vec<A>::value && vec_traits<A>::dim==3,
\r
509 typename vec_traits<A>::scalar_type>::type
\r
512 typedef typename vec_traits<A>::scalar_type T;
\r
513 T const a0=vec_traits<A>::template read_element<0>(a);
\r
514 T const a1=vec_traits<A>::template read_element<1>(a);
\r
515 T const a2=vec_traits<A>::template read_element<2>(a);
\r
516 T const m2=a0*a0+a1*a1+a2*a2;
\r
517 T const mag=sqrt<T>(m2);
\r
524 using ::boost::qvm::mag;
\r
531 struct mag_v_defined;
\r
537 static bool const value=true;
\r
542 BOOST_QVM_INLINE_OPERATIONS
\r
543 typename enable_if_c<
\r
544 is_vec<A>::value && vec_traits<A>::dim==3,
\r
545 typename vec_traits<A>::scalar_type>::type
\r
546 mag_sqr( A const & a )
\r
548 typedef typename vec_traits<A>::scalar_type T;
\r
549 T const a0=vec_traits<A>::template read_element<0>(a);
\r
550 T const a1=vec_traits<A>::template read_element<1>(a);
\r
551 T const a2=vec_traits<A>::template read_element<2>(a);
\r
552 T const m2=a0*a0+a1*a1+a2*a2;
\r
559 using ::boost::qvm::mag_sqr;
\r
566 struct mag_sqr_v_defined;
\r
570 mag_sqr_v_defined<3>
\r
572 static bool const value=true;
\r
577 BOOST_QVM_INLINE_OPERATIONS
\r
578 typename lazy_enable_if_c<
\r
579 vec_traits<A>::dim==3,
\r
580 deduce_vec<A> >::type
\r
581 normalized( A const & a )
\r
583 typedef typename vec_traits<A>::scalar_type T;
\r
584 T const a0=vec_traits<A>::template read_element<0>(a);
\r
585 T const a1=vec_traits<A>::template read_element<1>(a);
\r
586 T const a2=vec_traits<A>::template read_element<2>(a);
\r
587 T const m2=a0*a0+a1*a1+a2*a2;
\r
588 if( m2==scalar_traits<typename vec_traits<A>::scalar_type>::value(0) )
\r
589 BOOST_QVM_THROW_EXCEPTION(zero_magnitude_error());
\r
590 T const rm=scalar_traits<T>::value(1)/sqrt<T>(m2);
\r
591 typedef typename deduce_vec<A>::type R;
\r
593 vec_traits<R>::template write_element<0>(r)=a0*rm;
\r
594 vec_traits<R>::template write_element<1>(r)=a1*rm;
\r
595 vec_traits<R>::template write_element<2>(r)=a2*rm;
\r
602 using ::boost::qvm::normalized;
\r
606 BOOST_QVM_INLINE_OPERATIONS
\r
607 typename enable_if_c<
\r
608 vec_traits<A>::dim==3,
\r
612 typedef typename vec_traits<A>::scalar_type T;
\r
613 T const a0=vec_traits<A>::template read_element<0>(a);
\r
614 T const a1=vec_traits<A>::template read_element<1>(a);
\r
615 T const a2=vec_traits<A>::template read_element<2>(a);
\r
616 T const m2=a0*a0+a1*a1+a2*a2;
\r
617 if( m2==scalar_traits<typename vec_traits<A>::scalar_type>::value(0) )
\r
618 BOOST_QVM_THROW_EXCEPTION(zero_magnitude_error());
\r
619 T const rm=scalar_traits<T>::value(1)/sqrt<T>(m2);
\r
620 vec_traits<A>::template write_element<0>(a)*=rm;
\r
621 vec_traits<A>::template write_element<1>(a)*=rm;
\r
622 vec_traits<A>::template write_element<2>(a)*=rm;
\r
628 using ::boost::qvm::normalize;
\r
635 struct normalize_v_defined;
\r
639 normalize_v_defined<3>
\r
641 static bool const value=true;
\r
645 template <class A,class B>
\r
646 BOOST_QVM_INLINE_OPERATIONS
\r
647 typename lazy_enable_if_c<
\r
648 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
\r
649 deduce_scalar<typename vec_traits<A>::scalar_type,typename vec_traits<B>::scalar_type> >::type
\r
650 dot( A const & a, B const & b )
\r
652 typedef typename vec_traits<A>::scalar_type Ta;
\r
653 typedef typename vec_traits<B>::scalar_type Tb;
\r
654 typedef typename deduce_scalar<Ta,Tb>::type Tr;
\r
655 Ta const a0=vec_traits<A>::template read_element<0>(a);
\r
656 Ta const a1=vec_traits<A>::template read_element<1>(a);
\r
657 Ta const a2=vec_traits<A>::template read_element<2>(a);
\r
658 Tb const b0=vec_traits<B>::template read_element<0>(b);
\r
659 Tb const b1=vec_traits<B>::template read_element<1>(b);
\r
660 Tb const b2=vec_traits<B>::template read_element<2>(b);
\r
661 Tr const dot=a0*b0+a1*b1+a2*b2;
\r
668 using ::boost::qvm::dot;
\r
675 struct dot_vv_defined;
\r
681 static bool const value=true;
\r