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_B3A6DB3C87C3E99245ED1C6B747DE
7 #define BOOST_QVM_B3A6DB3C87C3E99245ED1C6B747DE
9 //This file was generated by a program. Do not edit manually.
11 #include <boost/qvm/assert.hpp>
12 #include <boost/qvm/deduce_mat.hpp>
13 #include <boost/qvm/deduce_vec.hpp>
14 #include <boost/qvm/error.hpp>
15 #include <boost/qvm/gen/mat_assign3.hpp>
16 #include <boost/qvm/quat_traits.hpp>
17 #include <boost/qvm/scalar_traits.hpp>
18 #include <boost/qvm/throw_exception.hpp>
26 template <class A,class B>
27 BOOST_QVM_INLINE_OPERATIONS
28 typename lazy_enable_if_c<
29 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
30 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
31 deduce_mat2<A,B,3,3> >::type
32 operator+( A const & a, B const & b )
34 typedef typename deduce_mat2<A,B,3,3>::type R;
35 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==3);
36 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==3);
38 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)+mat_traits<B>::template read_element<0,0>(b);
39 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)+mat_traits<B>::template read_element<0,1>(b);
40 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)+mat_traits<B>::template read_element<0,2>(b);
41 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)+mat_traits<B>::template read_element<1,0>(b);
42 mat_traits<R>::template write_element<1,1>(r)=mat_traits<A>::template read_element<1,1>(a)+mat_traits<B>::template read_element<1,1>(b);
43 mat_traits<R>::template write_element<1,2>(r)=mat_traits<A>::template read_element<1,2>(a)+mat_traits<B>::template read_element<1,2>(b);
44 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)+mat_traits<B>::template read_element<2,0>(b);
45 mat_traits<R>::template write_element<2,1>(r)=mat_traits<A>::template read_element<2,1>(a)+mat_traits<B>::template read_element<2,1>(b);
46 mat_traits<R>::template write_element<2,2>(r)=mat_traits<A>::template read_element<2,2>(a)+mat_traits<B>::template read_element<2,2>(b);
53 using ::boost::qvm::operator+;
59 template <int R,int C>
60 struct plus_mm_defined;
66 static bool const value=true;
70 template <class A,class B>
71 BOOST_QVM_INLINE_OPERATIONS
72 typename lazy_enable_if_c<
73 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
74 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
75 deduce_mat2<A,B,3,1> >::type
76 operator+( A const & a, B const & b )
78 typedef typename deduce_mat2<A,B,3,1>::type R;
79 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==3);
80 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==1);
82 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)+mat_traits<B>::template read_element<0,0>(b);
83 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)+mat_traits<B>::template read_element<1,0>(b);
84 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)+mat_traits<B>::template read_element<2,0>(b);
91 using ::boost::qvm::operator+;
97 template <int R,int C>
98 struct plus_mm_defined;
104 static bool const value=true;
108 template <class A,class B>
109 BOOST_QVM_INLINE_OPERATIONS
110 typename lazy_enable_if_c<
111 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
112 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
113 deduce_mat2<A,B,1,3> >::type
114 operator+( A const & a, B const & b )
116 typedef typename deduce_mat2<A,B,1,3>::type R;
117 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==1);
118 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==3);
120 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)+mat_traits<B>::template read_element<0,0>(b);
121 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)+mat_traits<B>::template read_element<0,1>(b);
122 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)+mat_traits<B>::template read_element<0,2>(b);
129 using ::boost::qvm::operator+;
135 template <int R,int C>
136 struct plus_mm_defined;
142 static bool const value=true;
146 template <class A,class B>
147 BOOST_QVM_INLINE_OPERATIONS
148 typename lazy_enable_if_c<
149 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
150 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
151 deduce_mat2<A,B,3,3> >::type
152 operator-( A const & a, B const & b )
154 typedef typename deduce_mat2<A,B,3,3>::type R;
155 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==3);
156 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==3);
158 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)-mat_traits<B>::template read_element<0,0>(b);
159 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)-mat_traits<B>::template read_element<0,1>(b);
160 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)-mat_traits<B>::template read_element<0,2>(b);
161 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)-mat_traits<B>::template read_element<1,0>(b);
162 mat_traits<R>::template write_element<1,1>(r)=mat_traits<A>::template read_element<1,1>(a)-mat_traits<B>::template read_element<1,1>(b);
163 mat_traits<R>::template write_element<1,2>(r)=mat_traits<A>::template read_element<1,2>(a)-mat_traits<B>::template read_element<1,2>(b);
164 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)-mat_traits<B>::template read_element<2,0>(b);
165 mat_traits<R>::template write_element<2,1>(r)=mat_traits<A>::template read_element<2,1>(a)-mat_traits<B>::template read_element<2,1>(b);
166 mat_traits<R>::template write_element<2,2>(r)=mat_traits<A>::template read_element<2,2>(a)-mat_traits<B>::template read_element<2,2>(b);
173 using ::boost::qvm::operator-;
179 template <int R,int C>
180 struct minus_mm_defined;
184 minus_mm_defined<3,3>
186 static bool const value=true;
190 template <class A,class B>
191 BOOST_QVM_INLINE_OPERATIONS
192 typename lazy_enable_if_c<
193 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
194 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
195 deduce_mat2<A,B,3,1> >::type
196 operator-( A const & a, B const & b )
198 typedef typename deduce_mat2<A,B,3,1>::type R;
199 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==3);
200 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==1);
202 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)-mat_traits<B>::template read_element<0,0>(b);
203 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)-mat_traits<B>::template read_element<1,0>(b);
204 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)-mat_traits<B>::template read_element<2,0>(b);
211 using ::boost::qvm::operator-;
217 template <int R,int C>
218 struct minus_mm_defined;
222 minus_mm_defined<3,1>
224 static bool const value=true;
228 template <class A,class B>
229 BOOST_QVM_INLINE_OPERATIONS
230 typename lazy_enable_if_c<
231 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
232 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
233 deduce_mat2<A,B,1,3> >::type
234 operator-( A const & a, B const & b )
236 typedef typename deduce_mat2<A,B,1,3>::type R;
237 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==1);
238 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==3);
240 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)-mat_traits<B>::template read_element<0,0>(b);
241 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)-mat_traits<B>::template read_element<0,1>(b);
242 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)-mat_traits<B>::template read_element<0,2>(b);
249 using ::boost::qvm::operator-;
255 template <int R,int C>
256 struct minus_mm_defined;
260 minus_mm_defined<1,3>
262 static bool const value=true;
266 template <class A,class B>
267 BOOST_QVM_INLINE_OPERATIONS
268 typename enable_if_c<
269 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
270 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
272 operator+=( A & a, B const & b )
274 mat_traits<A>::template write_element<0,0>(a)+=mat_traits<B>::template read_element<0,0>(b);
275 mat_traits<A>::template write_element<0,1>(a)+=mat_traits<B>::template read_element<0,1>(b);
276 mat_traits<A>::template write_element<0,2>(a)+=mat_traits<B>::template read_element<0,2>(b);
277 mat_traits<A>::template write_element<1,0>(a)+=mat_traits<B>::template read_element<1,0>(b);
278 mat_traits<A>::template write_element<1,1>(a)+=mat_traits<B>::template read_element<1,1>(b);
279 mat_traits<A>::template write_element<1,2>(a)+=mat_traits<B>::template read_element<1,2>(b);
280 mat_traits<A>::template write_element<2,0>(a)+=mat_traits<B>::template read_element<2,0>(b);
281 mat_traits<A>::template write_element<2,1>(a)+=mat_traits<B>::template read_element<2,1>(b);
282 mat_traits<A>::template write_element<2,2>(a)+=mat_traits<B>::template read_element<2,2>(b);
289 using ::boost::qvm::operator+=;
295 template <int R,int C>
296 struct plus_eq_mm_defined;
300 plus_eq_mm_defined<3,3>
302 static bool const value=true;
306 template <class A,class B>
307 BOOST_QVM_INLINE_OPERATIONS
308 typename enable_if_c<
309 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
310 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
312 operator+=( A & a, B const & b )
314 mat_traits<A>::template write_element<0,0>(a)+=mat_traits<B>::template read_element<0,0>(b);
315 mat_traits<A>::template write_element<1,0>(a)+=mat_traits<B>::template read_element<1,0>(b);
316 mat_traits<A>::template write_element<2,0>(a)+=mat_traits<B>::template read_element<2,0>(b);
323 using ::boost::qvm::operator+=;
329 template <int R,int C>
330 struct plus_eq_mm_defined;
334 plus_eq_mm_defined<3,1>
336 static bool const value=true;
340 template <class A,class B>
341 BOOST_QVM_INLINE_OPERATIONS
342 typename enable_if_c<
343 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
344 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
346 operator+=( A & a, B const & b )
348 mat_traits<A>::template write_element<0,0>(a)+=mat_traits<B>::template read_element<0,0>(b);
349 mat_traits<A>::template write_element<0,1>(a)+=mat_traits<B>::template read_element<0,1>(b);
350 mat_traits<A>::template write_element<0,2>(a)+=mat_traits<B>::template read_element<0,2>(b);
357 using ::boost::qvm::operator+=;
363 template <int R,int C>
364 struct plus_eq_mm_defined;
368 plus_eq_mm_defined<1,3>
370 static bool const value=true;
374 template <class A,class B>
375 BOOST_QVM_INLINE_OPERATIONS
376 typename enable_if_c<
377 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
378 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
380 operator-=( A & a, B const & b )
382 mat_traits<A>::template write_element<0,0>(a)-=mat_traits<B>::template read_element<0,0>(b);
383 mat_traits<A>::template write_element<0,1>(a)-=mat_traits<B>::template read_element<0,1>(b);
384 mat_traits<A>::template write_element<0,2>(a)-=mat_traits<B>::template read_element<0,2>(b);
385 mat_traits<A>::template write_element<1,0>(a)-=mat_traits<B>::template read_element<1,0>(b);
386 mat_traits<A>::template write_element<1,1>(a)-=mat_traits<B>::template read_element<1,1>(b);
387 mat_traits<A>::template write_element<1,2>(a)-=mat_traits<B>::template read_element<1,2>(b);
388 mat_traits<A>::template write_element<2,0>(a)-=mat_traits<B>::template read_element<2,0>(b);
389 mat_traits<A>::template write_element<2,1>(a)-=mat_traits<B>::template read_element<2,1>(b);
390 mat_traits<A>::template write_element<2,2>(a)-=mat_traits<B>::template read_element<2,2>(b);
397 using ::boost::qvm::operator-=;
403 template <int R,int C>
404 struct minus_eq_mm_defined;
408 minus_eq_mm_defined<3,3>
410 static bool const value=true;
414 template <class A,class B>
415 BOOST_QVM_INLINE_OPERATIONS
416 typename enable_if_c<
417 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
418 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
420 operator-=( A & a, B const & b )
422 mat_traits<A>::template write_element<0,0>(a)-=mat_traits<B>::template read_element<0,0>(b);
423 mat_traits<A>::template write_element<1,0>(a)-=mat_traits<B>::template read_element<1,0>(b);
424 mat_traits<A>::template write_element<2,0>(a)-=mat_traits<B>::template read_element<2,0>(b);
431 using ::boost::qvm::operator-=;
437 template <int R,int C>
438 struct minus_eq_mm_defined;
442 minus_eq_mm_defined<3,1>
444 static bool const value=true;
448 template <class A,class B>
449 BOOST_QVM_INLINE_OPERATIONS
450 typename enable_if_c<
451 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
452 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
454 operator-=( A & a, B const & b )
456 mat_traits<A>::template write_element<0,0>(a)-=mat_traits<B>::template read_element<0,0>(b);
457 mat_traits<A>::template write_element<0,1>(a)-=mat_traits<B>::template read_element<0,1>(b);
458 mat_traits<A>::template write_element<0,2>(a)-=mat_traits<B>::template read_element<0,2>(b);
465 using ::boost::qvm::operator-=;
471 template <int R,int C>
472 struct minus_eq_mm_defined;
476 minus_eq_mm_defined<1,3>
478 static bool const value=true;
482 template <class A,class B>
483 BOOST_QVM_INLINE_OPERATIONS
484 typename lazy_enable_if_c<
485 mat_traits<A>::rows==3 && mat_traits<A>::cols==3 && is_scalar<B>::value,
486 deduce_mat<A> >::type
487 operator*( A const & a, B b )
489 typedef typename deduce_mat<A>::type R;
491 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)*b;
492 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)*b;
493 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)*b;
494 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)*b;
495 mat_traits<R>::template write_element<1,1>(r)=mat_traits<A>::template read_element<1,1>(a)*b;
496 mat_traits<R>::template write_element<1,2>(r)=mat_traits<A>::template read_element<1,2>(a)*b;
497 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)*b;
498 mat_traits<R>::template write_element<2,1>(r)=mat_traits<A>::template read_element<2,1>(a)*b;
499 mat_traits<R>::template write_element<2,2>(r)=mat_traits<A>::template read_element<2,2>(a)*b;
506 using ::boost::qvm::operator*;
512 template <int R,int C>
513 struct mul_ms_defined;
519 static bool const value=true;
523 template <class A,class B>
524 BOOST_QVM_INLINE_OPERATIONS
525 typename lazy_enable_if_c<
526 is_scalar<A>::value && mat_traits<B>::rows==3 && mat_traits<B>::cols==3,
527 deduce_mat<B> >::type
528 operator*( A a, B const & b )
530 typedef typename deduce_mat<B>::type R;
532 mat_traits<R>::template write_element<0,0>(r)=a*mat_traits<B>::template read_element<0,0>(b);
533 mat_traits<R>::template write_element<0,1>(r)=a*mat_traits<B>::template read_element<0,1>(b);
534 mat_traits<R>::template write_element<0,2>(r)=a*mat_traits<B>::template read_element<0,2>(b);
535 mat_traits<R>::template write_element<1,0>(r)=a*mat_traits<B>::template read_element<1,0>(b);
536 mat_traits<R>::template write_element<1,1>(r)=a*mat_traits<B>::template read_element<1,1>(b);
537 mat_traits<R>::template write_element<1,2>(r)=a*mat_traits<B>::template read_element<1,2>(b);
538 mat_traits<R>::template write_element<2,0>(r)=a*mat_traits<B>::template read_element<2,0>(b);
539 mat_traits<R>::template write_element<2,1>(r)=a*mat_traits<B>::template read_element<2,1>(b);
540 mat_traits<R>::template write_element<2,2>(r)=a*mat_traits<B>::template read_element<2,2>(b);
547 using ::boost::qvm::operator*;
553 template <int R,int C>
554 struct mul_sm_defined;
560 static bool const value=true;
564 template <class A,class B>
565 BOOST_QVM_INLINE_OPERATIONS
566 typename lazy_enable_if_c<
567 mat_traits<A>::rows==3 && mat_traits<A>::cols==1 && is_scalar<B>::value,
568 deduce_mat<A> >::type
569 operator*( A const & a, B b )
571 typedef typename deduce_mat<A>::type R;
573 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)*b;
574 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)*b;
575 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)*b;
582 using ::boost::qvm::operator*;
588 template <int R,int C>
589 struct mul_ms_defined;
595 static bool const value=true;
599 template <class A,class B>
600 BOOST_QVM_INLINE_OPERATIONS
601 typename lazy_enable_if_c<
602 is_scalar<A>::value && mat_traits<B>::rows==3 && mat_traits<B>::cols==1,
603 deduce_mat<B> >::type
604 operator*( A a, B const & b )
606 typedef typename deduce_mat<B>::type R;
608 mat_traits<R>::template write_element<0,0>(r)=a*mat_traits<B>::template read_element<0,0>(b);
609 mat_traits<R>::template write_element<1,0>(r)=a*mat_traits<B>::template read_element<1,0>(b);
610 mat_traits<R>::template write_element<2,0>(r)=a*mat_traits<B>::template read_element<2,0>(b);
617 using ::boost::qvm::operator*;
623 template <int R,int C>
624 struct mul_sm_defined;
630 static bool const value=true;
634 template <class A,class B>
635 BOOST_QVM_INLINE_OPERATIONS
636 typename lazy_enable_if_c<
637 mat_traits<A>::rows==1 && mat_traits<A>::cols==3 && is_scalar<B>::value,
638 deduce_mat<A> >::type
639 operator*( A const & a, B b )
641 typedef typename deduce_mat<A>::type R;
643 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)*b;
644 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)*b;
645 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)*b;
652 using ::boost::qvm::operator*;
658 template <int R,int C>
659 struct mul_ms_defined;
665 static bool const value=true;
669 template <class A,class B>
670 BOOST_QVM_INLINE_OPERATIONS
671 typename lazy_enable_if_c<
672 is_scalar<A>::value && mat_traits<B>::rows==1 && mat_traits<B>::cols==3,
673 deduce_mat<B> >::type
674 operator*( A a, B const & b )
676 typedef typename deduce_mat<B>::type R;
678 mat_traits<R>::template write_element<0,0>(r)=a*mat_traits<B>::template read_element<0,0>(b);
679 mat_traits<R>::template write_element<0,1>(r)=a*mat_traits<B>::template read_element<0,1>(b);
680 mat_traits<R>::template write_element<0,2>(r)=a*mat_traits<B>::template read_element<0,2>(b);
687 using ::boost::qvm::operator*;
693 template <int R,int C>
694 struct mul_sm_defined;
700 static bool const value=true;
704 template <class A,class B>
705 BOOST_QVM_INLINE_OPERATIONS
706 typename enable_if_c<
707 mat_traits<A>::rows==3 && mat_traits<A>::cols==3 && is_scalar<B>::value,
709 operator*=( A & a, B b )
711 mat_traits<A>::template write_element<0,0>(a)*=b;
712 mat_traits<A>::template write_element<0,1>(a)*=b;
713 mat_traits<A>::template write_element<0,2>(a)*=b;
714 mat_traits<A>::template write_element<1,0>(a)*=b;
715 mat_traits<A>::template write_element<1,1>(a)*=b;
716 mat_traits<A>::template write_element<1,2>(a)*=b;
717 mat_traits<A>::template write_element<2,0>(a)*=b;
718 mat_traits<A>::template write_element<2,1>(a)*=b;
719 mat_traits<A>::template write_element<2,2>(a)*=b;
726 using ::boost::qvm::operator*=;
732 template <int R,int C>
733 struct mul_eq_ms_defined;
737 mul_eq_ms_defined<3,3>
739 static bool const value=true;
743 template <class A,class B>
744 BOOST_QVM_INLINE_OPERATIONS
745 typename enable_if_c<
746 mat_traits<A>::rows==3 && mat_traits<A>::cols==1 && is_scalar<B>::value,
748 operator*=( A & a, B b )
750 mat_traits<A>::template write_element<0,0>(a)*=b;
751 mat_traits<A>::template write_element<1,0>(a)*=b;
752 mat_traits<A>::template write_element<2,0>(a)*=b;
759 using ::boost::qvm::operator*=;
765 template <int R,int C>
766 struct mul_eq_ms_defined;
770 mul_eq_ms_defined<3,1>
772 static bool const value=true;
776 template <class A,class B>
777 BOOST_QVM_INLINE_OPERATIONS
778 typename enable_if_c<
779 mat_traits<A>::rows==1 && mat_traits<A>::cols==3 && is_scalar<B>::value,
781 operator*=( A & a, B b )
783 mat_traits<A>::template write_element<0,0>(a)*=b;
784 mat_traits<A>::template write_element<0,1>(a)*=b;
785 mat_traits<A>::template write_element<0,2>(a)*=b;
792 using ::boost::qvm::operator*=;
798 template <int R,int C>
799 struct mul_eq_ms_defined;
803 mul_eq_ms_defined<1,3>
805 static bool const value=true;
809 template <class A,class B>
810 BOOST_QVM_INLINE_OPERATIONS
811 typename lazy_enable_if_c<
812 mat_traits<A>::rows==3 && mat_traits<A>::cols==3 && is_scalar<B>::value,
813 deduce_mat<A> >::type
814 operator/( A const & a, B b )
816 typedef typename deduce_mat<A>::type R;
818 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)/b;
819 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)/b;
820 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)/b;
821 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)/b;
822 mat_traits<R>::template write_element<1,1>(r)=mat_traits<A>::template read_element<1,1>(a)/b;
823 mat_traits<R>::template write_element<1,2>(r)=mat_traits<A>::template read_element<1,2>(a)/b;
824 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)/b;
825 mat_traits<R>::template write_element<2,1>(r)=mat_traits<A>::template read_element<2,1>(a)/b;
826 mat_traits<R>::template write_element<2,2>(r)=mat_traits<A>::template read_element<2,2>(a)/b;
833 using ::boost::qvm::operator/;
839 template <int R,int C>
840 struct div_ms_defined;
846 static bool const value=true;
850 template <class A,class B>
851 BOOST_QVM_INLINE_OPERATIONS
852 typename lazy_enable_if_c<
853 is_scalar<A>::value && mat_traits<B>::rows==3 && mat_traits<B>::cols==3,
854 deduce_mat<B> >::type
855 operator/( A a, B const & b )
857 typedef typename deduce_mat<B>::type R;
859 mat_traits<R>::template write_element<0,0>(r)=a/mat_traits<B>::template read_element<0,0>(b);
860 mat_traits<R>::template write_element<0,1>(r)=a/mat_traits<B>::template read_element<0,1>(b);
861 mat_traits<R>::template write_element<0,2>(r)=a/mat_traits<B>::template read_element<0,2>(b);
862 mat_traits<R>::template write_element<1,0>(r)=a/mat_traits<B>::template read_element<1,0>(b);
863 mat_traits<R>::template write_element<1,1>(r)=a/mat_traits<B>::template read_element<1,1>(b);
864 mat_traits<R>::template write_element<1,2>(r)=a/mat_traits<B>::template read_element<1,2>(b);
865 mat_traits<R>::template write_element<2,0>(r)=a/mat_traits<B>::template read_element<2,0>(b);
866 mat_traits<R>::template write_element<2,1>(r)=a/mat_traits<B>::template read_element<2,1>(b);
867 mat_traits<R>::template write_element<2,2>(r)=a/mat_traits<B>::template read_element<2,2>(b);
874 using ::boost::qvm::operator/;
880 template <int R,int C>
881 struct div_sm_defined;
887 static bool const value=true;
891 template <class A,class B>
892 BOOST_QVM_INLINE_OPERATIONS
893 typename lazy_enable_if_c<
894 mat_traits<A>::rows==3 && mat_traits<A>::cols==1 && is_scalar<B>::value,
895 deduce_mat<A> >::type
896 operator/( A const & a, B b )
898 typedef typename deduce_mat<A>::type R;
900 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)/b;
901 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)/b;
902 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)/b;
909 using ::boost::qvm::operator/;
915 template <int R,int C>
916 struct div_ms_defined;
922 static bool const value=true;
926 template <class A,class B>
927 BOOST_QVM_INLINE_OPERATIONS
928 typename lazy_enable_if_c<
929 is_scalar<A>::value && mat_traits<B>::rows==3 && mat_traits<B>::cols==1,
930 deduce_mat<B> >::type
931 operator/( A a, B const & b )
933 typedef typename deduce_mat<B>::type R;
935 mat_traits<R>::template write_element<0,0>(r)=a/mat_traits<B>::template read_element<0,0>(b);
936 mat_traits<R>::template write_element<1,0>(r)=a/mat_traits<B>::template read_element<1,0>(b);
937 mat_traits<R>::template write_element<2,0>(r)=a/mat_traits<B>::template read_element<2,0>(b);
944 using ::boost::qvm::operator/;
950 template <int R,int C>
951 struct div_sm_defined;
957 static bool const value=true;
961 template <class A,class B>
962 BOOST_QVM_INLINE_OPERATIONS
963 typename lazy_enable_if_c<
964 mat_traits<A>::rows==1 && mat_traits<A>::cols==3 && is_scalar<B>::value,
965 deduce_mat<A> >::type
966 operator/( A const & a, B b )
968 typedef typename deduce_mat<A>::type R;
970 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)/b;
971 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)/b;
972 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)/b;
979 using ::boost::qvm::operator/;
985 template <int R,int C>
986 struct div_ms_defined;
992 static bool const value=true;
996 template <class A,class B>
997 BOOST_QVM_INLINE_OPERATIONS
998 typename enable_if_c<
999 mat_traits<A>::rows==3 && mat_traits<A>::cols==3 && is_scalar<B>::value,
1001 operator/=( A & a, B b )
1003 mat_traits<A>::template write_element<0,0>(a)/=b;
1004 mat_traits<A>::template write_element<0,1>(a)/=b;
1005 mat_traits<A>::template write_element<0,2>(a)/=b;
1006 mat_traits<A>::template write_element<1,0>(a)/=b;
1007 mat_traits<A>::template write_element<1,1>(a)/=b;
1008 mat_traits<A>::template write_element<1,2>(a)/=b;
1009 mat_traits<A>::template write_element<2,0>(a)/=b;
1010 mat_traits<A>::template write_element<2,1>(a)/=b;
1011 mat_traits<A>::template write_element<2,2>(a)/=b;
1018 using ::boost::qvm::operator/=;
1024 template <int R,int C>
1025 struct div_eq_ms_defined;
1029 div_eq_ms_defined<3,3>
1031 static bool const value=true;
1035 template <class A,class B>
1036 BOOST_QVM_INLINE_OPERATIONS
1037 typename enable_if_c<
1038 mat_traits<A>::rows==3 && mat_traits<A>::cols==1 && is_scalar<B>::value,
1040 operator/=( A & a, B b )
1042 mat_traits<A>::template write_element<0,0>(a)/=b;
1043 mat_traits<A>::template write_element<1,0>(a)/=b;
1044 mat_traits<A>::template write_element<2,0>(a)/=b;
1051 using ::boost::qvm::operator/=;
1057 template <int R,int C>
1058 struct div_eq_ms_defined;
1062 div_eq_ms_defined<3,1>
1064 static bool const value=true;
1068 template <class A,class B>
1069 BOOST_QVM_INLINE_OPERATIONS
1070 typename enable_if_c<
1071 mat_traits<A>::rows==1 && mat_traits<A>::cols==3 && is_scalar<B>::value,
1073 operator/=( A & a, B b )
1075 mat_traits<A>::template write_element<0,0>(a)/=b;
1076 mat_traits<A>::template write_element<0,1>(a)/=b;
1077 mat_traits<A>::template write_element<0,2>(a)/=b;
1084 using ::boost::qvm::operator/=;
1090 template <int R,int C>
1091 struct div_eq_ms_defined;
1095 div_eq_ms_defined<1,3>
1097 static bool const value=true;
1101 template <class R,class A>
1102 BOOST_QVM_INLINE_OPERATIONS
1103 typename enable_if_c<
1104 mat_traits<R>::rows==3 && mat_traits<A>::rows==3 &&
1105 mat_traits<R>::cols==3 && mat_traits<A>::cols==3,
1107 convert_to( A const & a )
1110 mat_traits<R>::template write_element<0,0>(r) = mat_traits<A>::template read_element<0,0>(a);
1111 mat_traits<R>::template write_element<0,1>(r) = mat_traits<A>::template read_element<0,1>(a);
1112 mat_traits<R>::template write_element<0,2>(r) = mat_traits<A>::template read_element<0,2>(a);
1113 mat_traits<R>::template write_element<1,0>(r) = mat_traits<A>::template read_element<1,0>(a);
1114 mat_traits<R>::template write_element<1,1>(r) = mat_traits<A>::template read_element<1,1>(a);
1115 mat_traits<R>::template write_element<1,2>(r) = mat_traits<A>::template read_element<1,2>(a);
1116 mat_traits<R>::template write_element<2,0>(r) = mat_traits<A>::template read_element<2,0>(a);
1117 mat_traits<R>::template write_element<2,1>(r) = mat_traits<A>::template read_element<2,1>(a);
1118 mat_traits<R>::template write_element<2,2>(r) = mat_traits<A>::template read_element<2,2>(a);
1122 template <class R,class A>
1124 typename enable_if_c<
1125 is_mat<R>::value && is_quat<A>::value &&
1126 mat_traits<R>::rows==3 && mat_traits<R>::cols==3,
1128 convert_to( A const & q )
1130 typedef typename mat_traits<R>::scalar_type T;
1131 T const a=quat_traits<A>::template read_element<0>(q);
1132 T const b=quat_traits<A>::template read_element<1>(q);
1133 T const c=quat_traits<A>::template read_element<2>(q);
1134 T const d=quat_traits<A>::template read_element<3>(q);
1144 T const one = scalar_traits<T>::value(1);
1145 T const two = one+one;
1147 mat_traits<R>::template write_element<0,0>(r) = one - two*(cc+dd);
1148 mat_traits<R>::template write_element<0,1>(r) = two*(bc-ad);
1149 mat_traits<R>::template write_element<0,2>(r) = two*(bd+ac);
1150 mat_traits<R>::template write_element<1,0>(r) = two*(bc+ad);
1151 mat_traits<R>::template write_element<1,1>(r) = one - two*(bb+dd);
1152 mat_traits<R>::template write_element<1,2>(r) = two*(cd-ab);
1153 mat_traits<R>::template write_element<2,0>(r) = two*(bd-ac);
1154 mat_traits<R>::template write_element<2,1>(r) = two*(cd+ab);
1155 mat_traits<R>::template write_element<2,2>(r) = one - two*(bb+cc);
1162 using ::boost::qvm::convert_to;
1168 template <int R,int C>
1169 struct convert_to_m_defined;
1173 convert_to_m_defined<3,3>
1175 static bool const value=true;
1179 template <class R,class A>
1180 BOOST_QVM_INLINE_OPERATIONS
1181 typename enable_if_c<
1182 mat_traits<R>::rows==3 && mat_traits<A>::rows==3 &&
1183 mat_traits<R>::cols==1 && mat_traits<A>::cols==1,
1185 convert_to( A const & a )
1188 mat_traits<R>::template write_element<0,0>(r) = mat_traits<A>::template read_element<0,0>(a);
1189 mat_traits<R>::template write_element<1,0>(r) = mat_traits<A>::template read_element<1,0>(a);
1190 mat_traits<R>::template write_element<2,0>(r) = mat_traits<A>::template read_element<2,0>(a);
1197 using ::boost::qvm::convert_to;
1203 template <int R,int C>
1204 struct convert_to_m_defined;
1208 convert_to_m_defined<3,1>
1210 static bool const value=true;
1214 template <class R,class A>
1215 BOOST_QVM_INLINE_OPERATIONS
1216 typename enable_if_c<
1217 mat_traits<R>::rows==1 && mat_traits<A>::rows==1 &&
1218 mat_traits<R>::cols==3 && mat_traits<A>::cols==3,
1220 convert_to( A const & a )
1223 mat_traits<R>::template write_element<0,0>(r) = mat_traits<A>::template read_element<0,0>(a);
1224 mat_traits<R>::template write_element<0,1>(r) = mat_traits<A>::template read_element<0,1>(a);
1225 mat_traits<R>::template write_element<0,2>(r) = mat_traits<A>::template read_element<0,2>(a);
1232 using ::boost::qvm::convert_to;
1238 template <int R,int C>
1239 struct convert_to_m_defined;
1243 convert_to_m_defined<1,3>
1245 static bool const value=true;
1249 template <class A,class B>
1250 BOOST_QVM_INLINE_OPERATIONS
1251 typename enable_if_c<
1252 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
1253 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
1255 operator==( A const & a, B const & b )
1258 mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b) &&
1259 mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b) &&
1260 mat_traits<A>::template read_element<0,2>(a)==mat_traits<B>::template read_element<0,2>(b) &&
1261 mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b) &&
1262 mat_traits<A>::template read_element<1,1>(a)==mat_traits<B>::template read_element<1,1>(b) &&
1263 mat_traits<A>::template read_element<1,2>(a)==mat_traits<B>::template read_element<1,2>(b) &&
1264 mat_traits<A>::template read_element<2,0>(a)==mat_traits<B>::template read_element<2,0>(b) &&
1265 mat_traits<A>::template read_element<2,1>(a)==mat_traits<B>::template read_element<2,1>(b) &&
1266 mat_traits<A>::template read_element<2,2>(a)==mat_traits<B>::template read_element<2,2>(b);
1272 using ::boost::qvm::operator==;
1278 template <int R,int C>
1279 struct eq_mm_defined;
1285 static bool const value=true;
1289 template <class A,class B>
1290 BOOST_QVM_INLINE_OPERATIONS
1291 typename enable_if_c<
1292 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
1293 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
1295 operator==( A const & a, B const & b )
1298 mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b) &&
1299 mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b) &&
1300 mat_traits<A>::template read_element<2,0>(a)==mat_traits<B>::template read_element<2,0>(b);
1306 using ::boost::qvm::operator==;
1312 template <int R,int C>
1313 struct eq_mm_defined;
1319 static bool const value=true;
1323 template <class A,class B>
1324 BOOST_QVM_INLINE_OPERATIONS
1325 typename enable_if_c<
1326 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
1327 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
1329 operator==( A const & a, B const & b )
1332 mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b) &&
1333 mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b) &&
1334 mat_traits<A>::template read_element<0,2>(a)==mat_traits<B>::template read_element<0,2>(b);
1340 using ::boost::qvm::operator==;
1346 template <int R,int C>
1347 struct eq_mm_defined;
1353 static bool const value=true;
1357 template <class A,class B>
1358 BOOST_QVM_INLINE_OPERATIONS
1359 typename enable_if_c<
1360 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
1361 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
1363 operator!=( A const & a, B const & b )
1366 !(mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b)) ||
1367 !(mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b)) ||
1368 !(mat_traits<A>::template read_element<0,2>(a)==mat_traits<B>::template read_element<0,2>(b)) ||
1369 !(mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b)) ||
1370 !(mat_traits<A>::template read_element<1,1>(a)==mat_traits<B>::template read_element<1,1>(b)) ||
1371 !(mat_traits<A>::template read_element<1,2>(a)==mat_traits<B>::template read_element<1,2>(b)) ||
1372 !(mat_traits<A>::template read_element<2,0>(a)==mat_traits<B>::template read_element<2,0>(b)) ||
1373 !(mat_traits<A>::template read_element<2,1>(a)==mat_traits<B>::template read_element<2,1>(b)) ||
1374 !(mat_traits<A>::template read_element<2,2>(a)==mat_traits<B>::template read_element<2,2>(b));
1380 using ::boost::qvm::operator!=;
1386 template <int R,int C>
1387 struct neq_mm_defined;
1393 static bool const value=true;
1397 template <class A,class B>
1398 BOOST_QVM_INLINE_OPERATIONS
1399 typename enable_if_c<
1400 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
1401 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
1403 operator!=( A const & a, B const & b )
1406 !(mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b)) ||
1407 !(mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b)) ||
1408 !(mat_traits<A>::template read_element<2,0>(a)==mat_traits<B>::template read_element<2,0>(b));
1414 using ::boost::qvm::operator!=;
1420 template <int R,int C>
1421 struct neq_mm_defined;
1427 static bool const value=true;
1431 template <class A,class B>
1432 BOOST_QVM_INLINE_OPERATIONS
1433 typename enable_if_c<
1434 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
1435 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
1437 operator!=( A const & a, B const & b )
1440 !(mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b)) ||
1441 !(mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b)) ||
1442 !(mat_traits<A>::template read_element<0,2>(a)==mat_traits<B>::template read_element<0,2>(b));
1448 using ::boost::qvm::operator!=;
1454 template <int R,int C>
1455 struct neq_mm_defined;
1461 static bool const value=true;
1466 BOOST_QVM_INLINE_OPERATIONS
1467 typename lazy_enable_if_c<
1468 mat_traits<A>::rows==3 && mat_traits<A>::cols==3,
1469 deduce_mat<A> >::type
1470 operator-( A const & a )
1472 typedef typename deduce_mat<A>::type R;
1474 mat_traits<R>::template write_element<0,0>(r)=-mat_traits<A>::template read_element<0,0>(a);
1475 mat_traits<R>::template write_element<0,1>(r)=-mat_traits<A>::template read_element<0,1>(a);
1476 mat_traits<R>::template write_element<0,2>(r)=-mat_traits<A>::template read_element<0,2>(a);
1477 mat_traits<R>::template write_element<1,0>(r)=-mat_traits<A>::template read_element<1,0>(a);
1478 mat_traits<R>::template write_element<1,1>(r)=-mat_traits<A>::template read_element<1,1>(a);
1479 mat_traits<R>::template write_element<1,2>(r)=-mat_traits<A>::template read_element<1,2>(a);
1480 mat_traits<R>::template write_element<2,0>(r)=-mat_traits<A>::template read_element<2,0>(a);
1481 mat_traits<R>::template write_element<2,1>(r)=-mat_traits<A>::template read_element<2,1>(a);
1482 mat_traits<R>::template write_element<2,2>(r)=-mat_traits<A>::template read_element<2,2>(a);
1489 using ::boost::qvm::operator-;
1495 template <int R,int C>
1496 struct minus_m_defined;
1500 minus_m_defined<3,3>
1502 static bool const value=true;
1507 BOOST_QVM_INLINE_OPERATIONS
1508 typename lazy_enable_if_c<
1509 mat_traits<A>::rows==3 && mat_traits<A>::cols==1,
1510 deduce_mat<A> >::type
1511 operator-( A const & a )
1513 typedef typename deduce_mat<A>::type R;
1515 mat_traits<R>::template write_element<0,0>(r)=-mat_traits<A>::template read_element<0,0>(a);
1516 mat_traits<R>::template write_element<1,0>(r)=-mat_traits<A>::template read_element<1,0>(a);
1517 mat_traits<R>::template write_element<2,0>(r)=-mat_traits<A>::template read_element<2,0>(a);
1524 using ::boost::qvm::operator-;
1530 template <int R,int C>
1531 struct minus_m_defined;
1535 minus_m_defined<3,1>
1537 static bool const value=true;
1542 BOOST_QVM_INLINE_OPERATIONS
1543 typename lazy_enable_if_c<
1544 mat_traits<A>::rows==1 && mat_traits<A>::cols==3,
1545 deduce_mat<A> >::type
1546 operator-( A const & a )
1548 typedef typename deduce_mat<A>::type R;
1550 mat_traits<R>::template write_element<0,0>(r)=-mat_traits<A>::template read_element<0,0>(a);
1551 mat_traits<R>::template write_element<0,1>(r)=-mat_traits<A>::template read_element<0,1>(a);
1552 mat_traits<R>::template write_element<0,2>(r)=-mat_traits<A>::template read_element<0,2>(a);
1559 using ::boost::qvm::operator-;
1565 template <int R,int C>
1566 struct minus_m_defined;
1570 minus_m_defined<1,3>
1572 static bool const value=true;
1577 BOOST_QVM_INLINE_OPERATIONS
1578 typename enable_if_c<
1579 mat_traits<A>::rows==3 && mat_traits<A>::cols==3,
1580 typename mat_traits<A>::scalar_type>::type
1581 determinant( A const & a )
1583 typedef typename mat_traits<A>::scalar_type T;
1584 T const a00=mat_traits<A>::template read_element<0,0>(a);
1585 T const a01=mat_traits<A>::template read_element<0,1>(a);
1586 T const a02=mat_traits<A>::template read_element<0,2>(a);
1587 T const a10=mat_traits<A>::template read_element<1,0>(a);
1588 T const a11=mat_traits<A>::template read_element<1,1>(a);
1589 T const a12=mat_traits<A>::template read_element<1,2>(a);
1590 T const a20=mat_traits<A>::template read_element<2,0>(a);
1591 T const a21=mat_traits<A>::template read_element<2,1>(a);
1592 T const a22=mat_traits<A>::template read_element<2,2>(a);
1593 T det=(a00*(a11*a22-a12*a21)-a01*(a10*a22-a12*a20)+a02*(a10*a21-a11*a20));
1600 using ::boost::qvm::determinant;
1607 struct determinant_defined;
1611 determinant_defined<3>
1613 static bool const value=true;
1617 template <class A,class B>
1618 BOOST_QVM_INLINE_OPERATIONS
1619 typename lazy_enable_if_c<
1620 mat_traits<A>::rows==3 && mat_traits<A>::cols==3 && is_scalar<B>::value,
1621 deduce_mat<A> >::type
1622 inverse( A const & a, B det )
1624 typedef typename mat_traits<A>::scalar_type T;
1625 BOOST_QVM_ASSERT(det!=scalar_traits<B>::value(0));
1626 T const a00=mat_traits<A>::template read_element<0,0>(a);
1627 T const a01=mat_traits<A>::template read_element<0,1>(a);
1628 T const a02=mat_traits<A>::template read_element<0,2>(a);
1629 T const a10=mat_traits<A>::template read_element<1,0>(a);
1630 T const a11=mat_traits<A>::template read_element<1,1>(a);
1631 T const a12=mat_traits<A>::template read_element<1,2>(a);
1632 T const a20=mat_traits<A>::template read_element<2,0>(a);
1633 T const a21=mat_traits<A>::template read_element<2,1>(a);
1634 T const a22=mat_traits<A>::template read_element<2,2>(a);
1635 T const f=scalar_traits<T>::value(1)/det;
1636 typedef typename deduce_mat<A>::type R;
1638 mat_traits<R>::template write_element<0,0>(r)= f*(a11*a22-a12*a21);
1639 mat_traits<R>::template write_element<0,1>(r)=-f*(a01*a22-a02*a21);
1640 mat_traits<R>::template write_element<0,2>(r)= f*(a01*a12-a02*a11);
1641 mat_traits<R>::template write_element<1,0>(r)=-f*(a10*a22-a12*a20);
1642 mat_traits<R>::template write_element<1,1>(r)= f*(a00*a22-a02*a20);
1643 mat_traits<R>::template write_element<1,2>(r)=-f*(a00*a12-a02*a10);
1644 mat_traits<R>::template write_element<2,0>(r)= f*(a10*a21-a11*a20);
1645 mat_traits<R>::template write_element<2,1>(r)=-f*(a00*a21-a01*a20);
1646 mat_traits<R>::template write_element<2,2>(r)= f*(a00*a11-a01*a10);
1651 BOOST_QVM_INLINE_OPERATIONS
1652 typename lazy_enable_if_c<
1653 mat_traits<A>::rows==3 && mat_traits<A>::cols==3,
1654 deduce_mat<A> >::type
1655 inverse( A const & a )
1657 typedef typename mat_traits<A>::scalar_type T;
1658 T det=determinant(a);
1659 if( det==scalar_traits<T>::value(0) )
1660 BOOST_QVM_THROW_EXCEPTION(zero_determinant_error());
1661 return inverse(a,det);
1667 using ::boost::qvm::inverse;
1674 struct inverse_m_defined;
1678 inverse_m_defined<3>
1680 static bool const value=true;
1684 template <class A,class B>
1685 BOOST_QVM_INLINE_OPERATIONS
1686 typename lazy_enable_if_c<
1687 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
1688 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
1689 deduce_mat2<A,B,3,3> >::type
1690 operator*( A const & a, B const & b )
1692 typedef typename mat_traits<A>::scalar_type Ta;
1693 typedef typename mat_traits<B>::scalar_type Tb;
1694 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
1695 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
1696 Ta const a02 = mat_traits<A>::template read_element<0,2>(a);
1697 Ta const a10 = mat_traits<A>::template read_element<1,0>(a);
1698 Ta const a11 = mat_traits<A>::template read_element<1,1>(a);
1699 Ta const a12 = mat_traits<A>::template read_element<1,2>(a);
1700 Ta const a20 = mat_traits<A>::template read_element<2,0>(a);
1701 Ta const a21 = mat_traits<A>::template read_element<2,1>(a);
1702 Ta const a22 = mat_traits<A>::template read_element<2,2>(a);
1703 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
1704 Tb const b01 = mat_traits<B>::template read_element<0,1>(b);
1705 Tb const b02 = mat_traits<B>::template read_element<0,2>(b);
1706 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
1707 Tb const b11 = mat_traits<B>::template read_element<1,1>(b);
1708 Tb const b12 = mat_traits<B>::template read_element<1,2>(b);
1709 Tb const b20 = mat_traits<B>::template read_element<2,0>(b);
1710 Tb const b21 = mat_traits<B>::template read_element<2,1>(b);
1711 Tb const b22 = mat_traits<B>::template read_element<2,2>(b);
1712 typedef typename deduce_mat2<A,B,3,3>::type R;
1713 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==3);
1714 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==3);
1716 mat_traits<R>::template write_element<0,0>(r)=a00*b00+a01*b10+a02*b20;
1717 mat_traits<R>::template write_element<0,1>(r)=a00*b01+a01*b11+a02*b21;
1718 mat_traits<R>::template write_element<0,2>(r)=a00*b02+a01*b12+a02*b22;
1719 mat_traits<R>::template write_element<1,0>(r)=a10*b00+a11*b10+a12*b20;
1720 mat_traits<R>::template write_element<1,1>(r)=a10*b01+a11*b11+a12*b21;
1721 mat_traits<R>::template write_element<1,2>(r)=a10*b02+a11*b12+a12*b22;
1722 mat_traits<R>::template write_element<2,0>(r)=a20*b00+a21*b10+a22*b20;
1723 mat_traits<R>::template write_element<2,1>(r)=a20*b01+a21*b11+a22*b21;
1724 mat_traits<R>::template write_element<2,2>(r)=a20*b02+a21*b12+a22*b22;
1731 using ::boost::qvm::operator*;
1737 template <int R,int CR,int C>
1738 struct mul_mm_defined;
1742 mul_mm_defined<3,3,3>
1744 static bool const value=true;
1748 template <class A,class B>
1749 BOOST_QVM_INLINE_OPERATIONS
1750 typename enable_if_c<
1751 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
1752 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
1754 operator*=( A & a, B const & b )
1756 typedef typename mat_traits<A>::scalar_type Ta;
1757 typedef typename mat_traits<B>::scalar_type Tb;
1758 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
1759 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
1760 Ta const a02 = mat_traits<A>::template read_element<0,2>(a);
1761 Ta const a10 = mat_traits<A>::template read_element<1,0>(a);
1762 Ta const a11 = mat_traits<A>::template read_element<1,1>(a);
1763 Ta const a12 = mat_traits<A>::template read_element<1,2>(a);
1764 Ta const a20 = mat_traits<A>::template read_element<2,0>(a);
1765 Ta const a21 = mat_traits<A>::template read_element<2,1>(a);
1766 Ta const a22 = mat_traits<A>::template read_element<2,2>(a);
1767 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
1768 Tb const b01 = mat_traits<B>::template read_element<0,1>(b);
1769 Tb const b02 = mat_traits<B>::template read_element<0,2>(b);
1770 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
1771 Tb const b11 = mat_traits<B>::template read_element<1,1>(b);
1772 Tb const b12 = mat_traits<B>::template read_element<1,2>(b);
1773 Tb const b20 = mat_traits<B>::template read_element<2,0>(b);
1774 Tb const b21 = mat_traits<B>::template read_element<2,1>(b);
1775 Tb const b22 = mat_traits<B>::template read_element<2,2>(b);
1776 mat_traits<A>::template write_element<0,0>(a)=a00*b00+a01*b10+a02*b20;
1777 mat_traits<A>::template write_element<0,1>(a)=a00*b01+a01*b11+a02*b21;
1778 mat_traits<A>::template write_element<0,2>(a)=a00*b02+a01*b12+a02*b22;
1779 mat_traits<A>::template write_element<1,0>(a)=a10*b00+a11*b10+a12*b20;
1780 mat_traits<A>::template write_element<1,1>(a)=a10*b01+a11*b11+a12*b21;
1781 mat_traits<A>::template write_element<1,2>(a)=a10*b02+a11*b12+a12*b22;
1782 mat_traits<A>::template write_element<2,0>(a)=a20*b00+a21*b10+a22*b20;
1783 mat_traits<A>::template write_element<2,1>(a)=a20*b01+a21*b11+a22*b21;
1784 mat_traits<A>::template write_element<2,2>(a)=a20*b02+a21*b12+a22*b22;
1791 using ::boost::qvm::operator*=;
1798 struct mul_eq_mm_defined;
1802 mul_eq_mm_defined<3>
1804 static bool const value=true;
1808 template <class A,class B>
1809 BOOST_QVM_INLINE_OPERATIONS
1810 typename lazy_enable_if_c<
1811 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
1812 mat_traits<A>::cols==3 && mat_traits<B>::cols==1,
1813 deduce_mat2<A,B,3,1> >::type
1814 operator*( A const & a, B const & b )
1816 typedef typename mat_traits<A>::scalar_type Ta;
1817 typedef typename mat_traits<B>::scalar_type Tb;
1818 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
1819 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
1820 Ta const a02 = mat_traits<A>::template read_element<0,2>(a);
1821 Ta const a10 = mat_traits<A>::template read_element<1,0>(a);
1822 Ta const a11 = mat_traits<A>::template read_element<1,1>(a);
1823 Ta const a12 = mat_traits<A>::template read_element<1,2>(a);
1824 Ta const a20 = mat_traits<A>::template read_element<2,0>(a);
1825 Ta const a21 = mat_traits<A>::template read_element<2,1>(a);
1826 Ta const a22 = mat_traits<A>::template read_element<2,2>(a);
1827 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
1828 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
1829 Tb const b20 = mat_traits<B>::template read_element<2,0>(b);
1830 typedef typename deduce_mat2<A,B,3,1>::type R;
1831 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==3);
1832 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==1);
1834 mat_traits<R>::template write_element<0,0>(r)=a00*b00+a01*b10+a02*b20;
1835 mat_traits<R>::template write_element<1,0>(r)=a10*b00+a11*b10+a12*b20;
1836 mat_traits<R>::template write_element<2,0>(r)=a20*b00+a21*b10+a22*b20;
1843 using ::boost::qvm::operator*;
1849 template <int R,int CR,int C>
1850 struct mul_mm_defined;
1854 mul_mm_defined<3,3,1>
1856 static bool const value=true;
1860 template <class A,class B>
1861 BOOST_QVM_INLINE_OPERATIONS
1862 typename lazy_enable_if_c<
1863 mat_traits<A>::rows==1 && mat_traits<B>::rows==3 &&
1864 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
1865 deduce_mat2<A,B,1,3> >::type
1866 operator*( A const & a, B const & b )
1868 typedef typename mat_traits<A>::scalar_type Ta;
1869 typedef typename mat_traits<B>::scalar_type Tb;
1870 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
1871 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
1872 Ta const a02 = mat_traits<A>::template read_element<0,2>(a);
1873 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
1874 Tb const b01 = mat_traits<B>::template read_element<0,1>(b);
1875 Tb const b02 = mat_traits<B>::template read_element<0,2>(b);
1876 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
1877 Tb const b11 = mat_traits<B>::template read_element<1,1>(b);
1878 Tb const b12 = mat_traits<B>::template read_element<1,2>(b);
1879 Tb const b20 = mat_traits<B>::template read_element<2,0>(b);
1880 Tb const b21 = mat_traits<B>::template read_element<2,1>(b);
1881 Tb const b22 = mat_traits<B>::template read_element<2,2>(b);
1882 typedef typename deduce_mat2<A,B,1,3>::type R;
1883 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==1);
1884 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==3);
1886 mat_traits<R>::template write_element<0,0>(r)=a00*b00+a01*b10+a02*b20;
1887 mat_traits<R>::template write_element<0,1>(r)=a00*b01+a01*b11+a02*b21;
1888 mat_traits<R>::template write_element<0,2>(r)=a00*b02+a01*b12+a02*b22;
1895 using ::boost::qvm::operator*;
1901 template <int R,int CR,int C>
1902 struct mul_mm_defined;
1906 mul_mm_defined<1,3,3>
1908 static bool const value=true;