1 #ifndef BOOST_QVM_GEN_VEC_OPERATIONS3_HPP_INCLUDED
2 #define BOOST_QVM_GEN_VEC_OPERATIONS3_HPP_INCLUDED
4 // Copyright 2008-2022 Emil Dotchevski and Reverge Studios, Inc.
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)
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_assign3.hpp>
15 #include <boost/qvm/math.hpp>
16 #include <boost/qvm/static_assert.hpp>
17 #include <boost/qvm/throw_exception.hpp>
19 namespace boost { namespace qvm {
21 template <class A,class B>
22 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
23 typename lazy_enable_if_c<
24 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
25 deduce_vec2<A,B,3> >::type
26 operator+( A const & a, B const & b )
28 typedef typename deduce_vec2<A,B,3>::type R;
29 BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==3);
31 vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)+vec_traits<B>::template read_element<0>(b);
32 vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)+vec_traits<B>::template read_element<1>(b);
33 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)+vec_traits<B>::template read_element<2>(b);
40 using ::boost::qvm::operator+;
47 struct plus_vv_defined;
53 static bool const value=true;
57 template <class A,class B>
58 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
59 typename lazy_enable_if_c<
60 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
61 deduce_vec2<A,B,3> >::type
62 operator-( A const & a, B const & b )
64 typedef typename deduce_vec2<A,B,3>::type R;
65 BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==3);
67 vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)-vec_traits<B>::template read_element<0>(b);
68 vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)-vec_traits<B>::template read_element<1>(b);
69 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)-vec_traits<B>::template read_element<2>(b);
76 using ::boost::qvm::operator-;
83 struct minus_vv_defined;
89 static bool const value=true;
93 template <class A,class B>
94 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
96 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
98 operator+=( A & a, B const & b )
100 vec_traits<A>::template write_element<0>(a)+=vec_traits<B>::template read_element<0>(b);
101 vec_traits<A>::template write_element<1>(a)+=vec_traits<B>::template read_element<1>(b);
102 vec_traits<A>::template write_element<2>(a)+=vec_traits<B>::template read_element<2>(b);
109 using ::boost::qvm::operator+=;
116 struct plus_eq_vv_defined;
120 plus_eq_vv_defined<3>
122 static bool const value=true;
126 template <class A,class B>
127 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
128 typename enable_if_c<
129 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
131 operator-=( A & a, B const & b )
133 vec_traits<A>::template write_element<0>(a)-=vec_traits<B>::template read_element<0>(b);
134 vec_traits<A>::template write_element<1>(a)-=vec_traits<B>::template read_element<1>(b);
135 vec_traits<A>::template write_element<2>(a)-=vec_traits<B>::template read_element<2>(b);
142 using ::boost::qvm::operator-=;
149 struct minus_eq_vv_defined;
153 minus_eq_vv_defined<3>
155 static bool const value=true;
159 template <class A,class B>
160 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
161 typename lazy_enable_if_c<
162 vec_traits<A>::dim==3 && is_scalar<B>::value,
163 deduce_vec2<A,B,vec_traits<A>::dim> >::type
164 operator*( A const & a, B b )
166 typedef typename deduce_vec2<A,B,vec_traits<A>::dim>::type R;
168 vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)*b;
169 vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)*b;
170 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)*b;
177 using ::boost::qvm::operator*;
184 struct mul_vs_defined;
190 static bool const value=true;
194 template <class A,class B>
195 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
196 typename lazy_enable_if_c<
197 is_scalar<A>::value && vec_traits<B>::dim==3,
198 deduce_vec2<A,B,vec_traits<B>::dim> >::type
199 operator*( A a, B const & b )
201 typedef typename deduce_vec2<A,B,vec_traits<B>::dim>::type R;
203 vec_traits<R>::template write_element<0>(r)=a*vec_traits<B>::template read_element<0>(b);
204 vec_traits<R>::template write_element<1>(r)=a*vec_traits<B>::template read_element<1>(b);
205 vec_traits<R>::template write_element<2>(r)=a*vec_traits<B>::template read_element<2>(b);
212 using ::boost::qvm::operator*;
219 struct mul_sv_defined;
225 static bool const value=true;
229 template <class A,class B>
230 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
231 typename enable_if_c<
232 vec_traits<A>::dim==3 && is_scalar<B>::value,
234 operator*=( A & a, B b )
236 vec_traits<A>::template write_element<0>(a)*=b;
237 vec_traits<A>::template write_element<1>(a)*=b;
238 vec_traits<A>::template write_element<2>(a)*=b;
245 using ::boost::qvm::operator*=;
252 struct mul_eq_vs_defined;
258 static bool const value=true;
262 template <class A,class B>
263 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
264 typename lazy_enable_if_c<
265 vec_traits<A>::dim==3 && is_scalar<B>::value,
266 deduce_vec2<A,B,vec_traits<A>::dim> >::type
267 operator/( A const & a, B b )
269 typedef typename deduce_vec2<A,B,vec_traits<A>::dim>::type R;
271 vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)/b;
272 vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)/b;
273 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)/b;
280 using ::boost::qvm::operator/;
287 struct div_vs_defined;
293 static bool const value=true;
297 template <class A,class B>
298 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
299 typename enable_if_c<
300 vec_traits<A>::dim==3 && is_scalar<B>::value,
302 operator/=( A & a, B b )
304 vec_traits<A>::template write_element<0>(a)/=b;
305 vec_traits<A>::template write_element<1>(a)/=b;
306 vec_traits<A>::template write_element<2>(a)/=b;
313 using ::boost::qvm::operator/=;
320 struct div_eq_vs_defined;
326 static bool const value=true;
330 template <class R,class A>
331 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
332 typename enable_if_c<
334 vec_traits<R>::dim==3 && vec_traits<A>::dim==3,
336 convert_to( A const & a )
339 vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a);
340 vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a);
341 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a);
348 using ::boost::qvm::convert_to;
355 struct convert_to_v_defined;
359 convert_to_v_defined<3>
361 static bool const value=true;
365 template <class A,class B>
366 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
367 typename enable_if_c<
368 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
370 operator==( A const & a, B const & b )
373 vec_traits<A>::template read_element<0>(a)==vec_traits<B>::template read_element<0>(b) &&
374 vec_traits<A>::template read_element<1>(a)==vec_traits<B>::template read_element<1>(b) &&
375 vec_traits<A>::template read_element<2>(a)==vec_traits<B>::template read_element<2>(b);
381 using ::boost::qvm::operator==;
388 struct eq_vv_defined;
394 static bool const value=true;
398 template <class A,class B>
399 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
400 typename enable_if_c<
401 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
403 operator!=( A const & a, B const & b )
406 !(vec_traits<A>::template read_element<0>(a)==vec_traits<B>::template read_element<0>(b)) ||
407 !(vec_traits<A>::template read_element<1>(a)==vec_traits<B>::template read_element<1>(b)) ||
408 !(vec_traits<A>::template read_element<2>(a)==vec_traits<B>::template read_element<2>(b));
414 using ::boost::qvm::operator!=;
421 struct neq_vv_defined;
427 static bool const value=true;
432 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
433 typename lazy_enable_if_c<
434 vec_traits<A>::dim==3,
435 deduce_vec<A> >::type
436 operator-( A const & a )
438 typedef typename deduce_vec<A>::type R;
440 vec_traits<R>::template write_element<0>(r)=-vec_traits<A>::template read_element<0>(a);
441 vec_traits<R>::template write_element<1>(r)=-vec_traits<A>::template read_element<1>(a);
442 vec_traits<R>::template write_element<2>(r)=-vec_traits<A>::template read_element<2>(a);
449 using ::boost::qvm::operator-;
456 struct minus_v_defined;
462 static bool const value=true;
467 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
468 typename enable_if_c<
469 is_vec<A>::value && vec_traits<A>::dim==3,
470 typename vec_traits<A>::scalar_type>::type
473 typedef typename vec_traits<A>::scalar_type T;
474 T const a0=vec_traits<A>::template read_element<0>(a);
475 T const a1=vec_traits<A>::template read_element<1>(a);
476 T const a2=vec_traits<A>::template read_element<2>(a);
477 T const m2=a0*a0+a1*a1+a2*a2;
478 T const mag=sqrt(m2);
485 using ::boost::qvm::mag;
492 struct mag_v_defined;
498 static bool const value=true;
503 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
504 typename enable_if_c<
505 is_vec<A>::value && vec_traits<A>::dim==3,
506 typename vec_traits<A>::scalar_type>::type
507 mag_sqr( A const & a )
509 typedef typename vec_traits<A>::scalar_type T;
510 T const a0=vec_traits<A>::template read_element<0>(a);
511 T const a1=vec_traits<A>::template read_element<1>(a);
512 T const a2=vec_traits<A>::template read_element<2>(a);
513 T const m2=a0*a0+a1*a1+a2*a2;
520 using ::boost::qvm::mag_sqr;
527 struct mag_sqr_v_defined;
533 static bool const value=true;
538 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
539 typename lazy_enable_if_c<
540 vec_traits<A>::dim==3,
541 deduce_vec<A> >::type
542 normalized( A const & a )
544 typedef typename vec_traits<A>::scalar_type T;
545 T const a0=vec_traits<A>::template read_element<0>(a);
546 T const a1=vec_traits<A>::template read_element<1>(a);
547 T const a2=vec_traits<A>::template read_element<2>(a);
548 T const m2=a0*a0+a1*a1+a2*a2;
549 if( m2==scalar_traits<typename vec_traits<A>::scalar_type>::value(0) )
550 BOOST_QVM_THROW_EXCEPTION(zero_magnitude_error());
551 T const rm=scalar_traits<T>::value(1)/sqrt(m2);
552 typedef typename deduce_vec<A>::type R;
554 vec_traits<R>::template write_element<0>(r)=a0*rm;
555 vec_traits<R>::template write_element<1>(r)=a1*rm;
556 vec_traits<R>::template write_element<2>(r)=a2*rm;
563 using ::boost::qvm::normalized;
567 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
568 typename enable_if_c<
569 vec_traits<A>::dim==3,
573 typedef typename vec_traits<A>::scalar_type T;
574 T const a0=vec_traits<A>::template read_element<0>(a);
575 T const a1=vec_traits<A>::template read_element<1>(a);
576 T const a2=vec_traits<A>::template read_element<2>(a);
577 T const m2=a0*a0+a1*a1+a2*a2;
578 if( m2==scalar_traits<typename vec_traits<A>::scalar_type>::value(0) )
579 BOOST_QVM_THROW_EXCEPTION(zero_magnitude_error());
580 T const rm=scalar_traits<T>::value(1)/sqrt(m2);
581 vec_traits<A>::template write_element<0>(a)*=rm;
582 vec_traits<A>::template write_element<1>(a)*=rm;
583 vec_traits<A>::template write_element<2>(a)*=rm;
589 using ::boost::qvm::normalize;
596 struct normalize_v_defined;
600 normalize_v_defined<3>
602 static bool const value=true;
606 template <class A,class B>
607 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_OPERATIONS
608 typename lazy_enable_if_c<
609 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
610 deduce_scalar<typename vec_traits<A>::scalar_type,typename vec_traits<B>::scalar_type> >::type
611 dot( A const & a, B const & b )
613 typedef typename vec_traits<A>::scalar_type Ta;
614 typedef typename vec_traits<B>::scalar_type Tb;
615 typedef typename deduce_scalar<Ta,Tb>::type Tr;
616 Ta const a0=vec_traits<A>::template read_element<0>(a);
617 Ta const a1=vec_traits<A>::template read_element<1>(a);
618 Ta const a2=vec_traits<A>::template read_element<2>(a);
619 Tb const b0=vec_traits<B>::template read_element<0>(b);
620 Tb const b1=vec_traits<B>::template read_element<1>(b);
621 Tb const b2=vec_traits<B>::template read_element<2>(b);
622 Tr const dot=a0*b0+a1*b1+a2*b2;
629 using ::boost::qvm::dot;
636 struct dot_vv_defined;
642 static bool const value=true;