1 //Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc.
2 
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)
5 
6 #ifndef BOOST_QVM_2923BE84E16CD6AE529049F1F1BBE9EB
7 #define BOOST_QVM_2923BE84E16CD6AE529049F1F1BBE9EB
8 
9 //This file was generated by a program. Do not edit manually.
10 
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>
19 
20 namespace
21 boost
22     {
23     namespace
24     qvm
25         {
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
operator +(A const & a,B const & b)32         operator+( A const & a, B const & b )
33             {
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);
37             R r;
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);
42             return r;
43             }
44 
45         namespace
46         sfinae
47             {
48             using ::boost::qvm::operator+;
49             }
50 
51         namespace
52         qvm_detail
53             {
54             template <int R,int C>
55             struct plus_mm_defined;
56 
57             template <>
58             struct
59             plus_mm_defined<2,2>
60                 {
61                 static bool const value=true;
62                 };
63             }
64 
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
operator +(A const & a,B const & b)71         operator+( A const & a, B const & b )
72             {
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);
76             R r;
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);
79             return r;
80             }
81 
82         namespace
83         sfinae
84             {
85             using ::boost::qvm::operator+;
86             }
87 
88         namespace
89         qvm_detail
90             {
91             template <int R,int C>
92             struct plus_mm_defined;
93 
94             template <>
95             struct
96             plus_mm_defined<2,1>
97                 {
98                 static bool const value=true;
99                 };
100             }
101 
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
operator +(A const & a,B const & b)108         operator+( A const & a, B const & b )
109             {
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);
113             R r;
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);
116             return r;
117             }
118 
119         namespace
120         sfinae
121             {
122             using ::boost::qvm::operator+;
123             }
124 
125         namespace
126         qvm_detail
127             {
128             template <int R,int C>
129             struct plus_mm_defined;
130 
131             template <>
132             struct
133             plus_mm_defined<1,2>
134                 {
135                 static bool const value=true;
136                 };
137             }
138 
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
operator -(A const & a,B const & b)145         operator-( A const & a, B const & b )
146             {
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);
150             R r;
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);
155             return r;
156             }
157 
158         namespace
159         sfinae
160             {
161             using ::boost::qvm::operator-;
162             }
163 
164         namespace
165         qvm_detail
166             {
167             template <int R,int C>
168             struct minus_mm_defined;
169 
170             template <>
171             struct
172             minus_mm_defined<2,2>
173                 {
174                 static bool const value=true;
175                 };
176             }
177 
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
operator -(A const & a,B const & b)184         operator-( A const & a, B const & b )
185             {
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);
189             R r;
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);
192             return r;
193             }
194 
195         namespace
196         sfinae
197             {
198             using ::boost::qvm::operator-;
199             }
200 
201         namespace
202         qvm_detail
203             {
204             template <int R,int C>
205             struct minus_mm_defined;
206 
207             template <>
208             struct
209             minus_mm_defined<2,1>
210                 {
211                 static bool const value=true;
212                 };
213             }
214 
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
operator -(A const & a,B const & b)221         operator-( A const & a, B const & b )
222             {
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);
226             R r;
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);
229             return r;
230             }
231 
232         namespace
233         sfinae
234             {
235             using ::boost::qvm::operator-;
236             }
237 
238         namespace
239         qvm_detail
240             {
241             template <int R,int C>
242             struct minus_mm_defined;
243 
244             template <>
245             struct
246             minus_mm_defined<1,2>
247                 {
248                 static bool const value=true;
249                 };
250             }
251 
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,
257             A &>::type
operator +=(A & a,B const & b)258         operator+=( A & a, B const & b )
259             {
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);
264             return a;
265             }
266 
267         namespace
268         sfinae
269             {
270             using ::boost::qvm::operator+=;
271             }
272 
273         namespace
274         qvm_detail
275             {
276             template <int R,int C>
277             struct plus_eq_mm_defined;
278 
279             template <>
280             struct
281             plus_eq_mm_defined<2,2>
282                 {
283                 static bool const value=true;
284                 };
285             }
286 
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,
292             A &>::type
operator +=(A & a,B const & b)293         operator+=( A & a, B const & b )
294             {
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);
297             return a;
298             }
299 
300         namespace
301         sfinae
302             {
303             using ::boost::qvm::operator+=;
304             }
305 
306         namespace
307         qvm_detail
308             {
309             template <int R,int C>
310             struct plus_eq_mm_defined;
311 
312             template <>
313             struct
314             plus_eq_mm_defined<2,1>
315                 {
316                 static bool const value=true;
317                 };
318             }
319 
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,
325             A &>::type
operator +=(A & a,B const & b)326         operator+=( A & a, B const & b )
327             {
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);
330             return a;
331             }
332 
333         namespace
334         sfinae
335             {
336             using ::boost::qvm::operator+=;
337             }
338 
339         namespace
340         qvm_detail
341             {
342             template <int R,int C>
343             struct plus_eq_mm_defined;
344 
345             template <>
346             struct
347             plus_eq_mm_defined<1,2>
348                 {
349                 static bool const value=true;
350                 };
351             }
352 
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,
358             A &>::type
operator -=(A & a,B const & b)359         operator-=( A & a, B const & b )
360             {
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);
365             return a;
366             }
367 
368         namespace
369         sfinae
370             {
371             using ::boost::qvm::operator-=;
372             }
373 
374         namespace
375         qvm_detail
376             {
377             template <int R,int C>
378             struct minus_eq_mm_defined;
379 
380             template <>
381             struct
382             minus_eq_mm_defined<2,2>
383                 {
384                 static bool const value=true;
385                 };
386             }
387 
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,
393             A &>::type
operator -=(A & a,B const & b)394         operator-=( A & a, B const & b )
395             {
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);
398             return a;
399             }
400 
401         namespace
402         sfinae
403             {
404             using ::boost::qvm::operator-=;
405             }
406 
407         namespace
408         qvm_detail
409             {
410             template <int R,int C>
411             struct minus_eq_mm_defined;
412 
413             template <>
414             struct
415             minus_eq_mm_defined<2,1>
416                 {
417                 static bool const value=true;
418                 };
419             }
420 
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,
426             A &>::type
operator -=(A & a,B const & b)427         operator-=( A & a, B const & b )
428             {
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);
431             return a;
432             }
433 
434         namespace
435         sfinae
436             {
437             using ::boost::qvm::operator-=;
438             }
439 
440         namespace
441         qvm_detail
442             {
443             template <int R,int C>
444             struct minus_eq_mm_defined;
445 
446             template <>
447             struct
448             minus_eq_mm_defined<1,2>
449                 {
450                 static bool const value=true;
451                 };
452             }
453 
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
operator *(A const & a,B b)459         operator*( A const & a, B b )
460             {
461             typedef typename deduce_mat<A>::type R;
462             R 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;
467             return r;
468             }
469 
470         namespace
471         sfinae
472             {
473             using ::boost::qvm::operator*;
474             }
475 
476         namespace
477         qvm_detail
478             {
479             template <int R,int C>
480             struct mul_ms_defined;
481 
482             template <>
483             struct
484             mul_ms_defined<2,2>
485                 {
486                 static bool const value=true;
487                 };
488             }
489 
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
operator *(A const & a,B b)495         operator*( A const & a, B b )
496             {
497             typedef typename deduce_mat<A>::type R;
498             R 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;
501             return r;
502             }
503 
504         namespace
505         sfinae
506             {
507             using ::boost::qvm::operator*;
508             }
509 
510         namespace
511         qvm_detail
512             {
513             template <int R,int C>
514             struct mul_ms_defined;
515 
516             template <>
517             struct
518             mul_ms_defined<2,1>
519                 {
520                 static bool const value=true;
521                 };
522             }
523 
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
operator *(A const & a,B b)529         operator*( A const & a, B b )
530             {
531             typedef typename deduce_mat<A>::type R;
532             R 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;
535             return r;
536             }
537 
538         namespace
539         sfinae
540             {
541             using ::boost::qvm::operator*;
542             }
543 
544         namespace
545         qvm_detail
546             {
547             template <int R,int C>
548             struct mul_ms_defined;
549 
550             template <>
551             struct
552             mul_ms_defined<1,2>
553                 {
554                 static bool const value=true;
555                 };
556             }
557 
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,
562             A &>::type
operator *=(A & a,B b)563         operator*=( A & a, B b )
564             {
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;
569             return a;
570             }
571 
572         namespace
573         sfinae
574             {
575             using ::boost::qvm::operator*=;
576             }
577 
578         namespace
579         qvm_detail
580             {
581             template <int R,int C>
582             struct mul_eq_ms_defined;
583 
584             template <>
585             struct
586             mul_eq_ms_defined<2,2>
587                 {
588                 static bool const value=true;
589                 };
590             }
591 
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,
596             A &>::type
operator *=(A & a,B b)597         operator*=( A & a, B b )
598             {
599             mat_traits<A>::template write_element<0,0>(a)*=b;
600             mat_traits<A>::template write_element<1,0>(a)*=b;
601             return a;
602             }
603 
604         namespace
605         sfinae
606             {
607             using ::boost::qvm::operator*=;
608             }
609 
610         namespace
611         qvm_detail
612             {
613             template <int R,int C>
614             struct mul_eq_ms_defined;
615 
616             template <>
617             struct
618             mul_eq_ms_defined<2,1>
619                 {
620                 static bool const value=true;
621                 };
622             }
623 
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,
628             A &>::type
operator *=(A & a,B b)629         operator*=( A & a, B b )
630             {
631             mat_traits<A>::template write_element<0,0>(a)*=b;
632             mat_traits<A>::template write_element<0,1>(a)*=b;
633             return a;
634             }
635 
636         namespace
637         sfinae
638             {
639             using ::boost::qvm::operator*=;
640             }
641 
642         namespace
643         qvm_detail
644             {
645             template <int R,int C>
646             struct mul_eq_ms_defined;
647 
648             template <>
649             struct
650             mul_eq_ms_defined<1,2>
651                 {
652                 static bool const value=true;
653                 };
654             }
655 
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
operator /(A const & a,B b)661         operator/( A const & a, B b )
662             {
663             typedef typename deduce_mat<A>::type R;
664             R 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;
669             return r;
670             }
671 
672         namespace
673         sfinae
674             {
675             using ::boost::qvm::operator/;
676             }
677 
678         namespace
679         qvm_detail
680             {
681             template <int R,int C>
682             struct div_ms_defined;
683 
684             template <>
685             struct
686             div_ms_defined<2,2>
687                 {
688                 static bool const value=true;
689                 };
690             }
691 
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
operator /(A const & a,B b)697         operator/( A const & a, B b )
698             {
699             typedef typename deduce_mat<A>::type R;
700             R 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;
703             return r;
704             }
705 
706         namespace
707         sfinae
708             {
709             using ::boost::qvm::operator/;
710             }
711 
712         namespace
713         qvm_detail
714             {
715             template <int R,int C>
716             struct div_ms_defined;
717 
718             template <>
719             struct
720             div_ms_defined<2,1>
721                 {
722                 static bool const value=true;
723                 };
724             }
725 
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
operator /(A const & a,B b)731         operator/( A const & a, B b )
732             {
733             typedef typename deduce_mat<A>::type R;
734             R 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;
737             return r;
738             }
739 
740         namespace
741         sfinae
742             {
743             using ::boost::qvm::operator/;
744             }
745 
746         namespace
747         qvm_detail
748             {
749             template <int R,int C>
750             struct div_ms_defined;
751 
752             template <>
753             struct
754             div_ms_defined<1,2>
755                 {
756                 static bool const value=true;
757                 };
758             }
759 
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,
764             A &>::type
operator /=(A & a,B b)765         operator/=( A & a, B b )
766             {
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;
771             return a;
772             }
773 
774         namespace
775         sfinae
776             {
777             using ::boost::qvm::operator/=;
778             }
779 
780         namespace
781         qvm_detail
782             {
783             template <int R,int C>
784             struct div_eq_ms_defined;
785 
786             template <>
787             struct
788             div_eq_ms_defined<2,2>
789                 {
790                 static bool const value=true;
791                 };
792             }
793 
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,
798             A &>::type
operator /=(A & a,B b)799         operator/=( A & a, B b )
800             {
801             mat_traits<A>::template write_element<0,0>(a)/=b;
802             mat_traits<A>::template write_element<1,0>(a)/=b;
803             return a;
804             }
805 
806         namespace
807         sfinae
808             {
809             using ::boost::qvm::operator/=;
810             }
811 
812         namespace
813         qvm_detail
814             {
815             template <int R,int C>
816             struct div_eq_ms_defined;
817 
818             template <>
819             struct
820             div_eq_ms_defined<2,1>
821                 {
822                 static bool const value=true;
823                 };
824             }
825 
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,
830             A &>::type
operator /=(A & a,B b)831         operator/=( A & a, B b )
832             {
833             mat_traits<A>::template write_element<0,0>(a)/=b;
834             mat_traits<A>::template write_element<0,1>(a)/=b;
835             return a;
836             }
837 
838         namespace
839         sfinae
840             {
841             using ::boost::qvm::operator/=;
842             }
843 
844         namespace
845         qvm_detail
846             {
847             template <int R,int C>
848             struct div_eq_ms_defined;
849 
850             template <>
851             struct
852             div_eq_ms_defined<1,2>
853                 {
854                 static bool const value=true;
855                 };
856             }
857 
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,
863             A &>::type
assign(A & a,B const & b)864         assign( A & a, B const & b )
865             {
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);
870             return a;
871             }
872 
873         namespace
874         sfinae
875             {
876             using ::boost::qvm::assign;
877             }
878 
879         namespace
880         qvm_detail
881             {
882             template <int R,int C>
883             struct assign_mm_defined;
884 
885             template <>
886             struct
887             assign_mm_defined<2,2>
888                 {
889                 static bool const value=true;
890                 };
891             }
892 
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,
898             A &>::type
assign(A & a,B const & b)899         assign( A & a, B const & b )
900             {
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);
903             return a;
904             }
905 
906         namespace
907         sfinae
908             {
909             using ::boost::qvm::assign;
910             }
911 
912         namespace
913         qvm_detail
914             {
915             template <int R,int C>
916             struct assign_mm_defined;
917 
918             template <>
919             struct
920             assign_mm_defined<2,1>
921                 {
922                 static bool const value=true;
923                 };
924             }
925 
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,
931             A &>::type
assign(A & a,B const & b)932         assign( A & a, B const & b )
933             {
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);
936             return a;
937             }
938 
939         namespace
940         sfinae
941             {
942             using ::boost::qvm::assign;
943             }
944 
945         namespace
946         qvm_detail
947             {
948             template <int R,int C>
949             struct assign_mm_defined;
950 
951             template <>
952             struct
953             assign_mm_defined<1,2>
954                 {
955                 static bool const value=true;
956                 };
957             }
958 
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,
964             R>::type
convert_to(A const & a)965         convert_to( A const & a )
966             {
967             R r;
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);
972             return r;
973             }
974 
975         namespace
976         sfinae
977             {
978             using ::boost::qvm::convert_to;
979             }
980 
981         namespace
982         qvm_detail
983             {
984             template <int R,int C>
985             struct convert_to_m_defined;
986 
987             template <>
988             struct
989             convert_to_m_defined<2,2>
990                 {
991                 static bool const value=true;
992                 };
993             }
994 
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,
1000             R>::type
convert_to(A const & a)1001         convert_to( A const & a )
1002             {
1003             R r;
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);
1006             return r;
1007             }
1008 
1009         namespace
1010         sfinae
1011             {
1012             using ::boost::qvm::convert_to;
1013             }
1014 
1015         namespace
1016         qvm_detail
1017             {
1018             template <int R,int C>
1019             struct convert_to_m_defined;
1020 
1021             template <>
1022             struct
1023             convert_to_m_defined<2,1>
1024                 {
1025                 static bool const value=true;
1026                 };
1027             }
1028 
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,
1034             R>::type
convert_to(A const & a)1035         convert_to( A const & a )
1036             {
1037             R r;
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);
1040             return r;
1041             }
1042 
1043         namespace
1044         sfinae
1045             {
1046             using ::boost::qvm::convert_to;
1047             }
1048 
1049         namespace
1050         qvm_detail
1051             {
1052             template <int R,int C>
1053             struct convert_to_m_defined;
1054 
1055             template <>
1056             struct
1057             convert_to_m_defined<1,2>
1058                 {
1059                 static bool const value=true;
1060                 };
1061             }
1062 
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,
1068             bool>::type
operator ==(A const & a,B const & b)1069         operator==( A const & a, B const & b )
1070             {
1071             return
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);
1076             }
1077 
1078         namespace
1079         sfinae
1080             {
1081             using ::boost::qvm::operator==;
1082             }
1083 
1084         namespace
1085         qvm_detail
1086             {
1087             template <int R,int C>
1088             struct eq_mm_defined;
1089 
1090             template <>
1091             struct
1092             eq_mm_defined<2,2>
1093                 {
1094                 static bool const value=true;
1095                 };
1096             }
1097 
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,
1103             bool>::type
operator ==(A const & a,B const & b)1104         operator==( A const & a, B const & b )
1105             {
1106             return
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);
1109             }
1110 
1111         namespace
1112         sfinae
1113             {
1114             using ::boost::qvm::operator==;
1115             }
1116 
1117         namespace
1118         qvm_detail
1119             {
1120             template <int R,int C>
1121             struct eq_mm_defined;
1122 
1123             template <>
1124             struct
1125             eq_mm_defined<2,1>
1126                 {
1127                 static bool const value=true;
1128                 };
1129             }
1130 
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,
1136             bool>::type
operator ==(A const & a,B const & b)1137         operator==( A const & a, B const & b )
1138             {
1139             return
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);
1142             }
1143 
1144         namespace
1145         sfinae
1146             {
1147             using ::boost::qvm::operator==;
1148             }
1149 
1150         namespace
1151         qvm_detail
1152             {
1153             template <int R,int C>
1154             struct eq_mm_defined;
1155 
1156             template <>
1157             struct
1158             eq_mm_defined<1,2>
1159                 {
1160                 static bool const value=true;
1161                 };
1162             }
1163 
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,
1169             bool>::type
operator !=(A const & a,B const & b)1170         operator!=( A const & a, B const & b )
1171             {
1172             return
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));
1177             }
1178 
1179         namespace
1180         sfinae
1181             {
1182             using ::boost::qvm::operator!=;
1183             }
1184 
1185         namespace
1186         qvm_detail
1187             {
1188             template <int R,int C>
1189             struct neq_mm_defined;
1190 
1191             template <>
1192             struct
1193             neq_mm_defined<2,2>
1194                 {
1195                 static bool const value=true;
1196                 };
1197             }
1198 
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,
1204             bool>::type
operator !=(A const & a,B const & b)1205         operator!=( A const & a, B const & b )
1206             {
1207             return
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));
1210             }
1211 
1212         namespace
1213         sfinae
1214             {
1215             using ::boost::qvm::operator!=;
1216             }
1217 
1218         namespace
1219         qvm_detail
1220             {
1221             template <int R,int C>
1222             struct neq_mm_defined;
1223 
1224             template <>
1225             struct
1226             neq_mm_defined<2,1>
1227                 {
1228                 static bool const value=true;
1229                 };
1230             }
1231 
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,
1237             bool>::type
operator !=(A const & a,B const & b)1238         operator!=( A const & a, B const & b )
1239             {
1240             return
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));
1243             }
1244 
1245         namespace
1246         sfinae
1247             {
1248             using ::boost::qvm::operator!=;
1249             }
1250 
1251         namespace
1252         qvm_detail
1253             {
1254             template <int R,int C>
1255             struct neq_mm_defined;
1256 
1257             template <>
1258             struct
1259             neq_mm_defined<1,2>
1260                 {
1261                 static bool const value=true;
1262                 };
1263             }
1264 
1265         template <class A>
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
operator -(A const & a)1270         operator-( A const & a )
1271             {
1272             typedef typename deduce_mat<A>::type R;
1273             R 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);
1278             return r;
1279             }
1280 
1281         namespace
1282         sfinae
1283             {
1284             using ::boost::qvm::operator-;
1285             }
1286 
1287         namespace
1288         qvm_detail
1289             {
1290             template <int R,int C>
1291             struct minus_m_defined;
1292 
1293             template <>
1294             struct
1295             minus_m_defined<2,2>
1296                 {
1297                 static bool const value=true;
1298                 };
1299             }
1300 
1301         template <class A>
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
operator -(A const & a)1306         operator-( A const & a )
1307             {
1308             typedef typename deduce_mat<A>::type R;
1309             R 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);
1312             return r;
1313             }
1314 
1315         namespace
1316         sfinae
1317             {
1318             using ::boost::qvm::operator-;
1319             }
1320 
1321         namespace
1322         qvm_detail
1323             {
1324             template <int R,int C>
1325             struct minus_m_defined;
1326 
1327             template <>
1328             struct
1329             minus_m_defined<2,1>
1330                 {
1331                 static bool const value=true;
1332                 };
1333             }
1334 
1335         template <class A>
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
operator -(A const & a)1340         operator-( A const & a )
1341             {
1342             typedef typename deduce_mat<A>::type R;
1343             R 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);
1346             return r;
1347             }
1348 
1349         namespace
1350         sfinae
1351             {
1352             using ::boost::qvm::operator-;
1353             }
1354 
1355         namespace
1356         qvm_detail
1357             {
1358             template <int R,int C>
1359             struct minus_m_defined;
1360 
1361             template <>
1362             struct
1363             minus_m_defined<1,2>
1364                 {
1365                 static bool const value=true;
1366                 };
1367             }
1368 
1369         template <class A>
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
determinant(A const & a)1374         determinant( A const & a )
1375             {
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);
1382             return det;
1383             }
1384 
1385         namespace
1386         sfinae
1387             {
1388             using ::boost::qvm::determinant;
1389             }
1390 
1391         namespace
1392         qvm_detail
1393             {
1394             template <int D>
1395             struct determinant_defined;
1396 
1397             template <>
1398             struct
1399             determinant_defined<2>
1400                 {
1401                 static bool const value=true;
1402                 };
1403             }
1404 
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
inverse(A const & a,B det)1410         inverse( A const & a, B det )
1411             {
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;
1420             R 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;
1425             return r;
1426             }
1427 
1428         template <class A>
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
inverse(A const & a)1433         inverse( A const & a )
1434             {
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);
1440             }
1441 
1442         namespace
1443         sfinae
1444             {
1445             using ::boost::qvm::inverse;
1446             }
1447 
1448         namespace
1449         qvm_detail
1450             {
1451             template <int D>
1452             struct inverse_m_defined;
1453 
1454             template <>
1455             struct
1456             inverse_m_defined<2>
1457                 {
1458                 static bool const value=true;
1459                 };
1460             }
1461 
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
operator *(A const & a,B const & b)1468         operator*( A const & a, B const & b )
1469             {
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);
1483             R r;
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;
1488             return r;
1489             }
1490 
1491         namespace
1492         sfinae
1493             {
1494             using ::boost::qvm::operator*;
1495             }
1496 
1497         namespace
1498         qvm_detail
1499             {
1500             template <int R,int CR,int C>
1501             struct mul_mm_defined;
1502 
1503             template <>
1504             struct
1505             mul_mm_defined<2,2,2>
1506                 {
1507                 static bool const value=true;
1508                 };
1509             }
1510 
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,
1516             A &>::type
operator *=(A & a,B const & b)1517         operator*=( A & a, B const & b )
1518             {
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;
1533             return a;
1534             }
1535 
1536         namespace
1537         sfinae
1538             {
1539             using ::boost::qvm::operator*=;
1540             }
1541 
1542         namespace
1543         qvm_detail
1544             {
1545             template <int D>
1546             struct mul_eq_mm_defined;
1547 
1548             template <>
1549             struct
1550             mul_eq_mm_defined<2>
1551                 {
1552                 static bool const value=true;
1553                 };
1554             }
1555 
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
operator *(A const & a,B const & b)1562         operator*( A const & a, B const & b )
1563             {
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);
1575             R r;
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;
1578             return r;
1579             }
1580 
1581         namespace
1582         sfinae
1583             {
1584             using ::boost::qvm::operator*;
1585             }
1586 
1587         namespace
1588         qvm_detail
1589             {
1590             template <int R,int CR,int C>
1591             struct mul_mm_defined;
1592 
1593             template <>
1594             struct
1595             mul_mm_defined<2,2,1>
1596                 {
1597                 static bool const value=true;
1598                 };
1599             }
1600 
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
operator *(A const & a,B const & b)1607         operator*( A const & a, B const & b )
1608             {
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);
1620             R r;
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;
1623             return r;
1624             }
1625 
1626         namespace
1627         sfinae
1628             {
1629             using ::boost::qvm::operator*;
1630             }
1631 
1632         namespace
1633         qvm_detail
1634             {
1635             template <int R,int CR,int C>
1636             struct mul_mm_defined;
1637 
1638             template <>
1639             struct
1640             mul_mm_defined<1,2,2>
1641                 {
1642                 static bool const value=true;
1643                 };
1644             }
1645 
1646         }
1647     }
1648 
1649 #endif
1650