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_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/enable_if.hpp>
15 #include <boost/qvm/error.hpp>
16 #include <boost/qvm/inline.hpp>
17 #include <boost/qvm/mat_traits.hpp>
18 #include <boost/qvm/quat_traits.hpp>
19 #include <boost/qvm/scalar_traits.hpp>
20 #include <boost/qvm/throw_exception.hpp>
28 template <class A,class B>
29 BOOST_QVM_INLINE_OPERATIONS
30 typename lazy_enable_if_c<
31 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
32 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
33 deduce_mat2<A,B,3,3> >::type
34 operator+( A const & a, B const & b )
36 typedef typename deduce_mat2<A,B,3,3>::type R;
37 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==3);
38 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==3);
40 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);
41 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);
42 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);
43 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);
44 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);
45 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);
46 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);
47 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);
48 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);
55 using ::boost::qvm::operator+;
61 template <int R,int C>
62 struct plus_mm_defined;
68 static bool const value=true;
72 template <class A,class B>
73 BOOST_QVM_INLINE_OPERATIONS
74 typename lazy_enable_if_c<
75 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
76 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
77 deduce_mat2<A,B,3,1> >::type
78 operator+( A const & a, B const & b )
80 typedef typename deduce_mat2<A,B,3,1>::type R;
81 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==3);
82 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==1);
84 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);
85 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);
86 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);
93 using ::boost::qvm::operator+;
99 template <int R,int C>
100 struct plus_mm_defined;
106 static bool const value=true;
110 template <class A,class B>
111 BOOST_QVM_INLINE_OPERATIONS
112 typename lazy_enable_if_c<
113 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
114 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
115 deduce_mat2<A,B,1,3> >::type
116 operator+( A const & a, B const & b )
118 typedef typename deduce_mat2<A,B,1,3>::type R;
119 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==1);
120 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==3);
122 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);
123 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);
124 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);
131 using ::boost::qvm::operator+;
137 template <int R,int C>
138 struct plus_mm_defined;
144 static bool const value=true;
148 template <class A,class B>
149 BOOST_QVM_INLINE_OPERATIONS
150 typename lazy_enable_if_c<
151 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
152 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
153 deduce_mat2<A,B,3,3> >::type
154 operator-( A const & a, B const & b )
156 typedef typename deduce_mat2<A,B,3,3>::type R;
157 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==3);
158 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==3);
160 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);
161 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);
162 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);
163 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);
164 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);
165 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);
166 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);
167 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);
168 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);
175 using ::boost::qvm::operator-;
181 template <int R,int C>
182 struct minus_mm_defined;
186 minus_mm_defined<3,3>
188 static bool const value=true;
192 template <class A,class B>
193 BOOST_QVM_INLINE_OPERATIONS
194 typename lazy_enable_if_c<
195 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
196 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
197 deduce_mat2<A,B,3,1> >::type
198 operator-( A const & a, B const & b )
200 typedef typename deduce_mat2<A,B,3,1>::type R;
201 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==3);
202 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==1);
204 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);
205 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);
206 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);
213 using ::boost::qvm::operator-;
219 template <int R,int C>
220 struct minus_mm_defined;
224 minus_mm_defined<3,1>
226 static bool const value=true;
230 template <class A,class B>
231 BOOST_QVM_INLINE_OPERATIONS
232 typename lazy_enable_if_c<
233 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
234 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
235 deduce_mat2<A,B,1,3> >::type
236 operator-( A const & a, B const & b )
238 typedef typename deduce_mat2<A,B,1,3>::type R;
239 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==1);
240 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==3);
242 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);
243 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);
244 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);
251 using ::boost::qvm::operator-;
257 template <int R,int C>
258 struct minus_mm_defined;
262 minus_mm_defined<1,3>
264 static bool const value=true;
268 template <class A,class B>
269 BOOST_QVM_INLINE_OPERATIONS
270 typename enable_if_c<
271 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
272 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
274 operator+=( A & a, B const & b )
276 mat_traits<A>::template write_element<0,0>(a)+=mat_traits<B>::template read_element<0,0>(b);
277 mat_traits<A>::template write_element<0,1>(a)+=mat_traits<B>::template read_element<0,1>(b);
278 mat_traits<A>::template write_element<0,2>(a)+=mat_traits<B>::template read_element<0,2>(b);
279 mat_traits<A>::template write_element<1,0>(a)+=mat_traits<B>::template read_element<1,0>(b);
280 mat_traits<A>::template write_element<1,1>(a)+=mat_traits<B>::template read_element<1,1>(b);
281 mat_traits<A>::template write_element<1,2>(a)+=mat_traits<B>::template read_element<1,2>(b);
282 mat_traits<A>::template write_element<2,0>(a)+=mat_traits<B>::template read_element<2,0>(b);
283 mat_traits<A>::template write_element<2,1>(a)+=mat_traits<B>::template read_element<2,1>(b);
284 mat_traits<A>::template write_element<2,2>(a)+=mat_traits<B>::template read_element<2,2>(b);
291 using ::boost::qvm::operator+=;
297 template <int R,int C>
298 struct plus_eq_mm_defined;
302 plus_eq_mm_defined<3,3>
304 static bool const value=true;
308 template <class A,class B>
309 BOOST_QVM_INLINE_OPERATIONS
310 typename enable_if_c<
311 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
312 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
314 operator+=( A & a, B const & b )
316 mat_traits<A>::template write_element<0,0>(a)+=mat_traits<B>::template read_element<0,0>(b);
317 mat_traits<A>::template write_element<1,0>(a)+=mat_traits<B>::template read_element<1,0>(b);
318 mat_traits<A>::template write_element<2,0>(a)+=mat_traits<B>::template read_element<2,0>(b);
325 using ::boost::qvm::operator+=;
331 template <int R,int C>
332 struct plus_eq_mm_defined;
336 plus_eq_mm_defined<3,1>
338 static bool const value=true;
342 template <class A,class B>
343 BOOST_QVM_INLINE_OPERATIONS
344 typename enable_if_c<
345 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
346 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
348 operator+=( A & a, B const & b )
350 mat_traits<A>::template write_element<0,0>(a)+=mat_traits<B>::template read_element<0,0>(b);
351 mat_traits<A>::template write_element<0,1>(a)+=mat_traits<B>::template read_element<0,1>(b);
352 mat_traits<A>::template write_element<0,2>(a)+=mat_traits<B>::template read_element<0,2>(b);
359 using ::boost::qvm::operator+=;
365 template <int R,int C>
366 struct plus_eq_mm_defined;
370 plus_eq_mm_defined<1,3>
372 static bool const value=true;
376 template <class A,class B>
377 BOOST_QVM_INLINE_OPERATIONS
378 typename enable_if_c<
379 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
380 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
382 operator-=( A & a, B const & b )
384 mat_traits<A>::template write_element<0,0>(a)-=mat_traits<B>::template read_element<0,0>(b);
385 mat_traits<A>::template write_element<0,1>(a)-=mat_traits<B>::template read_element<0,1>(b);
386 mat_traits<A>::template write_element<0,2>(a)-=mat_traits<B>::template read_element<0,2>(b);
387 mat_traits<A>::template write_element<1,0>(a)-=mat_traits<B>::template read_element<1,0>(b);
388 mat_traits<A>::template write_element<1,1>(a)-=mat_traits<B>::template read_element<1,1>(b);
389 mat_traits<A>::template write_element<1,2>(a)-=mat_traits<B>::template read_element<1,2>(b);
390 mat_traits<A>::template write_element<2,0>(a)-=mat_traits<B>::template read_element<2,0>(b);
391 mat_traits<A>::template write_element<2,1>(a)-=mat_traits<B>::template read_element<2,1>(b);
392 mat_traits<A>::template write_element<2,2>(a)-=mat_traits<B>::template read_element<2,2>(b);
399 using ::boost::qvm::operator-=;
405 template <int R,int C>
406 struct minus_eq_mm_defined;
410 minus_eq_mm_defined<3,3>
412 static bool const value=true;
416 template <class A,class B>
417 BOOST_QVM_INLINE_OPERATIONS
418 typename enable_if_c<
419 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
420 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
422 operator-=( A & a, B const & b )
424 mat_traits<A>::template write_element<0,0>(a)-=mat_traits<B>::template read_element<0,0>(b);
425 mat_traits<A>::template write_element<1,0>(a)-=mat_traits<B>::template read_element<1,0>(b);
426 mat_traits<A>::template write_element<2,0>(a)-=mat_traits<B>::template read_element<2,0>(b);
433 using ::boost::qvm::operator-=;
439 template <int R,int C>
440 struct minus_eq_mm_defined;
444 minus_eq_mm_defined<3,1>
446 static bool const value=true;
450 template <class A,class B>
451 BOOST_QVM_INLINE_OPERATIONS
452 typename enable_if_c<
453 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
454 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
456 operator-=( A & a, B const & b )
458 mat_traits<A>::template write_element<0,0>(a)-=mat_traits<B>::template read_element<0,0>(b);
459 mat_traits<A>::template write_element<0,1>(a)-=mat_traits<B>::template read_element<0,1>(b);
460 mat_traits<A>::template write_element<0,2>(a)-=mat_traits<B>::template read_element<0,2>(b);
467 using ::boost::qvm::operator-=;
473 template <int R,int C>
474 struct minus_eq_mm_defined;
478 minus_eq_mm_defined<1,3>
480 static bool const value=true;
484 template <class A,class B>
485 BOOST_QVM_INLINE_OPERATIONS
486 typename lazy_enable_if_c<
487 mat_traits<A>::rows==3 && mat_traits<A>::cols==3 && is_scalar<B>::value,
488 deduce_mat<A> >::type
489 operator*( A const & a, B b )
491 typedef typename deduce_mat<A>::type R;
493 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)*b;
494 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)*b;
495 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)*b;
496 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)*b;
497 mat_traits<R>::template write_element<1,1>(r)=mat_traits<A>::template read_element<1,1>(a)*b;
498 mat_traits<R>::template write_element<1,2>(r)=mat_traits<A>::template read_element<1,2>(a)*b;
499 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)*b;
500 mat_traits<R>::template write_element<2,1>(r)=mat_traits<A>::template read_element<2,1>(a)*b;
501 mat_traits<R>::template write_element<2,2>(r)=mat_traits<A>::template read_element<2,2>(a)*b;
508 using ::boost::qvm::operator*;
514 template <int R,int C>
515 struct mul_ms_defined;
521 static bool const value=true;
525 template <class A,class B>
526 BOOST_QVM_INLINE_OPERATIONS
527 typename lazy_enable_if_c<
528 mat_traits<A>::rows==3 && mat_traits<A>::cols==1 && is_scalar<B>::value,
529 deduce_mat<A> >::type
530 operator*( A const & a, B b )
532 typedef typename deduce_mat<A>::type R;
534 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)*b;
535 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)*b;
536 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)*b;
543 using ::boost::qvm::operator*;
549 template <int R,int C>
550 struct mul_ms_defined;
556 static bool const value=true;
560 template <class A,class B>
561 BOOST_QVM_INLINE_OPERATIONS
562 typename lazy_enable_if_c<
563 mat_traits<A>::rows==1 && mat_traits<A>::cols==3 && is_scalar<B>::value,
564 deduce_mat<A> >::type
565 operator*( A const & a, B b )
567 typedef typename deduce_mat<A>::type R;
569 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)*b;
570 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)*b;
571 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)*b;
578 using ::boost::qvm::operator*;
584 template <int R,int C>
585 struct mul_ms_defined;
591 static bool const value=true;
595 template <class A,class B>
596 BOOST_QVM_INLINE_OPERATIONS
597 typename enable_if_c<
598 mat_traits<A>::rows==3 && mat_traits<A>::cols==3 && is_scalar<B>::value,
600 operator*=( A & a, B b )
602 mat_traits<A>::template write_element<0,0>(a)*=b;
603 mat_traits<A>::template write_element<0,1>(a)*=b;
604 mat_traits<A>::template write_element<0,2>(a)*=b;
605 mat_traits<A>::template write_element<1,0>(a)*=b;
606 mat_traits<A>::template write_element<1,1>(a)*=b;
607 mat_traits<A>::template write_element<1,2>(a)*=b;
608 mat_traits<A>::template write_element<2,0>(a)*=b;
609 mat_traits<A>::template write_element<2,1>(a)*=b;
610 mat_traits<A>::template write_element<2,2>(a)*=b;
617 using ::boost::qvm::operator*=;
623 template <int R,int C>
624 struct mul_eq_ms_defined;
628 mul_eq_ms_defined<3,3>
630 static bool const value=true;
634 template <class A,class B>
635 BOOST_QVM_INLINE_OPERATIONS
636 typename enable_if_c<
637 mat_traits<A>::rows==3 && mat_traits<A>::cols==1 && is_scalar<B>::value,
639 operator*=( A & a, B b )
641 mat_traits<A>::template write_element<0,0>(a)*=b;
642 mat_traits<A>::template write_element<1,0>(a)*=b;
643 mat_traits<A>::template write_element<2,0>(a)*=b;
650 using ::boost::qvm::operator*=;
656 template <int R,int C>
657 struct mul_eq_ms_defined;
661 mul_eq_ms_defined<3,1>
663 static bool const value=true;
667 template <class A,class B>
668 BOOST_QVM_INLINE_OPERATIONS
669 typename enable_if_c<
670 mat_traits<A>::rows==1 && mat_traits<A>::cols==3 && is_scalar<B>::value,
672 operator*=( A & a, B b )
674 mat_traits<A>::template write_element<0,0>(a)*=b;
675 mat_traits<A>::template write_element<0,1>(a)*=b;
676 mat_traits<A>::template write_element<0,2>(a)*=b;
683 using ::boost::qvm::operator*=;
689 template <int R,int C>
690 struct mul_eq_ms_defined;
694 mul_eq_ms_defined<1,3>
696 static bool const value=true;
700 template <class A,class B>
701 BOOST_QVM_INLINE_OPERATIONS
702 typename lazy_enable_if_c<
703 mat_traits<A>::rows==3 && mat_traits<A>::cols==3 && is_scalar<B>::value,
704 deduce_mat<A> >::type
705 operator/( A const & a, B b )
707 typedef typename deduce_mat<A>::type R;
709 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)/b;
710 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)/b;
711 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)/b;
712 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)/b;
713 mat_traits<R>::template write_element<1,1>(r)=mat_traits<A>::template read_element<1,1>(a)/b;
714 mat_traits<R>::template write_element<1,2>(r)=mat_traits<A>::template read_element<1,2>(a)/b;
715 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)/b;
716 mat_traits<R>::template write_element<2,1>(r)=mat_traits<A>::template read_element<2,1>(a)/b;
717 mat_traits<R>::template write_element<2,2>(r)=mat_traits<A>::template read_element<2,2>(a)/b;
724 using ::boost::qvm::operator/;
730 template <int R,int C>
731 struct div_ms_defined;
737 static bool const value=true;
741 template <class A,class B>
742 BOOST_QVM_INLINE_OPERATIONS
743 typename lazy_enable_if_c<
744 mat_traits<A>::rows==3 && mat_traits<A>::cols==1 && is_scalar<B>::value,
745 deduce_mat<A> >::type
746 operator/( A const & a, B b )
748 typedef typename deduce_mat<A>::type R;
750 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)/b;
751 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)/b;
752 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)/b;
759 using ::boost::qvm::operator/;
765 template <int R,int C>
766 struct div_ms_defined;
772 static bool const value=true;
776 template <class A,class B>
777 BOOST_QVM_INLINE_OPERATIONS
778 typename lazy_enable_if_c<
779 mat_traits<A>::rows==1 && mat_traits<A>::cols==3 && is_scalar<B>::value,
780 deduce_mat<A> >::type
781 operator/( A const & a, B b )
783 typedef typename deduce_mat<A>::type R;
785 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)/b;
786 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)/b;
787 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)/b;
794 using ::boost::qvm::operator/;
800 template <int R,int C>
801 struct div_ms_defined;
807 static bool const value=true;
811 template <class A,class B>
812 BOOST_QVM_INLINE_OPERATIONS
813 typename enable_if_c<
814 mat_traits<A>::rows==3 && mat_traits<A>::cols==3 && is_scalar<B>::value,
816 operator/=( A & a, B b )
818 mat_traits<A>::template write_element<0,0>(a)/=b;
819 mat_traits<A>::template write_element<0,1>(a)/=b;
820 mat_traits<A>::template write_element<0,2>(a)/=b;
821 mat_traits<A>::template write_element<1,0>(a)/=b;
822 mat_traits<A>::template write_element<1,1>(a)/=b;
823 mat_traits<A>::template write_element<1,2>(a)/=b;
824 mat_traits<A>::template write_element<2,0>(a)/=b;
825 mat_traits<A>::template write_element<2,1>(a)/=b;
826 mat_traits<A>::template write_element<2,2>(a)/=b;
833 using ::boost::qvm::operator/=;
839 template <int R,int C>
840 struct div_eq_ms_defined;
844 div_eq_ms_defined<3,3>
846 static bool const value=true;
850 template <class A,class B>
851 BOOST_QVM_INLINE_OPERATIONS
852 typename enable_if_c<
853 mat_traits<A>::rows==3 && mat_traits<A>::cols==1 && is_scalar<B>::value,
855 operator/=( A & a, B b )
857 mat_traits<A>::template write_element<0,0>(a)/=b;
858 mat_traits<A>::template write_element<1,0>(a)/=b;
859 mat_traits<A>::template write_element<2,0>(a)/=b;
866 using ::boost::qvm::operator/=;
872 template <int R,int C>
873 struct div_eq_ms_defined;
877 div_eq_ms_defined<3,1>
879 static bool const value=true;
883 template <class A,class B>
884 BOOST_QVM_INLINE_OPERATIONS
885 typename enable_if_c<
886 mat_traits<A>::rows==1 && mat_traits<A>::cols==3 && is_scalar<B>::value,
888 operator/=( A & a, B b )
890 mat_traits<A>::template write_element<0,0>(a)/=b;
891 mat_traits<A>::template write_element<0,1>(a)/=b;
892 mat_traits<A>::template write_element<0,2>(a)/=b;
899 using ::boost::qvm::operator/=;
905 template <int R,int C>
906 struct div_eq_ms_defined;
910 div_eq_ms_defined<1,3>
912 static bool const value=true;
916 template <class A,class B>
917 BOOST_QVM_INLINE_OPERATIONS
918 typename enable_if_c<
919 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
920 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
922 assign( A & a, B const & b )
924 mat_traits<A>::template write_element<0,0>(a)=mat_traits<B>::template read_element<0,0>(b);
925 mat_traits<A>::template write_element<0,1>(a)=mat_traits<B>::template read_element<0,1>(b);
926 mat_traits<A>::template write_element<0,2>(a)=mat_traits<B>::template read_element<0,2>(b);
927 mat_traits<A>::template write_element<1,0>(a)=mat_traits<B>::template read_element<1,0>(b);
928 mat_traits<A>::template write_element<1,1>(a)=mat_traits<B>::template read_element<1,1>(b);
929 mat_traits<A>::template write_element<1,2>(a)=mat_traits<B>::template read_element<1,2>(b);
930 mat_traits<A>::template write_element<2,0>(a)=mat_traits<B>::template read_element<2,0>(b);
931 mat_traits<A>::template write_element<2,1>(a)=mat_traits<B>::template read_element<2,1>(b);
932 mat_traits<A>::template write_element<2,2>(a)=mat_traits<B>::template read_element<2,2>(b);
939 using ::boost::qvm::assign;
945 template <int R,int C>
946 struct assign_mm_defined;
950 assign_mm_defined<3,3>
952 static bool const value=true;
956 template <class A,class B>
957 BOOST_QVM_INLINE_OPERATIONS
958 typename enable_if_c<
959 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
960 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
962 assign( A & a, B const & b )
964 mat_traits<A>::template write_element<0,0>(a)=mat_traits<B>::template read_element<0,0>(b);
965 mat_traits<A>::template write_element<1,0>(a)=mat_traits<B>::template read_element<1,0>(b);
966 mat_traits<A>::template write_element<2,0>(a)=mat_traits<B>::template read_element<2,0>(b);
973 using ::boost::qvm::assign;
979 template <int R,int C>
980 struct assign_mm_defined;
984 assign_mm_defined<3,1>
986 static bool const value=true;
990 template <class A,class B>
991 BOOST_QVM_INLINE_OPERATIONS
992 typename enable_if_c<
993 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
994 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
996 assign( A & a, B const & b )
998 mat_traits<A>::template write_element<0,0>(a)=mat_traits<B>::template read_element<0,0>(b);
999 mat_traits<A>::template write_element<0,1>(a)=mat_traits<B>::template read_element<0,1>(b);
1000 mat_traits<A>::template write_element<0,2>(a)=mat_traits<B>::template read_element<0,2>(b);
1007 using ::boost::qvm::assign;
1013 template <int R,int C>
1014 struct assign_mm_defined;
1018 assign_mm_defined<1,3>
1020 static bool const value=true;
1024 template <class R,class A>
1025 BOOST_QVM_INLINE_OPERATIONS
1026 typename enable_if_c<
1027 mat_traits<R>::rows==3 && mat_traits<A>::rows==3 &&
1028 mat_traits<R>::cols==3 && mat_traits<A>::cols==3,
1030 convert_to( A const & a )
1033 mat_traits<R>::template write_element<0,0>(r) = mat_traits<A>::template read_element<0,0>(a);
1034 mat_traits<R>::template write_element<0,1>(r) = mat_traits<A>::template read_element<0,1>(a);
1035 mat_traits<R>::template write_element<0,2>(r) = mat_traits<A>::template read_element<0,2>(a);
1036 mat_traits<R>::template write_element<1,0>(r) = mat_traits<A>::template read_element<1,0>(a);
1037 mat_traits<R>::template write_element<1,1>(r) = mat_traits<A>::template read_element<1,1>(a);
1038 mat_traits<R>::template write_element<1,2>(r) = mat_traits<A>::template read_element<1,2>(a);
1039 mat_traits<R>::template write_element<2,0>(r) = mat_traits<A>::template read_element<2,0>(a);
1040 mat_traits<R>::template write_element<2,1>(r) = mat_traits<A>::template read_element<2,1>(a);
1041 mat_traits<R>::template write_element<2,2>(r) = mat_traits<A>::template read_element<2,2>(a);
1045 template <class R,class A>
1047 typename enable_if_c<
1048 is_mat<R>::value && is_quat<A>::value &&
1049 mat_traits<R>::rows==3 && mat_traits<R>::cols==3,
1051 convert_to( A const & q )
1053 typedef typename mat_traits<R>::scalar_type T;
1054 T const a=quat_traits<A>::template read_element<0>(q);
1055 T const b=quat_traits<A>::template read_element<1>(q);
1056 T const c=quat_traits<A>::template read_element<2>(q);
1057 T const d=quat_traits<A>::template read_element<3>(q);
1067 T const one = scalar_traits<T>::value(1);
1068 T const two = one+one;
1070 mat_traits<R>::template write_element<0,0>(r) = one - two*(cc+dd);
1071 mat_traits<R>::template write_element<0,1>(r) = two*(bc-ad);
1072 mat_traits<R>::template write_element<0,2>(r) = two*(bd+ac);
1073 mat_traits<R>::template write_element<1,0>(r) = two*(bc+ad);
1074 mat_traits<R>::template write_element<1,1>(r) = one - two*(bb+dd);
1075 mat_traits<R>::template write_element<1,2>(r) = two*(cd-ab);
1076 mat_traits<R>::template write_element<2,0>(r) = two*(bd-ac);
1077 mat_traits<R>::template write_element<2,1>(r) = two*(cd+ab);
1078 mat_traits<R>::template write_element<2,2>(r) = one - two*(bb+cc);
1085 using ::boost::qvm::convert_to;
1091 template <int R,int C>
1092 struct convert_to_m_defined;
1096 convert_to_m_defined<3,3>
1098 static bool const value=true;
1102 template <class R,class A>
1103 BOOST_QVM_INLINE_OPERATIONS
1104 typename enable_if_c<
1105 mat_traits<R>::rows==3 && mat_traits<A>::rows==3 &&
1106 mat_traits<R>::cols==1 && mat_traits<A>::cols==1,
1108 convert_to( A const & a )
1111 mat_traits<R>::template write_element<0,0>(r) = mat_traits<A>::template read_element<0,0>(a);
1112 mat_traits<R>::template write_element<1,0>(r) = mat_traits<A>::template read_element<1,0>(a);
1113 mat_traits<R>::template write_element<2,0>(r) = mat_traits<A>::template read_element<2,0>(a);
1120 using ::boost::qvm::convert_to;
1126 template <int R,int C>
1127 struct convert_to_m_defined;
1131 convert_to_m_defined<3,1>
1133 static bool const value=true;
1137 template <class R,class A>
1138 BOOST_QVM_INLINE_OPERATIONS
1139 typename enable_if_c<
1140 mat_traits<R>::rows==1 && mat_traits<A>::rows==1 &&
1141 mat_traits<R>::cols==3 && mat_traits<A>::cols==3,
1143 convert_to( A const & a )
1146 mat_traits<R>::template write_element<0,0>(r) = mat_traits<A>::template read_element<0,0>(a);
1147 mat_traits<R>::template write_element<0,1>(r) = mat_traits<A>::template read_element<0,1>(a);
1148 mat_traits<R>::template write_element<0,2>(r) = mat_traits<A>::template read_element<0,2>(a);
1155 using ::boost::qvm::convert_to;
1161 template <int R,int C>
1162 struct convert_to_m_defined;
1166 convert_to_m_defined<1,3>
1168 static bool const value=true;
1172 template <class A,class B>
1173 BOOST_QVM_INLINE_OPERATIONS
1174 typename enable_if_c<
1175 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
1176 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
1178 operator==( A const & a, B const & b )
1181 mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b) &&
1182 mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b) &&
1183 mat_traits<A>::template read_element<0,2>(a)==mat_traits<B>::template read_element<0,2>(b) &&
1184 mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b) &&
1185 mat_traits<A>::template read_element<1,1>(a)==mat_traits<B>::template read_element<1,1>(b) &&
1186 mat_traits<A>::template read_element<1,2>(a)==mat_traits<B>::template read_element<1,2>(b) &&
1187 mat_traits<A>::template read_element<2,0>(a)==mat_traits<B>::template read_element<2,0>(b) &&
1188 mat_traits<A>::template read_element<2,1>(a)==mat_traits<B>::template read_element<2,1>(b) &&
1189 mat_traits<A>::template read_element<2,2>(a)==mat_traits<B>::template read_element<2,2>(b);
1195 using ::boost::qvm::operator==;
1201 template <int R,int C>
1202 struct eq_mm_defined;
1208 static bool const value=true;
1212 template <class A,class B>
1213 BOOST_QVM_INLINE_OPERATIONS
1214 typename enable_if_c<
1215 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
1216 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
1218 operator==( A const & a, B const & b )
1221 mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b) &&
1222 mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b) &&
1223 mat_traits<A>::template read_element<2,0>(a)==mat_traits<B>::template read_element<2,0>(b);
1229 using ::boost::qvm::operator==;
1235 template <int R,int C>
1236 struct eq_mm_defined;
1242 static bool const value=true;
1246 template <class A,class B>
1247 BOOST_QVM_INLINE_OPERATIONS
1248 typename enable_if_c<
1249 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
1250 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
1252 operator==( A const & a, B const & b )
1255 mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b) &&
1256 mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b) &&
1257 mat_traits<A>::template read_element<0,2>(a)==mat_traits<B>::template read_element<0,2>(b);
1263 using ::boost::qvm::operator==;
1269 template <int R,int C>
1270 struct eq_mm_defined;
1276 static bool const value=true;
1280 template <class A,class B>
1281 BOOST_QVM_INLINE_OPERATIONS
1282 typename enable_if_c<
1283 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
1284 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
1286 operator!=( A const & a, B const & b )
1289 !(mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b)) ||
1290 !(mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b)) ||
1291 !(mat_traits<A>::template read_element<0,2>(a)==mat_traits<B>::template read_element<0,2>(b)) ||
1292 !(mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b)) ||
1293 !(mat_traits<A>::template read_element<1,1>(a)==mat_traits<B>::template read_element<1,1>(b)) ||
1294 !(mat_traits<A>::template read_element<1,2>(a)==mat_traits<B>::template read_element<1,2>(b)) ||
1295 !(mat_traits<A>::template read_element<2,0>(a)==mat_traits<B>::template read_element<2,0>(b)) ||
1296 !(mat_traits<A>::template read_element<2,1>(a)==mat_traits<B>::template read_element<2,1>(b)) ||
1297 !(mat_traits<A>::template read_element<2,2>(a)==mat_traits<B>::template read_element<2,2>(b));
1303 using ::boost::qvm::operator!=;
1309 template <int R,int C>
1310 struct neq_mm_defined;
1316 static bool const value=true;
1320 template <class A,class B>
1321 BOOST_QVM_INLINE_OPERATIONS
1322 typename enable_if_c<
1323 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
1324 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
1326 operator!=( A const & a, B const & b )
1329 !(mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b)) ||
1330 !(mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b)) ||
1331 !(mat_traits<A>::template read_element<2,0>(a)==mat_traits<B>::template read_element<2,0>(b));
1337 using ::boost::qvm::operator!=;
1343 template <int R,int C>
1344 struct neq_mm_defined;
1350 static bool const value=true;
1354 template <class A,class B>
1355 BOOST_QVM_INLINE_OPERATIONS
1356 typename enable_if_c<
1357 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
1358 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
1360 operator!=( A const & a, B const & b )
1363 !(mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b)) ||
1364 !(mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b)) ||
1365 !(mat_traits<A>::template read_element<0,2>(a)==mat_traits<B>::template read_element<0,2>(b));
1371 using ::boost::qvm::operator!=;
1377 template <int R,int C>
1378 struct neq_mm_defined;
1384 static bool const value=true;
1389 BOOST_QVM_INLINE_OPERATIONS
1390 typename lazy_enable_if_c<
1391 mat_traits<A>::rows==3 && mat_traits<A>::cols==3,
1392 deduce_mat<A> >::type
1393 operator-( A const & a )
1395 typedef typename deduce_mat<A>::type R;
1397 mat_traits<R>::template write_element<0,0>(r)=-mat_traits<A>::template read_element<0,0>(a);
1398 mat_traits<R>::template write_element<0,1>(r)=-mat_traits<A>::template read_element<0,1>(a);
1399 mat_traits<R>::template write_element<0,2>(r)=-mat_traits<A>::template read_element<0,2>(a);
1400 mat_traits<R>::template write_element<1,0>(r)=-mat_traits<A>::template read_element<1,0>(a);
1401 mat_traits<R>::template write_element<1,1>(r)=-mat_traits<A>::template read_element<1,1>(a);
1402 mat_traits<R>::template write_element<1,2>(r)=-mat_traits<A>::template read_element<1,2>(a);
1403 mat_traits<R>::template write_element<2,0>(r)=-mat_traits<A>::template read_element<2,0>(a);
1404 mat_traits<R>::template write_element<2,1>(r)=-mat_traits<A>::template read_element<2,1>(a);
1405 mat_traits<R>::template write_element<2,2>(r)=-mat_traits<A>::template read_element<2,2>(a);
1412 using ::boost::qvm::operator-;
1418 template <int R,int C>
1419 struct minus_m_defined;
1423 minus_m_defined<3,3>
1425 static bool const value=true;
1430 BOOST_QVM_INLINE_OPERATIONS
1431 typename lazy_enable_if_c<
1432 mat_traits<A>::rows==3 && mat_traits<A>::cols==1,
1433 deduce_mat<A> >::type
1434 operator-( A const & a )
1436 typedef typename deduce_mat<A>::type R;
1438 mat_traits<R>::template write_element<0,0>(r)=-mat_traits<A>::template read_element<0,0>(a);
1439 mat_traits<R>::template write_element<1,0>(r)=-mat_traits<A>::template read_element<1,0>(a);
1440 mat_traits<R>::template write_element<2,0>(r)=-mat_traits<A>::template read_element<2,0>(a);
1447 using ::boost::qvm::operator-;
1453 template <int R,int C>
1454 struct minus_m_defined;
1458 minus_m_defined<3,1>
1460 static bool const value=true;
1465 BOOST_QVM_INLINE_OPERATIONS
1466 typename lazy_enable_if_c<
1467 mat_traits<A>::rows==1 && mat_traits<A>::cols==3,
1468 deduce_mat<A> >::type
1469 operator-( A const & a )
1471 typedef typename deduce_mat<A>::type R;
1473 mat_traits<R>::template write_element<0,0>(r)=-mat_traits<A>::template read_element<0,0>(a);
1474 mat_traits<R>::template write_element<0,1>(r)=-mat_traits<A>::template read_element<0,1>(a);
1475 mat_traits<R>::template write_element<0,2>(r)=-mat_traits<A>::template read_element<0,2>(a);
1482 using ::boost::qvm::operator-;
1488 template <int R,int C>
1489 struct minus_m_defined;
1493 minus_m_defined<1,3>
1495 static bool const value=true;
1500 BOOST_QVM_INLINE_OPERATIONS
1501 typename enable_if_c<
1502 mat_traits<A>::rows==3 && mat_traits<A>::cols==3,
1503 typename mat_traits<A>::scalar_type>::type
1504 determinant( A const & a )
1506 typedef typename mat_traits<A>::scalar_type T;
1507 T const a00=mat_traits<A>::template read_element<0,0>(a);
1508 T const a01=mat_traits<A>::template read_element<0,1>(a);
1509 T const a02=mat_traits<A>::template read_element<0,2>(a);
1510 T const a10=mat_traits<A>::template read_element<1,0>(a);
1511 T const a11=mat_traits<A>::template read_element<1,1>(a);
1512 T const a12=mat_traits<A>::template read_element<1,2>(a);
1513 T const a20=mat_traits<A>::template read_element<2,0>(a);
1514 T const a21=mat_traits<A>::template read_element<2,1>(a);
1515 T const a22=mat_traits<A>::template read_element<2,2>(a);
1516 T det=(a00*(a11*a22-a12*a21)-a01*(a10*a22-a12*a20)+a02*(a10*a21-a11*a20));
1523 using ::boost::qvm::determinant;
1530 struct determinant_defined;
1534 determinant_defined<3>
1536 static bool const value=true;
1540 template <class A,class B>
1541 BOOST_QVM_INLINE_OPERATIONS
1542 typename lazy_enable_if_c<
1543 mat_traits<A>::rows==3 && mat_traits<A>::cols==3 && is_scalar<B>::value,
1544 deduce_mat<A> >::type
1545 inverse( A const & a, B det )
1547 typedef typename mat_traits<A>::scalar_type T;
1548 BOOST_QVM_ASSERT(det!=scalar_traits<B>::value(0));
1549 T const a00=mat_traits<A>::template read_element<0,0>(a);
1550 T const a01=mat_traits<A>::template read_element<0,1>(a);
1551 T const a02=mat_traits<A>::template read_element<0,2>(a);
1552 T const a10=mat_traits<A>::template read_element<1,0>(a);
1553 T const a11=mat_traits<A>::template read_element<1,1>(a);
1554 T const a12=mat_traits<A>::template read_element<1,2>(a);
1555 T const a20=mat_traits<A>::template read_element<2,0>(a);
1556 T const a21=mat_traits<A>::template read_element<2,1>(a);
1557 T const a22=mat_traits<A>::template read_element<2,2>(a);
1558 T const f=scalar_traits<T>::value(1)/det;
1559 typedef typename deduce_mat<A>::type R;
1561 mat_traits<R>::template write_element<0,0>(r)= f*(a11*a22-a12*a21);
1562 mat_traits<R>::template write_element<0,1>(r)=-f*(a01*a22-a02*a21);
1563 mat_traits<R>::template write_element<0,2>(r)= f*(a01*a12-a02*a11);
1564 mat_traits<R>::template write_element<1,0>(r)=-f*(a10*a22-a12*a20);
1565 mat_traits<R>::template write_element<1,1>(r)= f*(a00*a22-a02*a20);
1566 mat_traits<R>::template write_element<1,2>(r)=-f*(a00*a12-a02*a10);
1567 mat_traits<R>::template write_element<2,0>(r)= f*(a10*a21-a11*a20);
1568 mat_traits<R>::template write_element<2,1>(r)=-f*(a00*a21-a01*a20);
1569 mat_traits<R>::template write_element<2,2>(r)= f*(a00*a11-a01*a10);
1574 BOOST_QVM_INLINE_OPERATIONS
1575 typename lazy_enable_if_c<
1576 mat_traits<A>::rows==3 && mat_traits<A>::cols==3,
1577 deduce_mat<A> >::type
1578 inverse( A const & a )
1580 typedef typename mat_traits<A>::scalar_type T;
1581 T det=determinant(a);
1582 if( det==scalar_traits<T>::value(0) )
1583 BOOST_QVM_THROW_EXCEPTION(zero_determinant_error());
1584 return inverse(a,det);
1590 using ::boost::qvm::inverse;
1597 struct inverse_m_defined;
1601 inverse_m_defined<3>
1603 static bool const value=true;
1607 template <class A,class B>
1608 BOOST_QVM_INLINE_OPERATIONS
1609 typename lazy_enable_if_c<
1610 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
1611 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
1612 deduce_mat2<A,B,3,3> >::type
1613 operator*( A const & a, B const & b )
1615 typedef typename mat_traits<A>::scalar_type Ta;
1616 typedef typename mat_traits<B>::scalar_type Tb;
1617 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
1618 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
1619 Ta const a02 = mat_traits<A>::template read_element<0,2>(a);
1620 Ta const a10 = mat_traits<A>::template read_element<1,0>(a);
1621 Ta const a11 = mat_traits<A>::template read_element<1,1>(a);
1622 Ta const a12 = mat_traits<A>::template read_element<1,2>(a);
1623 Ta const a20 = mat_traits<A>::template read_element<2,0>(a);
1624 Ta const a21 = mat_traits<A>::template read_element<2,1>(a);
1625 Ta const a22 = mat_traits<A>::template read_element<2,2>(a);
1626 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
1627 Tb const b01 = mat_traits<B>::template read_element<0,1>(b);
1628 Tb const b02 = mat_traits<B>::template read_element<0,2>(b);
1629 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
1630 Tb const b11 = mat_traits<B>::template read_element<1,1>(b);
1631 Tb const b12 = mat_traits<B>::template read_element<1,2>(b);
1632 Tb const b20 = mat_traits<B>::template read_element<2,0>(b);
1633 Tb const b21 = mat_traits<B>::template read_element<2,1>(b);
1634 Tb const b22 = mat_traits<B>::template read_element<2,2>(b);
1635 typedef typename deduce_mat2<A,B,3,3>::type R;
1636 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==3);
1637 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==3);
1639 mat_traits<R>::template write_element<0,0>(r)=a00*b00+a01*b10+a02*b20;
1640 mat_traits<R>::template write_element<0,1>(r)=a00*b01+a01*b11+a02*b21;
1641 mat_traits<R>::template write_element<0,2>(r)=a00*b02+a01*b12+a02*b22;
1642 mat_traits<R>::template write_element<1,0>(r)=a10*b00+a11*b10+a12*b20;
1643 mat_traits<R>::template write_element<1,1>(r)=a10*b01+a11*b11+a12*b21;
1644 mat_traits<R>::template write_element<1,2>(r)=a10*b02+a11*b12+a12*b22;
1645 mat_traits<R>::template write_element<2,0>(r)=a20*b00+a21*b10+a22*b20;
1646 mat_traits<R>::template write_element<2,1>(r)=a20*b01+a21*b11+a22*b21;
1647 mat_traits<R>::template write_element<2,2>(r)=a20*b02+a21*b12+a22*b22;
1654 using ::boost::qvm::operator*;
1660 template <int R,int CR,int C>
1661 struct mul_mm_defined;
1665 mul_mm_defined<3,3,3>
1667 static bool const value=true;
1671 template <class A,class B>
1672 BOOST_QVM_INLINE_OPERATIONS
1673 typename enable_if_c<
1674 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
1675 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
1677 operator*=( A & a, B const & b )
1679 typedef typename mat_traits<A>::scalar_type Ta;
1680 typedef typename mat_traits<B>::scalar_type Tb;
1681 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
1682 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
1683 Ta const a02 = mat_traits<A>::template read_element<0,2>(a);
1684 Ta const a10 = mat_traits<A>::template read_element<1,0>(a);
1685 Ta const a11 = mat_traits<A>::template read_element<1,1>(a);
1686 Ta const a12 = mat_traits<A>::template read_element<1,2>(a);
1687 Ta const a20 = mat_traits<A>::template read_element<2,0>(a);
1688 Ta const a21 = mat_traits<A>::template read_element<2,1>(a);
1689 Ta const a22 = mat_traits<A>::template read_element<2,2>(a);
1690 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
1691 Tb const b01 = mat_traits<B>::template read_element<0,1>(b);
1692 Tb const b02 = mat_traits<B>::template read_element<0,2>(b);
1693 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
1694 Tb const b11 = mat_traits<B>::template read_element<1,1>(b);
1695 Tb const b12 = mat_traits<B>::template read_element<1,2>(b);
1696 Tb const b20 = mat_traits<B>::template read_element<2,0>(b);
1697 Tb const b21 = mat_traits<B>::template read_element<2,1>(b);
1698 Tb const b22 = mat_traits<B>::template read_element<2,2>(b);
1699 mat_traits<A>::template write_element<0,0>(a)=a00*b00+a01*b10+a02*b20;
1700 mat_traits<A>::template write_element<0,1>(a)=a00*b01+a01*b11+a02*b21;
1701 mat_traits<A>::template write_element<0,2>(a)=a00*b02+a01*b12+a02*b22;
1702 mat_traits<A>::template write_element<1,0>(a)=a10*b00+a11*b10+a12*b20;
1703 mat_traits<A>::template write_element<1,1>(a)=a10*b01+a11*b11+a12*b21;
1704 mat_traits<A>::template write_element<1,2>(a)=a10*b02+a11*b12+a12*b22;
1705 mat_traits<A>::template write_element<2,0>(a)=a20*b00+a21*b10+a22*b20;
1706 mat_traits<A>::template write_element<2,1>(a)=a20*b01+a21*b11+a22*b21;
1707 mat_traits<A>::template write_element<2,2>(a)=a20*b02+a21*b12+a22*b22;
1714 using ::boost::qvm::operator*=;
1721 struct mul_eq_mm_defined;
1725 mul_eq_mm_defined<3>
1727 static bool const value=true;
1731 template <class A,class B>
1732 BOOST_QVM_INLINE_OPERATIONS
1733 typename lazy_enable_if_c<
1734 mat_traits<A>::rows==3 && mat_traits<B>::rows==3 &&
1735 mat_traits<A>::cols==3 && mat_traits<B>::cols==1,
1736 deduce_mat2<A,B,3,1> >::type
1737 operator*( A const & a, B const & b )
1739 typedef typename mat_traits<A>::scalar_type Ta;
1740 typedef typename mat_traits<B>::scalar_type Tb;
1741 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
1742 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
1743 Ta const a02 = mat_traits<A>::template read_element<0,2>(a);
1744 Ta const a10 = mat_traits<A>::template read_element<1,0>(a);
1745 Ta const a11 = mat_traits<A>::template read_element<1,1>(a);
1746 Ta const a12 = mat_traits<A>::template read_element<1,2>(a);
1747 Ta const a20 = mat_traits<A>::template read_element<2,0>(a);
1748 Ta const a21 = mat_traits<A>::template read_element<2,1>(a);
1749 Ta const a22 = mat_traits<A>::template read_element<2,2>(a);
1750 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
1751 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
1752 Tb const b20 = mat_traits<B>::template read_element<2,0>(b);
1753 typedef typename deduce_mat2<A,B,3,1>::type R;
1754 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==3);
1755 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==1);
1757 mat_traits<R>::template write_element<0,0>(r)=a00*b00+a01*b10+a02*b20;
1758 mat_traits<R>::template write_element<1,0>(r)=a10*b00+a11*b10+a12*b20;
1759 mat_traits<R>::template write_element<2,0>(r)=a20*b00+a21*b10+a22*b20;
1766 using ::boost::qvm::operator*;
1772 template <int R,int CR,int C>
1773 struct mul_mm_defined;
1777 mul_mm_defined<3,3,1>
1779 static bool const value=true;
1783 template <class A,class B>
1784 BOOST_QVM_INLINE_OPERATIONS
1785 typename lazy_enable_if_c<
1786 mat_traits<A>::rows==1 && mat_traits<B>::rows==3 &&
1787 mat_traits<A>::cols==3 && mat_traits<B>::cols==3,
1788 deduce_mat2<A,B,1,3> >::type
1789 operator*( A const & a, B const & b )
1791 typedef typename mat_traits<A>::scalar_type Ta;
1792 typedef typename mat_traits<B>::scalar_type Tb;
1793 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
1794 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
1795 Ta const a02 = mat_traits<A>::template read_element<0,2>(a);
1796 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
1797 Tb const b01 = mat_traits<B>::template read_element<0,1>(b);
1798 Tb const b02 = mat_traits<B>::template read_element<0,2>(b);
1799 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
1800 Tb const b11 = mat_traits<B>::template read_element<1,1>(b);
1801 Tb const b12 = mat_traits<B>::template read_element<1,2>(b);
1802 Tb const b20 = mat_traits<B>::template read_element<2,0>(b);
1803 Tb const b21 = mat_traits<B>::template read_element<2,1>(b);
1804 Tb const b22 = mat_traits<B>::template read_element<2,2>(b);
1805 typedef typename deduce_mat2<A,B,1,3>::type R;
1806 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==1);
1807 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==3);
1809 mat_traits<R>::template write_element<0,0>(r)=a00*b00+a01*b10+a02*b20;
1810 mat_traits<R>::template write_element<0,1>(r)=a00*b01+a01*b11+a02*b21;
1811 mat_traits<R>::template write_element<0,2>(r)=a00*b02+a01*b12+a02*b22;
1818 using ::boost::qvm::operator*;
1824 template <int R,int CR,int C>
1825 struct mul_mm_defined;
1829 mul_mm_defined<1,3,3>
1831 static bool const value=true;