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_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/error.hpp>
15 #include <boost/qvm/gen/mat_assign2.hpp>
16 #include <boost/qvm/throw_exception.hpp>
24 template <class A,class B>
25 BOOST_QVM_INLINE_OPERATIONS
26 typename lazy_enable_if_c<
27 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
28 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
29 deduce_mat2<A,B,2,2> >::type
30 operator+( A const & a, B const & b )
32 typedef typename deduce_mat2<A,B,2,2>::type R;
33 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==2);
34 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==2);
36 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);
37 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);
38 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);
39 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);
46 using ::boost::qvm::operator+;
52 template <int R,int C>
53 struct plus_mm_defined;
59 static bool const value=true;
63 template <class A,class B>
64 BOOST_QVM_INLINE_OPERATIONS
65 typename lazy_enable_if_c<
66 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
67 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
68 deduce_mat2<A,B,2,1> >::type
69 operator+( A const & a, B const & b )
71 typedef typename deduce_mat2<A,B,2,1>::type R;
72 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==2);
73 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==1);
75 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);
76 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);
83 using ::boost::qvm::operator+;
89 template <int R,int C>
90 struct plus_mm_defined;
96 static bool const value=true;
100 template <class A,class B>
101 BOOST_QVM_INLINE_OPERATIONS
102 typename lazy_enable_if_c<
103 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
104 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
105 deduce_mat2<A,B,1,2> >::type
106 operator+( A const & a, B const & b )
108 typedef typename deduce_mat2<A,B,1,2>::type R;
109 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==1);
110 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==2);
112 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);
113 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);
120 using ::boost::qvm::operator+;
126 template <int R,int C>
127 struct plus_mm_defined;
133 static bool const value=true;
137 template <class A,class B>
138 BOOST_QVM_INLINE_OPERATIONS
139 typename lazy_enable_if_c<
140 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
141 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
142 deduce_mat2<A,B,2,2> >::type
143 operator-( A const & a, B const & b )
145 typedef typename deduce_mat2<A,B,2,2>::type R;
146 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==2);
147 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==2);
149 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);
150 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);
151 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);
152 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);
159 using ::boost::qvm::operator-;
165 template <int R,int C>
166 struct minus_mm_defined;
170 minus_mm_defined<2,2>
172 static bool const value=true;
176 template <class A,class B>
177 BOOST_QVM_INLINE_OPERATIONS
178 typename lazy_enable_if_c<
179 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
180 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
181 deduce_mat2<A,B,2,1> >::type
182 operator-( A const & a, B const & b )
184 typedef typename deduce_mat2<A,B,2,1>::type R;
185 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==2);
186 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==1);
188 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);
189 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);
196 using ::boost::qvm::operator-;
202 template <int R,int C>
203 struct minus_mm_defined;
207 minus_mm_defined<2,1>
209 static bool const value=true;
213 template <class A,class B>
214 BOOST_QVM_INLINE_OPERATIONS
215 typename lazy_enable_if_c<
216 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
217 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
218 deduce_mat2<A,B,1,2> >::type
219 operator-( A const & a, B const & b )
221 typedef typename deduce_mat2<A,B,1,2>::type R;
222 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==1);
223 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==2);
225 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);
226 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);
233 using ::boost::qvm::operator-;
239 template <int R,int C>
240 struct minus_mm_defined;
244 minus_mm_defined<1,2>
246 static bool const value=true;
250 template <class A,class B>
251 BOOST_QVM_INLINE_OPERATIONS
252 typename enable_if_c<
253 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
254 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
256 operator+=( A & a, B const & b )
258 mat_traits<A>::template write_element<0,0>(a)+=mat_traits<B>::template read_element<0,0>(b);
259 mat_traits<A>::template write_element<0,1>(a)+=mat_traits<B>::template read_element<0,1>(b);
260 mat_traits<A>::template write_element<1,0>(a)+=mat_traits<B>::template read_element<1,0>(b);
261 mat_traits<A>::template write_element<1,1>(a)+=mat_traits<B>::template read_element<1,1>(b);
268 using ::boost::qvm::operator+=;
274 template <int R,int C>
275 struct plus_eq_mm_defined;
279 plus_eq_mm_defined<2,2>
281 static bool const value=true;
285 template <class A,class B>
286 BOOST_QVM_INLINE_OPERATIONS
287 typename enable_if_c<
288 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
289 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
291 operator+=( A & a, B const & b )
293 mat_traits<A>::template write_element<0,0>(a)+=mat_traits<B>::template read_element<0,0>(b);
294 mat_traits<A>::template write_element<1,0>(a)+=mat_traits<B>::template read_element<1,0>(b);
301 using ::boost::qvm::operator+=;
307 template <int R,int C>
308 struct plus_eq_mm_defined;
312 plus_eq_mm_defined<2,1>
314 static bool const value=true;
318 template <class A,class B>
319 BOOST_QVM_INLINE_OPERATIONS
320 typename enable_if_c<
321 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
322 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
324 operator+=( A & a, B const & b )
326 mat_traits<A>::template write_element<0,0>(a)+=mat_traits<B>::template read_element<0,0>(b);
327 mat_traits<A>::template write_element<0,1>(a)+=mat_traits<B>::template read_element<0,1>(b);
334 using ::boost::qvm::operator+=;
340 template <int R,int C>
341 struct plus_eq_mm_defined;
345 plus_eq_mm_defined<1,2>
347 static bool const value=true;
351 template <class A,class B>
352 BOOST_QVM_INLINE_OPERATIONS
353 typename enable_if_c<
354 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
355 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
357 operator-=( A & a, B const & b )
359 mat_traits<A>::template write_element<0,0>(a)-=mat_traits<B>::template read_element<0,0>(b);
360 mat_traits<A>::template write_element<0,1>(a)-=mat_traits<B>::template read_element<0,1>(b);
361 mat_traits<A>::template write_element<1,0>(a)-=mat_traits<B>::template read_element<1,0>(b);
362 mat_traits<A>::template write_element<1,1>(a)-=mat_traits<B>::template read_element<1,1>(b);
369 using ::boost::qvm::operator-=;
375 template <int R,int C>
376 struct minus_eq_mm_defined;
380 minus_eq_mm_defined<2,2>
382 static bool const value=true;
386 template <class A,class B>
387 BOOST_QVM_INLINE_OPERATIONS
388 typename enable_if_c<
389 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
390 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
392 operator-=( A & a, B const & b )
394 mat_traits<A>::template write_element<0,0>(a)-=mat_traits<B>::template read_element<0,0>(b);
395 mat_traits<A>::template write_element<1,0>(a)-=mat_traits<B>::template read_element<1,0>(b);
402 using ::boost::qvm::operator-=;
408 template <int R,int C>
409 struct minus_eq_mm_defined;
413 minus_eq_mm_defined<2,1>
415 static bool const value=true;
419 template <class A,class B>
420 BOOST_QVM_INLINE_OPERATIONS
421 typename enable_if_c<
422 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
423 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
425 operator-=( A & a, B const & b )
427 mat_traits<A>::template write_element<0,0>(a)-=mat_traits<B>::template read_element<0,0>(b);
428 mat_traits<A>::template write_element<0,1>(a)-=mat_traits<B>::template read_element<0,1>(b);
435 using ::boost::qvm::operator-=;
441 template <int R,int C>
442 struct minus_eq_mm_defined;
446 minus_eq_mm_defined<1,2>
448 static bool const value=true;
452 template <class A,class B>
453 BOOST_QVM_INLINE_OPERATIONS
454 typename lazy_enable_if_c<
455 mat_traits<A>::rows==2 && mat_traits<A>::cols==2 && is_scalar<B>::value,
456 deduce_mat<A> >::type
457 operator*( A const & a, B b )
459 typedef typename deduce_mat<A>::type R;
461 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)*b;
462 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)*b;
463 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)*b;
464 mat_traits<R>::template write_element<1,1>(r)=mat_traits<A>::template read_element<1,1>(a)*b;
471 using ::boost::qvm::operator*;
477 template <int R,int C>
478 struct mul_ms_defined;
484 static bool const value=true;
488 template <class A,class B>
489 BOOST_QVM_INLINE_OPERATIONS
490 typename lazy_enable_if_c<
491 is_scalar<A>::value && mat_traits<B>::rows==2 && mat_traits<B>::cols==2,
492 deduce_mat<B> >::type
493 operator*( A a, B const & b )
495 typedef typename deduce_mat<B>::type R;
497 mat_traits<R>::template write_element<0,0>(r)=a*mat_traits<B>::template read_element<0,0>(b);
498 mat_traits<R>::template write_element<0,1>(r)=a*mat_traits<B>::template read_element<0,1>(b);
499 mat_traits<R>::template write_element<1,0>(r)=a*mat_traits<B>::template read_element<1,0>(b);
500 mat_traits<R>::template write_element<1,1>(r)=a*mat_traits<B>::template read_element<1,1>(b);
507 using ::boost::qvm::operator*;
513 template <int R,int C>
514 struct mul_sm_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==2 && mat_traits<A>::cols==1 && 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<1,0>(r)=mat_traits<A>::template read_element<1,0>(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 lazy_enable_if_c<
561 is_scalar<A>::value && mat_traits<B>::rows==2 && mat_traits<B>::cols==1,
562 deduce_mat<B> >::type
563 operator*( A a, B const & b )
565 typedef typename deduce_mat<B>::type R;
567 mat_traits<R>::template write_element<0,0>(r)=a*mat_traits<B>::template read_element<0,0>(b);
568 mat_traits<R>::template write_element<1,0>(r)=a*mat_traits<B>::template read_element<1,0>(b);
575 using ::boost::qvm::operator*;
581 template <int R,int C>
582 struct mul_sm_defined;
588 static bool const value=true;
592 template <class A,class B>
593 BOOST_QVM_INLINE_OPERATIONS
594 typename lazy_enable_if_c<
595 mat_traits<A>::rows==1 && mat_traits<A>::cols==2 && is_scalar<B>::value,
596 deduce_mat<A> >::type
597 operator*( A const & a, B b )
599 typedef typename deduce_mat<A>::type R;
601 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)*b;
602 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)*b;
609 using ::boost::qvm::operator*;
615 template <int R,int C>
616 struct mul_ms_defined;
622 static bool const value=true;
626 template <class A,class B>
627 BOOST_QVM_INLINE_OPERATIONS
628 typename lazy_enable_if_c<
629 is_scalar<A>::value && mat_traits<B>::rows==1 && mat_traits<B>::cols==2,
630 deduce_mat<B> >::type
631 operator*( A a, B const & b )
633 typedef typename deduce_mat<B>::type R;
635 mat_traits<R>::template write_element<0,0>(r)=a*mat_traits<B>::template read_element<0,0>(b);
636 mat_traits<R>::template write_element<0,1>(r)=a*mat_traits<B>::template read_element<0,1>(b);
643 using ::boost::qvm::operator*;
649 template <int R,int C>
650 struct mul_sm_defined;
656 static bool const value=true;
660 template <class A,class B>
661 BOOST_QVM_INLINE_OPERATIONS
662 typename enable_if_c<
663 mat_traits<A>::rows==2 && mat_traits<A>::cols==2 && is_scalar<B>::value,
665 operator*=( A & a, B b )
667 mat_traits<A>::template write_element<0,0>(a)*=b;
668 mat_traits<A>::template write_element<0,1>(a)*=b;
669 mat_traits<A>::template write_element<1,0>(a)*=b;
670 mat_traits<A>::template write_element<1,1>(a)*=b;
677 using ::boost::qvm::operator*=;
683 template <int R,int C>
684 struct mul_eq_ms_defined;
688 mul_eq_ms_defined<2,2>
690 static bool const value=true;
694 template <class A,class B>
695 BOOST_QVM_INLINE_OPERATIONS
696 typename enable_if_c<
697 mat_traits<A>::rows==2 && mat_traits<A>::cols==1 && is_scalar<B>::value,
699 operator*=( A & a, B b )
701 mat_traits<A>::template write_element<0,0>(a)*=b;
702 mat_traits<A>::template write_element<1,0>(a)*=b;
709 using ::boost::qvm::operator*=;
715 template <int R,int C>
716 struct mul_eq_ms_defined;
720 mul_eq_ms_defined<2,1>
722 static bool const value=true;
726 template <class A,class B>
727 BOOST_QVM_INLINE_OPERATIONS
728 typename enable_if_c<
729 mat_traits<A>::rows==1 && mat_traits<A>::cols==2 && is_scalar<B>::value,
731 operator*=( A & a, B b )
733 mat_traits<A>::template write_element<0,0>(a)*=b;
734 mat_traits<A>::template write_element<0,1>(a)*=b;
741 using ::boost::qvm::operator*=;
747 template <int R,int C>
748 struct mul_eq_ms_defined;
752 mul_eq_ms_defined<1,2>
754 static bool const value=true;
758 template <class A,class B>
759 BOOST_QVM_INLINE_OPERATIONS
760 typename lazy_enable_if_c<
761 mat_traits<A>::rows==2 && mat_traits<A>::cols==2 && is_scalar<B>::value,
762 deduce_mat<A> >::type
763 operator/( A const & a, B b )
765 typedef typename deduce_mat<A>::type R;
767 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)/b;
768 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)/b;
769 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)/b;
770 mat_traits<R>::template write_element<1,1>(r)=mat_traits<A>::template read_element<1,1>(a)/b;
777 using ::boost::qvm::operator/;
783 template <int R,int C>
784 struct div_ms_defined;
790 static bool const value=true;
794 template <class A,class B>
795 BOOST_QVM_INLINE_OPERATIONS
796 typename lazy_enable_if_c<
797 is_scalar<A>::value && mat_traits<B>::rows==2 && mat_traits<B>::cols==2,
798 deduce_mat<B> >::type
799 operator/( A a, B const & b )
801 typedef typename deduce_mat<B>::type R;
803 mat_traits<R>::template write_element<0,0>(r)=a/mat_traits<B>::template read_element<0,0>(b);
804 mat_traits<R>::template write_element<0,1>(r)=a/mat_traits<B>::template read_element<0,1>(b);
805 mat_traits<R>::template write_element<1,0>(r)=a/mat_traits<B>::template read_element<1,0>(b);
806 mat_traits<R>::template write_element<1,1>(r)=a/mat_traits<B>::template read_element<1,1>(b);
813 using ::boost::qvm::operator/;
819 template <int R,int C>
820 struct div_sm_defined;
826 static bool const value=true;
830 template <class A,class B>
831 BOOST_QVM_INLINE_OPERATIONS
832 typename lazy_enable_if_c<
833 mat_traits<A>::rows==2 && mat_traits<A>::cols==1 && is_scalar<B>::value,
834 deduce_mat<A> >::type
835 operator/( A const & a, B b )
837 typedef typename deduce_mat<A>::type R;
839 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)/b;
840 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)/b;
847 using ::boost::qvm::operator/;
853 template <int R,int C>
854 struct div_ms_defined;
860 static bool const value=true;
864 template <class A,class B>
865 BOOST_QVM_INLINE_OPERATIONS
866 typename lazy_enable_if_c<
867 is_scalar<A>::value && mat_traits<B>::rows==2 && mat_traits<B>::cols==1,
868 deduce_mat<B> >::type
869 operator/( A a, B const & b )
871 typedef typename deduce_mat<B>::type R;
873 mat_traits<R>::template write_element<0,0>(r)=a/mat_traits<B>::template read_element<0,0>(b);
874 mat_traits<R>::template write_element<1,0>(r)=a/mat_traits<B>::template read_element<1,0>(b);
881 using ::boost::qvm::operator/;
887 template <int R,int C>
888 struct div_sm_defined;
894 static bool const value=true;
898 template <class A,class B>
899 BOOST_QVM_INLINE_OPERATIONS
900 typename lazy_enable_if_c<
901 mat_traits<A>::rows==1 && mat_traits<A>::cols==2 && is_scalar<B>::value,
902 deduce_mat<A> >::type
903 operator/( A const & a, B b )
905 typedef typename deduce_mat<A>::type R;
907 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)/b;
908 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)/b;
915 using ::boost::qvm::operator/;
921 template <int R,int C>
922 struct div_ms_defined;
928 static bool const value=true;
932 template <class A,class B>
933 BOOST_QVM_INLINE_OPERATIONS
934 typename enable_if_c<
935 mat_traits<A>::rows==2 && mat_traits<A>::cols==2 && is_scalar<B>::value,
937 operator/=( A & a, B b )
939 mat_traits<A>::template write_element<0,0>(a)/=b;
940 mat_traits<A>::template write_element<0,1>(a)/=b;
941 mat_traits<A>::template write_element<1,0>(a)/=b;
942 mat_traits<A>::template write_element<1,1>(a)/=b;
949 using ::boost::qvm::operator/=;
955 template <int R,int C>
956 struct div_eq_ms_defined;
960 div_eq_ms_defined<2,2>
962 static bool const value=true;
966 template <class A,class B>
967 BOOST_QVM_INLINE_OPERATIONS
968 typename enable_if_c<
969 mat_traits<A>::rows==2 && mat_traits<A>::cols==1 && is_scalar<B>::value,
971 operator/=( A & a, B b )
973 mat_traits<A>::template write_element<0,0>(a)/=b;
974 mat_traits<A>::template write_element<1,0>(a)/=b;
981 using ::boost::qvm::operator/=;
987 template <int R,int C>
988 struct div_eq_ms_defined;
992 div_eq_ms_defined<2,1>
994 static bool const value=true;
998 template <class A,class B>
999 BOOST_QVM_INLINE_OPERATIONS
1000 typename enable_if_c<
1001 mat_traits<A>::rows==1 && mat_traits<A>::cols==2 && is_scalar<B>::value,
1003 operator/=( A & a, B b )
1005 mat_traits<A>::template write_element<0,0>(a)/=b;
1006 mat_traits<A>::template write_element<0,1>(a)/=b;
1013 using ::boost::qvm::operator/=;
1019 template <int R,int C>
1020 struct div_eq_ms_defined;
1024 div_eq_ms_defined<1,2>
1026 static bool const value=true;
1030 template <class R,class A>
1031 BOOST_QVM_INLINE_OPERATIONS
1032 typename enable_if_c<
1033 mat_traits<R>::rows==2 && mat_traits<A>::rows==2 &&
1034 mat_traits<R>::cols==2 && mat_traits<A>::cols==2,
1036 convert_to( A const & a )
1039 mat_traits<R>::template write_element<0,0>(r) = mat_traits<A>::template read_element<0,0>(a);
1040 mat_traits<R>::template write_element<0,1>(r) = mat_traits<A>::template read_element<0,1>(a);
1041 mat_traits<R>::template write_element<1,0>(r) = mat_traits<A>::template read_element<1,0>(a);
1042 mat_traits<R>::template write_element<1,1>(r) = mat_traits<A>::template read_element<1,1>(a);
1049 using ::boost::qvm::convert_to;
1055 template <int R,int C>
1056 struct convert_to_m_defined;
1060 convert_to_m_defined<2,2>
1062 static bool const value=true;
1066 template <class R,class A>
1067 BOOST_QVM_INLINE_OPERATIONS
1068 typename enable_if_c<
1069 mat_traits<R>::rows==2 && mat_traits<A>::rows==2 &&
1070 mat_traits<R>::cols==1 && mat_traits<A>::cols==1,
1072 convert_to( A const & a )
1075 mat_traits<R>::template write_element<0,0>(r) = mat_traits<A>::template read_element<0,0>(a);
1076 mat_traits<R>::template write_element<1,0>(r) = mat_traits<A>::template read_element<1,0>(a);
1083 using ::boost::qvm::convert_to;
1089 template <int R,int C>
1090 struct convert_to_m_defined;
1094 convert_to_m_defined<2,1>
1096 static bool const value=true;
1100 template <class R,class A>
1101 BOOST_QVM_INLINE_OPERATIONS
1102 typename enable_if_c<
1103 mat_traits<R>::rows==1 && mat_traits<A>::rows==1 &&
1104 mat_traits<R>::cols==2 && mat_traits<A>::cols==2,
1106 convert_to( A const & a )
1109 mat_traits<R>::template write_element<0,0>(r) = mat_traits<A>::template read_element<0,0>(a);
1110 mat_traits<R>::template write_element<0,1>(r) = mat_traits<A>::template read_element<0,1>(a);
1117 using ::boost::qvm::convert_to;
1123 template <int R,int C>
1124 struct convert_to_m_defined;
1128 convert_to_m_defined<1,2>
1130 static bool const value=true;
1134 template <class A,class B>
1135 BOOST_QVM_INLINE_OPERATIONS
1136 typename enable_if_c<
1137 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
1138 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
1140 operator==( A const & a, B const & b )
1143 mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b) &&
1144 mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b) &&
1145 mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b) &&
1146 mat_traits<A>::template read_element<1,1>(a)==mat_traits<B>::template read_element<1,1>(b);
1152 using ::boost::qvm::operator==;
1158 template <int R,int C>
1159 struct eq_mm_defined;
1165 static bool const value=true;
1169 template <class A,class B>
1170 BOOST_QVM_INLINE_OPERATIONS
1171 typename enable_if_c<
1172 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
1173 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
1175 operator==( A const & a, B const & b )
1178 mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b) &&
1179 mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b);
1185 using ::boost::qvm::operator==;
1191 template <int R,int C>
1192 struct eq_mm_defined;
1198 static bool const value=true;
1202 template <class A,class B>
1203 BOOST_QVM_INLINE_OPERATIONS
1204 typename enable_if_c<
1205 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
1206 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
1208 operator==( A const & a, B const & b )
1211 mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b) &&
1212 mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b);
1218 using ::boost::qvm::operator==;
1224 template <int R,int C>
1225 struct eq_mm_defined;
1231 static bool const value=true;
1235 template <class A,class B>
1236 BOOST_QVM_INLINE_OPERATIONS
1237 typename enable_if_c<
1238 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
1239 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
1241 operator!=( A const & a, B const & b )
1244 !(mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b)) ||
1245 !(mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b)) ||
1246 !(mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b)) ||
1247 !(mat_traits<A>::template read_element<1,1>(a)==mat_traits<B>::template read_element<1,1>(b));
1253 using ::boost::qvm::operator!=;
1259 template <int R,int C>
1260 struct neq_mm_defined;
1266 static bool const value=true;
1270 template <class A,class B>
1271 BOOST_QVM_INLINE_OPERATIONS
1272 typename enable_if_c<
1273 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
1274 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
1276 operator!=( A const & a, B const & b )
1279 !(mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b)) ||
1280 !(mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b));
1286 using ::boost::qvm::operator!=;
1292 template <int R,int C>
1293 struct neq_mm_defined;
1299 static bool const value=true;
1303 template <class A,class B>
1304 BOOST_QVM_INLINE_OPERATIONS
1305 typename enable_if_c<
1306 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
1307 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
1309 operator!=( A const & a, B const & b )
1312 !(mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b)) ||
1313 !(mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b));
1319 using ::boost::qvm::operator!=;
1325 template <int R,int C>
1326 struct neq_mm_defined;
1332 static bool const value=true;
1337 BOOST_QVM_INLINE_OPERATIONS
1338 typename lazy_enable_if_c<
1339 mat_traits<A>::rows==2 && mat_traits<A>::cols==2,
1340 deduce_mat<A> >::type
1341 operator-( A const & a )
1343 typedef typename deduce_mat<A>::type R;
1345 mat_traits<R>::template write_element<0,0>(r)=-mat_traits<A>::template read_element<0,0>(a);
1346 mat_traits<R>::template write_element<0,1>(r)=-mat_traits<A>::template read_element<0,1>(a);
1347 mat_traits<R>::template write_element<1,0>(r)=-mat_traits<A>::template read_element<1,0>(a);
1348 mat_traits<R>::template write_element<1,1>(r)=-mat_traits<A>::template read_element<1,1>(a);
1355 using ::boost::qvm::operator-;
1361 template <int R,int C>
1362 struct minus_m_defined;
1366 minus_m_defined<2,2>
1368 static bool const value=true;
1373 BOOST_QVM_INLINE_OPERATIONS
1374 typename lazy_enable_if_c<
1375 mat_traits<A>::rows==2 && mat_traits<A>::cols==1,
1376 deduce_mat<A> >::type
1377 operator-( A const & a )
1379 typedef typename deduce_mat<A>::type R;
1381 mat_traits<R>::template write_element<0,0>(r)=-mat_traits<A>::template read_element<0,0>(a);
1382 mat_traits<R>::template write_element<1,0>(r)=-mat_traits<A>::template read_element<1,0>(a);
1389 using ::boost::qvm::operator-;
1395 template <int R,int C>
1396 struct minus_m_defined;
1400 minus_m_defined<2,1>
1402 static bool const value=true;
1407 BOOST_QVM_INLINE_OPERATIONS
1408 typename lazy_enable_if_c<
1409 mat_traits<A>::rows==1 && mat_traits<A>::cols==2,
1410 deduce_mat<A> >::type
1411 operator-( A const & a )
1413 typedef typename deduce_mat<A>::type R;
1415 mat_traits<R>::template write_element<0,0>(r)=-mat_traits<A>::template read_element<0,0>(a);
1416 mat_traits<R>::template write_element<0,1>(r)=-mat_traits<A>::template read_element<0,1>(a);
1423 using ::boost::qvm::operator-;
1429 template <int R,int C>
1430 struct minus_m_defined;
1434 minus_m_defined<1,2>
1436 static bool const value=true;
1441 BOOST_QVM_INLINE_OPERATIONS
1442 typename enable_if_c<
1443 mat_traits<A>::rows==2 && mat_traits<A>::cols==2,
1444 typename mat_traits<A>::scalar_type>::type
1445 determinant( A const & a )
1447 typedef typename mat_traits<A>::scalar_type T;
1448 T const a00=mat_traits<A>::template read_element<0,0>(a);
1449 T const a01=mat_traits<A>::template read_element<0,1>(a);
1450 T const a10=mat_traits<A>::template read_element<1,0>(a);
1451 T const a11=mat_traits<A>::template read_element<1,1>(a);
1452 T det=(a00*a11-a01*a10);
1459 using ::boost::qvm::determinant;
1466 struct determinant_defined;
1470 determinant_defined<2>
1472 static bool const value=true;
1476 template <class A,class B>
1477 BOOST_QVM_INLINE_OPERATIONS
1478 typename lazy_enable_if_c<
1479 mat_traits<A>::rows==2 && mat_traits<A>::cols==2 && is_scalar<B>::value,
1480 deduce_mat<A> >::type
1481 inverse( A const & a, B det )
1483 typedef typename mat_traits<A>::scalar_type T;
1484 BOOST_QVM_ASSERT(det!=scalar_traits<B>::value(0));
1485 T const a00=mat_traits<A>::template read_element<0,0>(a);
1486 T const a01=mat_traits<A>::template read_element<0,1>(a);
1487 T const a10=mat_traits<A>::template read_element<1,0>(a);
1488 T const a11=mat_traits<A>::template read_element<1,1>(a);
1489 T const f=scalar_traits<T>::value(1)/det;
1490 typedef typename deduce_mat<A>::type R;
1492 mat_traits<R>::template write_element<0,0>(r)= f*a11;
1493 mat_traits<R>::template write_element<0,1>(r)=-f*a01;
1494 mat_traits<R>::template write_element<1,0>(r)=-f*a10;
1495 mat_traits<R>::template write_element<1,1>(r)= f*a00;
1500 BOOST_QVM_INLINE_OPERATIONS
1501 typename lazy_enable_if_c<
1502 mat_traits<A>::rows==2 && mat_traits<A>::cols==2,
1503 deduce_mat<A> >::type
1504 inverse( A const & a )
1506 typedef typename mat_traits<A>::scalar_type T;
1507 T det=determinant(a);
1508 if( det==scalar_traits<T>::value(0) )
1509 BOOST_QVM_THROW_EXCEPTION(zero_determinant_error());
1510 return inverse(a,det);
1516 using ::boost::qvm::inverse;
1523 struct inverse_m_defined;
1527 inverse_m_defined<2>
1529 static bool const value=true;
1533 template <class A,class B>
1534 BOOST_QVM_INLINE_OPERATIONS
1535 typename lazy_enable_if_c<
1536 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
1537 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
1538 deduce_mat2<A,B,2,2> >::type
1539 operator*( A const & a, B const & b )
1541 typedef typename mat_traits<A>::scalar_type Ta;
1542 typedef typename mat_traits<B>::scalar_type Tb;
1543 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
1544 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
1545 Ta const a10 = mat_traits<A>::template read_element<1,0>(a);
1546 Ta const a11 = mat_traits<A>::template read_element<1,1>(a);
1547 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
1548 Tb const b01 = mat_traits<B>::template read_element<0,1>(b);
1549 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
1550 Tb const b11 = mat_traits<B>::template read_element<1,1>(b);
1551 typedef typename deduce_mat2<A,B,2,2>::type R;
1552 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==2);
1553 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==2);
1555 mat_traits<R>::template write_element<0,0>(r)=a00*b00+a01*b10;
1556 mat_traits<R>::template write_element<0,1>(r)=a00*b01+a01*b11;
1557 mat_traits<R>::template write_element<1,0>(r)=a10*b00+a11*b10;
1558 mat_traits<R>::template write_element<1,1>(r)=a10*b01+a11*b11;
1565 using ::boost::qvm::operator*;
1571 template <int R,int CR,int C>
1572 struct mul_mm_defined;
1576 mul_mm_defined<2,2,2>
1578 static bool const value=true;
1582 template <class A,class B>
1583 BOOST_QVM_INLINE_OPERATIONS
1584 typename enable_if_c<
1585 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
1586 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
1588 operator*=( A & a, B const & b )
1590 typedef typename mat_traits<A>::scalar_type Ta;
1591 typedef typename mat_traits<B>::scalar_type Tb;
1592 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
1593 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
1594 Ta const a10 = mat_traits<A>::template read_element<1,0>(a);
1595 Ta const a11 = mat_traits<A>::template read_element<1,1>(a);
1596 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
1597 Tb const b01 = mat_traits<B>::template read_element<0,1>(b);
1598 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
1599 Tb const b11 = mat_traits<B>::template read_element<1,1>(b);
1600 mat_traits<A>::template write_element<0,0>(a)=a00*b00+a01*b10;
1601 mat_traits<A>::template write_element<0,1>(a)=a00*b01+a01*b11;
1602 mat_traits<A>::template write_element<1,0>(a)=a10*b00+a11*b10;
1603 mat_traits<A>::template write_element<1,1>(a)=a10*b01+a11*b11;
1610 using ::boost::qvm::operator*=;
1617 struct mul_eq_mm_defined;
1621 mul_eq_mm_defined<2>
1623 static bool const value=true;
1627 template <class A,class B>
1628 BOOST_QVM_INLINE_OPERATIONS
1629 typename lazy_enable_if_c<
1630 mat_traits<A>::rows==2 && mat_traits<B>::rows==2 &&
1631 mat_traits<A>::cols==2 && mat_traits<B>::cols==1,
1632 deduce_mat2<A,B,2,1> >::type
1633 operator*( A const & a, B const & b )
1635 typedef typename mat_traits<A>::scalar_type Ta;
1636 typedef typename mat_traits<B>::scalar_type Tb;
1637 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
1638 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
1639 Ta const a10 = mat_traits<A>::template read_element<1,0>(a);
1640 Ta const a11 = mat_traits<A>::template read_element<1,1>(a);
1641 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
1642 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
1643 typedef typename deduce_mat2<A,B,2,1>::type R;
1644 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==2);
1645 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==1);
1647 mat_traits<R>::template write_element<0,0>(r)=a00*b00+a01*b10;
1648 mat_traits<R>::template write_element<1,0>(r)=a10*b00+a11*b10;
1655 using ::boost::qvm::operator*;
1661 template <int R,int CR,int C>
1662 struct mul_mm_defined;
1666 mul_mm_defined<2,2,1>
1668 static bool const value=true;
1672 template <class A,class B>
1673 BOOST_QVM_INLINE_OPERATIONS
1674 typename lazy_enable_if_c<
1675 mat_traits<A>::rows==1 && mat_traits<B>::rows==2 &&
1676 mat_traits<A>::cols==2 && mat_traits<B>::cols==2,
1677 deduce_mat2<A,B,1,2> >::type
1678 operator*( A const & a, B const & b )
1680 typedef typename mat_traits<A>::scalar_type Ta;
1681 typedef typename mat_traits<B>::scalar_type Tb;
1682 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
1683 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
1684 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
1685 Tb const b01 = mat_traits<B>::template read_element<0,1>(b);
1686 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
1687 Tb const b11 = mat_traits<B>::template read_element<1,1>(b);
1688 typedef typename deduce_mat2<A,B,1,2>::type R;
1689 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==1);
1690 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==2);
1692 mat_traits<R>::template write_element<0,0>(r)=a00*b00+a01*b10;
1693 mat_traits<R>::template write_element<0,1>(r)=a00*b01+a01*b11;
1700 using ::boost::qvm::operator*;
1706 template <int R,int CR,int C>
1707 struct mul_mm_defined;
1711 mul_mm_defined<1,2,2>
1713 static bool const value=true;