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_2923BE84E16CD6AE529049F1F1BBE9EB
7 #define BOOST_QVM_2923BE84E16CD6AE529049F1F1BBE9EB
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/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==2 && mat_traits<B>::rows==2 &&
30 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
31 deduce_mat2<A,B,2,2> >::type
32 operator+( A const & a, B const & b )
34 typedef typename deduce_mat2<A,B,2,2>::type R;
35 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==2);
36 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==2);
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<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)+mat_traits<B>::template read_element<1,0>(b);
41 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);
48 using ::boost::qvm::operator+;
54 template <int R,int C>
55 struct plus_mm_defined;
61 static bool const value=true;
65 template <class A,class B>
66 BOOST_QVM_INLINE_OPERATIONS
67 typename lazy_enable_if_c<
68 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
69 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
70 deduce_mat2<A,B,2,1> >::type
71 operator+( A const & a, B const & b )
73 typedef typename deduce_mat2<A,B,2,1>::type R;
74 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==2);
75 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==1);
77 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);
78 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);
85 using ::boost::qvm::operator+;
91 template <int R,int C>
92 struct plus_mm_defined;
98 static bool const value=true;
102 template <class A,class B>
103 BOOST_QVM_INLINE_OPERATIONS
104 typename lazy_enable_if_c<
105 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
106 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
107 deduce_mat2<A,B,1,2> >::type
108 operator+( A const & a, B const & b )
110 typedef typename deduce_mat2<A,B,1,2>::type R;
111 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==1);
112 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==2);
114 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);
115 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 using ::boost::qvm::operator+;
128 template <int R,int C>
129 struct plus_mm_defined;
135 static bool const value=true;
139 template <class A,class B>
140 BOOST_QVM_INLINE_OPERATIONS
141 typename lazy_enable_if_c<
142 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
143 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
144 deduce_mat2<A,B,2,2> >::type
145 operator-( A const & a, B const & b )
147 typedef typename deduce_mat2<A,B,2,2>::type R;
148 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==2);
149 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==2);
151 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);
152 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);
153 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);
154 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);
161 using ::boost::qvm::operator-;
167 template <int R,int C>
168 struct minus_mm_defined;
172 minus_mm_defined<2,2>
174 static bool const value=true;
178 template <class A,class B>
179 BOOST_QVM_INLINE_OPERATIONS
180 typename lazy_enable_if_c<
181 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
182 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
183 deduce_mat2<A,B,2,1> >::type
184 operator-( A const & a, B const & b )
186 typedef typename deduce_mat2<A,B,2,1>::type R;
187 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==2);
188 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==1);
190 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);
191 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);
198 using ::boost::qvm::operator-;
204 template <int R,int C>
205 struct minus_mm_defined;
209 minus_mm_defined<2,1>
211 static bool const value=true;
215 template <class A,class B>
216 BOOST_QVM_INLINE_OPERATIONS
217 typename lazy_enable_if_c<
218 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
219 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
220 deduce_mat2<A,B,1,2> >::type
221 operator-( A const & a, B const & b )
223 typedef typename deduce_mat2<A,B,1,2>::type R;
224 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==1);
225 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==2);
227 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);
228 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);
235 using ::boost::qvm::operator-;
241 template <int R,int C>
242 struct minus_mm_defined;
246 minus_mm_defined<1,2>
248 static bool const value=true;
252 template <class A,class B>
253 BOOST_QVM_INLINE_OPERATIONS
254 typename enable_if_c<
255 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
256 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
258 operator+=( A & a, B const & b )
260 mat_traits<A>::template write_element<0,0>(a)+=mat_traits<B>::template read_element<0,0>(b);
261 mat_traits<A>::template write_element<0,1>(a)+=mat_traits<B>::template read_element<0,1>(b);
262 mat_traits<A>::template write_element<1,0>(a)+=mat_traits<B>::template read_element<1,0>(b);
263 mat_traits<A>::template write_element<1,1>(a)+=mat_traits<B>::template read_element<1,1>(b);
270 using ::boost::qvm::operator+=;
276 template <int R,int C>
277 struct plus_eq_mm_defined;
281 plus_eq_mm_defined<2,2>
283 static bool const value=true;
287 template <class A,class B>
288 BOOST_QVM_INLINE_OPERATIONS
289 typename enable_if_c<
290 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
291 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
293 operator+=( A & a, B const & b )
295 mat_traits<A>::template write_element<0,0>(a)+=mat_traits<B>::template read_element<0,0>(b);
296 mat_traits<A>::template write_element<1,0>(a)+=mat_traits<B>::template read_element<1,0>(b);
303 using ::boost::qvm::operator+=;
309 template <int R,int C>
310 struct plus_eq_mm_defined;
314 plus_eq_mm_defined<2,1>
316 static bool const value=true;
320 template <class A,class B>
321 BOOST_QVM_INLINE_OPERATIONS
322 typename enable_if_c<
323 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
324 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
326 operator+=( A & a, B const & b )
328 mat_traits<A>::template write_element<0,0>(a)+=mat_traits<B>::template read_element<0,0>(b);
329 mat_traits<A>::template write_element<0,1>(a)+=mat_traits<B>::template read_element<0,1>(b);
336 using ::boost::qvm::operator+=;
342 template <int R,int C>
343 struct plus_eq_mm_defined;
347 plus_eq_mm_defined<1,2>
349 static bool const value=true;
353 template <class A,class B>
354 BOOST_QVM_INLINE_OPERATIONS
355 typename enable_if_c<
356 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
357 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
359 operator-=( A & a, B const & b )
361 mat_traits<A>::template write_element<0,0>(a)-=mat_traits<B>::template read_element<0,0>(b);
362 mat_traits<A>::template write_element<0,1>(a)-=mat_traits<B>::template read_element<0,1>(b);
363 mat_traits<A>::template write_element<1,0>(a)-=mat_traits<B>::template read_element<1,0>(b);
364 mat_traits<A>::template write_element<1,1>(a)-=mat_traits<B>::template read_element<1,1>(b);
371 using ::boost::qvm::operator-=;
377 template <int R,int C>
378 struct minus_eq_mm_defined;
382 minus_eq_mm_defined<2,2>
384 static bool const value=true;
388 template <class A,class B>
389 BOOST_QVM_INLINE_OPERATIONS
390 typename enable_if_c<
391 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
392 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
394 operator-=( A & a, B const & b )
396 mat_traits<A>::template write_element<0,0>(a)-=mat_traits<B>::template read_element<0,0>(b);
397 mat_traits<A>::template write_element<1,0>(a)-=mat_traits<B>::template read_element<1,0>(b);
404 using ::boost::qvm::operator-=;
410 template <int R,int C>
411 struct minus_eq_mm_defined;
415 minus_eq_mm_defined<2,1>
417 static bool const value=true;
421 template <class A,class B>
422 BOOST_QVM_INLINE_OPERATIONS
423 typename enable_if_c<
424 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
425 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
427 operator-=( A & a, B const & b )
429 mat_traits<A>::template write_element<0,0>(a)-=mat_traits<B>::template read_element<0,0>(b);
430 mat_traits<A>::template write_element<0,1>(a)-=mat_traits<B>::template read_element<0,1>(b);
437 using ::boost::qvm::operator-=;
443 template <int R,int C>
444 struct minus_eq_mm_defined;
448 minus_eq_mm_defined<1,2>
450 static bool const value=true;
454 template <class A,class B>
455 BOOST_QVM_INLINE_OPERATIONS
456 typename lazy_enable_if_c<
457 mat_traits<A>::rows==2 && mat_traits<A>::cols==2 && is_scalar<B>::value,
458 deduce_mat<A> >::type
459 operator*( A const & a, B b )
461 typedef typename deduce_mat<A>::type R;
463 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)*b;
464 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)*b;
465 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)*b;
466 mat_traits<R>::template write_element<1,1>(r)=mat_traits<A>::template read_element<1,1>(a)*b;
473 using ::boost::qvm::operator*;
479 template <int R,int C>
480 struct mul_ms_defined;
486 static bool const value=true;
490 template <class A,class B>
491 BOOST_QVM_INLINE_OPERATIONS
492 typename lazy_enable_if_c<
493 mat_traits<A>::rows==2 && mat_traits<A>::cols==1 && is_scalar<B>::value,
494 deduce_mat<A> >::type
495 operator*( A const & a, B b )
497 typedef typename deduce_mat<A>::type R;
499 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)*b;
500 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)*b;
507 using ::boost::qvm::operator*;
513 template <int R,int C>
514 struct mul_ms_defined;
520 static bool const value=true;
524 template <class A,class B>
525 BOOST_QVM_INLINE_OPERATIONS
526 typename lazy_enable_if_c<
527 mat_traits<A>::rows==1 && mat_traits<A>::cols==2 && is_scalar<B>::value,
528 deduce_mat<A> >::type
529 operator*( A const & a, B b )
531 typedef typename deduce_mat<A>::type R;
533 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)*b;
534 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)*b;
541 using ::boost::qvm::operator*;
547 template <int R,int C>
548 struct mul_ms_defined;
554 static bool const value=true;
558 template <class A,class B>
559 BOOST_QVM_INLINE_OPERATIONS
560 typename enable_if_c<
561 mat_traits<A>::rows==2 && mat_traits<A>::cols==2 && is_scalar<B>::value,
563 operator*=( A & a, B b )
565 mat_traits<A>::template write_element<0,0>(a)*=b;
566 mat_traits<A>::template write_element<0,1>(a)*=b;
567 mat_traits<A>::template write_element<1,0>(a)*=b;
568 mat_traits<A>::template write_element<1,1>(a)*=b;
575 using ::boost::qvm::operator*=;
581 template <int R,int C>
582 struct mul_eq_ms_defined;
586 mul_eq_ms_defined<2,2>
588 static bool const value=true;
592 template <class A,class B>
593 BOOST_QVM_INLINE_OPERATIONS
594 typename enable_if_c<
595 mat_traits<A>::rows==2 && mat_traits<A>::cols==1 && is_scalar<B>::value,
597 operator*=( A & a, B b )
599 mat_traits<A>::template write_element<0,0>(a)*=b;
600 mat_traits<A>::template write_element<1,0>(a)*=b;
607 using ::boost::qvm::operator*=;
613 template <int R,int C>
614 struct mul_eq_ms_defined;
618 mul_eq_ms_defined<2,1>
620 static bool const value=true;
624 template <class A,class B>
625 BOOST_QVM_INLINE_OPERATIONS
626 typename enable_if_c<
627 mat_traits<A>::rows==1 && mat_traits<A>::cols==2 && is_scalar<B>::value,
629 operator*=( A & a, B b )
631 mat_traits<A>::template write_element<0,0>(a)*=b;
632 mat_traits<A>::template write_element<0,1>(a)*=b;
639 using ::boost::qvm::operator*=;
645 template <int R,int C>
646 struct mul_eq_ms_defined;
650 mul_eq_ms_defined<1,2>
652 static bool const value=true;
656 template <class A,class B>
657 BOOST_QVM_INLINE_OPERATIONS
658 typename lazy_enable_if_c<
659 mat_traits<A>::rows==2 && mat_traits<A>::cols==2 && is_scalar<B>::value,
660 deduce_mat<A> >::type
661 operator/( A const & a, B b )
663 typedef typename deduce_mat<A>::type R;
665 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)/b;
666 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)/b;
667 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)/b;
668 mat_traits<R>::template write_element<1,1>(r)=mat_traits<A>::template read_element<1,1>(a)/b;
675 using ::boost::qvm::operator/;
681 template <int R,int C>
682 struct div_ms_defined;
688 static bool const value=true;
692 template <class A,class B>
693 BOOST_QVM_INLINE_OPERATIONS
694 typename lazy_enable_if_c<
695 mat_traits<A>::rows==2 && mat_traits<A>::cols==1 && is_scalar<B>::value,
696 deduce_mat<A> >::type
697 operator/( A const & a, B b )
699 typedef typename deduce_mat<A>::type R;
701 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)/b;
702 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)/b;
709 using ::boost::qvm::operator/;
715 template <int R,int C>
716 struct div_ms_defined;
722 static bool const value=true;
726 template <class A,class B>
727 BOOST_QVM_INLINE_OPERATIONS
728 typename lazy_enable_if_c<
729 mat_traits<A>::rows==1 && mat_traits<A>::cols==2 && is_scalar<B>::value,
730 deduce_mat<A> >::type
731 operator/( A const & a, B b )
733 typedef typename deduce_mat<A>::type R;
735 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)/b;
736 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)/b;
743 using ::boost::qvm::operator/;
749 template <int R,int C>
750 struct div_ms_defined;
756 static bool const value=true;
760 template <class A,class B>
761 BOOST_QVM_INLINE_OPERATIONS
762 typename enable_if_c<
763 mat_traits<A>::rows==2 && mat_traits<A>::cols==2 && is_scalar<B>::value,
765 operator/=( A & a, B b )
767 mat_traits<A>::template write_element<0,0>(a)/=b;
768 mat_traits<A>::template write_element<0,1>(a)/=b;
769 mat_traits<A>::template write_element<1,0>(a)/=b;
770 mat_traits<A>::template write_element<1,1>(a)/=b;
777 using ::boost::qvm::operator/=;
783 template <int R,int C>
784 struct div_eq_ms_defined;
788 div_eq_ms_defined<2,2>
790 static bool const value=true;
794 template <class A,class B>
795 BOOST_QVM_INLINE_OPERATIONS
796 typename enable_if_c<
797 mat_traits<A>::rows==2 && mat_traits<A>::cols==1 && is_scalar<B>::value,
799 operator/=( A & a, B b )
801 mat_traits<A>::template write_element<0,0>(a)/=b;
802 mat_traits<A>::template write_element<1,0>(a)/=b;
809 using ::boost::qvm::operator/=;
815 template <int R,int C>
816 struct div_eq_ms_defined;
820 div_eq_ms_defined<2,1>
822 static bool const value=true;
826 template <class A,class B>
827 BOOST_QVM_INLINE_OPERATIONS
828 typename enable_if_c<
829 mat_traits<A>::rows==1 && mat_traits<A>::cols==2 && is_scalar<B>::value,
831 operator/=( A & a, B b )
833 mat_traits<A>::template write_element<0,0>(a)/=b;
834 mat_traits<A>::template write_element<0,1>(a)/=b;
841 using ::boost::qvm::operator/=;
847 template <int R,int C>
848 struct div_eq_ms_defined;
852 div_eq_ms_defined<1,2>
854 static bool const value=true;
858 template <class A,class B>
859 BOOST_QVM_INLINE_OPERATIONS
860 typename enable_if_c<
861 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
862 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
864 assign( A & a, B const & b )
866 mat_traits<A>::template write_element<0,0>(a)=mat_traits<B>::template read_element<0,0>(b);
867 mat_traits<A>::template write_element<0,1>(a)=mat_traits<B>::template read_element<0,1>(b);
868 mat_traits<A>::template write_element<1,0>(a)=mat_traits<B>::template read_element<1,0>(b);
869 mat_traits<A>::template write_element<1,1>(a)=mat_traits<B>::template read_element<1,1>(b);
876 using ::boost::qvm::assign;
882 template <int R,int C>
883 struct assign_mm_defined;
887 assign_mm_defined<2,2>
889 static bool const value=true;
893 template <class A,class B>
894 BOOST_QVM_INLINE_OPERATIONS
895 typename enable_if_c<
896 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
897 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
899 assign( A & a, B const & b )
901 mat_traits<A>::template write_element<0,0>(a)=mat_traits<B>::template read_element<0,0>(b);
902 mat_traits<A>::template write_element<1,0>(a)=mat_traits<B>::template read_element<1,0>(b);
909 using ::boost::qvm::assign;
915 template <int R,int C>
916 struct assign_mm_defined;
920 assign_mm_defined<2,1>
922 static bool const value=true;
926 template <class A,class B>
927 BOOST_QVM_INLINE_OPERATIONS
928 typename enable_if_c<
929 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
930 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
932 assign( A & a, B const & b )
934 mat_traits<A>::template write_element<0,0>(a)=mat_traits<B>::template read_element<0,0>(b);
935 mat_traits<A>::template write_element<0,1>(a)=mat_traits<B>::template read_element<0,1>(b);
942 using ::boost::qvm::assign;
948 template <int R,int C>
949 struct assign_mm_defined;
953 assign_mm_defined<1,2>
955 static bool const value=true;
959 template <class R,class A>
960 BOOST_QVM_INLINE_OPERATIONS
961 typename enable_if_c<
962 mat_traits<R>::rows==2 && mat_traits<A>::rows==2 &&
963 mat_traits<R>::cols==2 && mat_traits<A>::cols==2,
965 convert_to( A const & a )
968 mat_traits<R>::template write_element<0,0>(r) = mat_traits<A>::template read_element<0,0>(a);
969 mat_traits<R>::template write_element<0,1>(r) = mat_traits<A>::template read_element<0,1>(a);
970 mat_traits<R>::template write_element<1,0>(r) = mat_traits<A>::template read_element<1,0>(a);
971 mat_traits<R>::template write_element<1,1>(r) = mat_traits<A>::template read_element<1,1>(a);
978 using ::boost::qvm::convert_to;
984 template <int R,int C>
985 struct convert_to_m_defined;
989 convert_to_m_defined<2,2>
991 static bool const value=true;
995 template <class R,class A>
996 BOOST_QVM_INLINE_OPERATIONS
997 typename enable_if_c<
998 mat_traits<R>::rows==2 && mat_traits<A>::rows==2 &&
999 mat_traits<R>::cols==1 && mat_traits<A>::cols==1,
1001 convert_to( A const & a )
1004 mat_traits<R>::template write_element<0,0>(r) = mat_traits<A>::template read_element<0,0>(a);
1005 mat_traits<R>::template write_element<1,0>(r) = mat_traits<A>::template read_element<1,0>(a);
1012 using ::boost::qvm::convert_to;
1018 template <int R,int C>
1019 struct convert_to_m_defined;
1023 convert_to_m_defined<2,1>
1025 static bool const value=true;
1029 template <class R,class A>
1030 BOOST_QVM_INLINE_OPERATIONS
1031 typename enable_if_c<
1032 mat_traits<R>::rows==1 && mat_traits<A>::rows==1 &&
1033 mat_traits<R>::cols==2 && mat_traits<A>::cols==2,
1035 convert_to( A const & a )
1038 mat_traits<R>::template write_element<0,0>(r) = mat_traits<A>::template read_element<0,0>(a);
1039 mat_traits<R>::template write_element<0,1>(r) = mat_traits<A>::template read_element<0,1>(a);
1046 using ::boost::qvm::convert_to;
1052 template <int R,int C>
1053 struct convert_to_m_defined;
1057 convert_to_m_defined<1,2>
1059 static bool const value=true;
1063 template <class A,class B>
1064 BOOST_QVM_INLINE_OPERATIONS
1065 typename enable_if_c<
1066 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
1067 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
1069 operator==( A const & a, B const & b )
1072 mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b) &&
1073 mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b) &&
1074 mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b) &&
1075 mat_traits<A>::template read_element<1,1>(a)==mat_traits<B>::template read_element<1,1>(b);
1081 using ::boost::qvm::operator==;
1087 template <int R,int C>
1088 struct eq_mm_defined;
1094 static bool const value=true;
1098 template <class A,class B>
1099 BOOST_QVM_INLINE_OPERATIONS
1100 typename enable_if_c<
1101 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
1102 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
1104 operator==( A const & a, B const & b )
1107 mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b) &&
1108 mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b);
1114 using ::boost::qvm::operator==;
1120 template <int R,int C>
1121 struct eq_mm_defined;
1127 static bool const value=true;
1131 template <class A,class B>
1132 BOOST_QVM_INLINE_OPERATIONS
1133 typename enable_if_c<
1134 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
1135 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
1137 operator==( A const & a, B const & b )
1140 mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b) &&
1141 mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b);
1147 using ::boost::qvm::operator==;
1153 template <int R,int C>
1154 struct eq_mm_defined;
1160 static bool const value=true;
1164 template <class A,class B>
1165 BOOST_QVM_INLINE_OPERATIONS
1166 typename enable_if_c<
1167 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
1168 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
1170 operator!=( A const & a, B const & b )
1173 !(mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b)) ||
1174 !(mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b)) ||
1175 !(mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b)) ||
1176 !(mat_traits<A>::template read_element<1,1>(a)==mat_traits<B>::template read_element<1,1>(b));
1182 using ::boost::qvm::operator!=;
1188 template <int R,int C>
1189 struct neq_mm_defined;
1195 static bool const value=true;
1199 template <class A,class B>
1200 BOOST_QVM_INLINE_OPERATIONS
1201 typename enable_if_c<
1202 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
1203 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
1205 operator!=( A const & a, B const & b )
1208 !(mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b)) ||
1209 !(mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b));
1215 using ::boost::qvm::operator!=;
1221 template <int R,int C>
1222 struct neq_mm_defined;
1228 static bool const value=true;
1232 template <class A,class B>
1233 BOOST_QVM_INLINE_OPERATIONS
1234 typename enable_if_c<
1235 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
1236 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
1238 operator!=( A const & a, B const & b )
1241 !(mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b)) ||
1242 !(mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b));
1248 using ::boost::qvm::operator!=;
1254 template <int R,int C>
1255 struct neq_mm_defined;
1261 static bool const value=true;
1266 BOOST_QVM_INLINE_OPERATIONS
1267 typename lazy_enable_if_c<
1268 mat_traits<A>::rows==2 && mat_traits<A>::cols==2,
1269 deduce_mat<A> >::type
1270 operator-( A const & a )
1272 typedef typename deduce_mat<A>::type R;
1274 mat_traits<R>::template write_element<0,0>(r)=-mat_traits<A>::template read_element<0,0>(a);
1275 mat_traits<R>::template write_element<0,1>(r)=-mat_traits<A>::template read_element<0,1>(a);
1276 mat_traits<R>::template write_element<1,0>(r)=-mat_traits<A>::template read_element<1,0>(a);
1277 mat_traits<R>::template write_element<1,1>(r)=-mat_traits<A>::template read_element<1,1>(a);
1284 using ::boost::qvm::operator-;
1290 template <int R,int C>
1291 struct minus_m_defined;
1295 minus_m_defined<2,2>
1297 static bool const value=true;
1302 BOOST_QVM_INLINE_OPERATIONS
1303 typename lazy_enable_if_c<
1304 mat_traits<A>::rows==2 && mat_traits<A>::cols==1,
1305 deduce_mat<A> >::type
1306 operator-( A const & a )
1308 typedef typename deduce_mat<A>::type R;
1310 mat_traits<R>::template write_element<0,0>(r)=-mat_traits<A>::template read_element<0,0>(a);
1311 mat_traits<R>::template write_element<1,0>(r)=-mat_traits<A>::template read_element<1,0>(a);
1318 using ::boost::qvm::operator-;
1324 template <int R,int C>
1325 struct minus_m_defined;
1329 minus_m_defined<2,1>
1331 static bool const value=true;
1336 BOOST_QVM_INLINE_OPERATIONS
1337 typename lazy_enable_if_c<
1338 mat_traits<A>::rows==1 && mat_traits<A>::cols==2,
1339 deduce_mat<A> >::type
1340 operator-( A const & a )
1342 typedef typename deduce_mat<A>::type R;
1344 mat_traits<R>::template write_element<0,0>(r)=-mat_traits<A>::template read_element<0,0>(a);
1345 mat_traits<R>::template write_element<0,1>(r)=-mat_traits<A>::template read_element<0,1>(a);
1352 using ::boost::qvm::operator-;
1358 template <int R,int C>
1359 struct minus_m_defined;
1363 minus_m_defined<1,2>
1365 static bool const value=true;
1370 BOOST_QVM_INLINE_OPERATIONS
1371 typename enable_if_c<
1372 mat_traits<A>::rows==2 && mat_traits<A>::cols==2,
1373 typename mat_traits<A>::scalar_type>::type
1374 determinant( A const & a )
1376 typedef typename mat_traits<A>::scalar_type T;
1377 T const a00=mat_traits<A>::template read_element<0,0>(a);
1378 T const a01=mat_traits<A>::template read_element<0,1>(a);
1379 T const a10=mat_traits<A>::template read_element<1,0>(a);
1380 T const a11=mat_traits<A>::template read_element<1,1>(a);
1381 T det=(a00*a11-a01*a10);
1388 using ::boost::qvm::determinant;
1395 struct determinant_defined;
1399 determinant_defined<2>
1401 static bool const value=true;
1405 template <class A,class B>
1406 BOOST_QVM_INLINE_OPERATIONS
1407 typename lazy_enable_if_c<
1408 mat_traits<A>::rows==2 && mat_traits<A>::cols==2 && is_scalar<B>::value,
1409 deduce_mat<A> >::type
1410 inverse( A const & a, B det )
1412 typedef typename mat_traits<A>::scalar_type T;
1413 BOOST_QVM_ASSERT(det!=scalar_traits<B>::value(0));
1414 T const a00=mat_traits<A>::template read_element<0,0>(a);
1415 T const a01=mat_traits<A>::template read_element<0,1>(a);
1416 T const a10=mat_traits<A>::template read_element<1,0>(a);
1417 T const a11=mat_traits<A>::template read_element<1,1>(a);
1418 T const f=scalar_traits<T>::value(1)/det;
1419 typedef typename deduce_mat<A>::type R;
1421 mat_traits<R>::template write_element<0,0>(r)= f*a11;
1422 mat_traits<R>::template write_element<0,1>(r)=-f*a01;
1423 mat_traits<R>::template write_element<1,0>(r)=-f*a10;
1424 mat_traits<R>::template write_element<1,1>(r)= f*a00;
1429 BOOST_QVM_INLINE_OPERATIONS
1430 typename lazy_enable_if_c<
1431 mat_traits<A>::rows==2 && mat_traits<A>::cols==2,
1432 deduce_mat<A> >::type
1433 inverse( A const & a )
1435 typedef typename mat_traits<A>::scalar_type T;
1436 T det=determinant(a);
1437 if( det==scalar_traits<T>::value(0) )
1438 BOOST_QVM_THROW_EXCEPTION(zero_determinant_error());
1439 return inverse(a,det);
1445 using ::boost::qvm::inverse;
1452 struct inverse_m_defined;
1456 inverse_m_defined<2>
1458 static bool const value=true;
1462 template <class A,class B>
1463 BOOST_QVM_INLINE_OPERATIONS
1464 typename lazy_enable_if_c<
1465 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
1466 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
1467 deduce_mat2<A,B,2,2> >::type
1468 operator*( A const & a, B const & b )
1470 typedef typename mat_traits<A>::scalar_type Ta;
1471 typedef typename mat_traits<B>::scalar_type Tb;
1472 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
1473 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
1474 Ta const a10 = mat_traits<A>::template read_element<1,0>(a);
1475 Ta const a11 = mat_traits<A>::template read_element<1,1>(a);
1476 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
1477 Tb const b01 = mat_traits<B>::template read_element<0,1>(b);
1478 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
1479 Tb const b11 = mat_traits<B>::template read_element<1,1>(b);
1480 typedef typename deduce_mat2<A,B,2,2>::type R;
1481 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==2);
1482 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==2);
1484 mat_traits<R>::template write_element<0,0>(r)=a00*b00+a01*b10;
1485 mat_traits<R>::template write_element<0,1>(r)=a00*b01+a01*b11;
1486 mat_traits<R>::template write_element<1,0>(r)=a10*b00+a11*b10;
1487 mat_traits<R>::template write_element<1,1>(r)=a10*b01+a11*b11;
1494 using ::boost::qvm::operator*;
1500 template <int R,int CR,int C>
1501 struct mul_mm_defined;
1505 mul_mm_defined<2,2,2>
1507 static bool const value=true;
1511 template <class A,class B>
1512 BOOST_QVM_INLINE_OPERATIONS
1513 typename enable_if_c<
1514 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
1515 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
1517 operator*=( A & a, B const & b )
1519 typedef typename mat_traits<A>::scalar_type Ta;
1520 typedef typename mat_traits<B>::scalar_type Tb;
1521 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
1522 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
1523 Ta const a10 = mat_traits<A>::template read_element<1,0>(a);
1524 Ta const a11 = mat_traits<A>::template read_element<1,1>(a);
1525 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
1526 Tb const b01 = mat_traits<B>::template read_element<0,1>(b);
1527 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
1528 Tb const b11 = mat_traits<B>::template read_element<1,1>(b);
1529 mat_traits<A>::template write_element<0,0>(a)=a00*b00+a01*b10;
1530 mat_traits<A>::template write_element<0,1>(a)=a00*b01+a01*b11;
1531 mat_traits<A>::template write_element<1,0>(a)=a10*b00+a11*b10;
1532 mat_traits<A>::template write_element<1,1>(a)=a10*b01+a11*b11;
1539 using ::boost::qvm::operator*=;
1546 struct mul_eq_mm_defined;
1550 mul_eq_mm_defined<2>
1552 static bool const value=true;
1556 template <class A,class B>
1557 BOOST_QVM_INLINE_OPERATIONS
1558 typename lazy_enable_if_c<
1559 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
1560 mat_traits<A>::cols==2 && mat_traits<B>::cols==1,
1561 deduce_mat2<A,B,2,1> >::type
1562 operator*( A const & a, B const & b )
1564 typedef typename mat_traits<A>::scalar_type Ta;
1565 typedef typename mat_traits<B>::scalar_type Tb;
1566 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
1567 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
1568 Ta const a10 = mat_traits<A>::template read_element<1,0>(a);
1569 Ta const a11 = mat_traits<A>::template read_element<1,1>(a);
1570 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
1571 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
1572 typedef typename deduce_mat2<A,B,2,1>::type R;
1573 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==2);
1574 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==1);
1576 mat_traits<R>::template write_element<0,0>(r)=a00*b00+a01*b10;
1577 mat_traits<R>::template write_element<1,0>(r)=a10*b00+a11*b10;
1584 using ::boost::qvm::operator*;
1590 template <int R,int CR,int C>
1591 struct mul_mm_defined;
1595 mul_mm_defined<2,2,1>
1597 static bool const value=true;
1601 template <class A,class B>
1602 BOOST_QVM_INLINE_OPERATIONS
1603 typename lazy_enable_if_c<
1604 mat_traits<A>::rows==1 && mat_traits<B>::rows==2 &&
1605 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
1606 deduce_mat2<A,B,1,2> >::type
1607 operator*( A const & a, B const & b )
1609 typedef typename mat_traits<A>::scalar_type Ta;
1610 typedef typename mat_traits<B>::scalar_type Tb;
1611 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
1612 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
1613 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
1614 Tb const b01 = mat_traits<B>::template read_element<0,1>(b);
1615 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
1616 Tb const b11 = mat_traits<B>::template read_element<1,1>(b);
1617 typedef typename deduce_mat2<A,B,1,2>::type R;
1618 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==1);
1619 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==2);
1621 mat_traits<R>::template write_element<0,0>(r)=a00*b00+a01*b10;
1622 mat_traits<R>::template write_element<0,1>(r)=a00*b01+a01*b11;
1629 using ::boost::qvm::operator*;
1635 template <int R,int CR,int C>
1636 struct mul_mm_defined;
1640 mul_mm_defined<1,2,2>
1642 static bool const value=true;