1 //Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc.
3 //Distributed under the Boost Software License, Version 1.0. (See accompanying
4 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 #ifndef BOOST_QVM_B3124DC843BB8BA61F35A7D938251F
7 #define BOOST_QVM_B3124DC843BB8BA61F35A7D938251F
9 //This file was generated by a program. Do not edit manually.
11 #include <boost/qvm/assert.hpp>
12 #include <boost/qvm/deduce_mat.hpp>
13 #include <boost/qvm/deduce_vec.hpp>
14 #include <boost/qvm/enable_if.hpp>
15 #include <boost/qvm/error.hpp>
16 #include <boost/qvm/inline.hpp>
17 #include <boost/qvm/mat_traits.hpp>
18 #include <boost/qvm/quat_traits.hpp>
19 #include <boost/qvm/scalar_traits.hpp>
20 #include <boost/qvm/throw_exception.hpp>
28 template <class A,class B>
29 BOOST_QVM_INLINE_OPERATIONS
30 typename lazy_enable_if_c<
31 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
32 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
33 deduce_mat2<A,B,4,4> >::type
34 operator+( A const & a, B const & b )
36 typedef typename deduce_mat2<A,B,4,4>::type R;
37 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==4);
38 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==4);
40 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)+mat_traits<B>::template read_element<0,0>(b);
41 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)+mat_traits<B>::template read_element<0,1>(b);
42 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)+mat_traits<B>::template read_element<0,2>(b);
43 mat_traits<R>::template write_element<0,3>(r)=mat_traits<A>::template read_element<0,3>(a)+mat_traits<B>::template read_element<0,3>(b);
44 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);
45 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 mat_traits<R>::template write_element<1,2>(r)=mat_traits<A>::template read_element<1,2>(a)+mat_traits<B>::template read_element<1,2>(b);
47 mat_traits<R>::template write_element<1,3>(r)=mat_traits<A>::template read_element<1,3>(a)+mat_traits<B>::template read_element<1,3>(b);
48 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)+mat_traits<B>::template read_element<2,0>(b);
49 mat_traits<R>::template write_element<2,1>(r)=mat_traits<A>::template read_element<2,1>(a)+mat_traits<B>::template read_element<2,1>(b);
50 mat_traits<R>::template write_element<2,2>(r)=mat_traits<A>::template read_element<2,2>(a)+mat_traits<B>::template read_element<2,2>(b);
51 mat_traits<R>::template write_element<2,3>(r)=mat_traits<A>::template read_element<2,3>(a)+mat_traits<B>::template read_element<2,3>(b);
52 mat_traits<R>::template write_element<3,0>(r)=mat_traits<A>::template read_element<3,0>(a)+mat_traits<B>::template read_element<3,0>(b);
53 mat_traits<R>::template write_element<3,1>(r)=mat_traits<A>::template read_element<3,1>(a)+mat_traits<B>::template read_element<3,1>(b);
54 mat_traits<R>::template write_element<3,2>(r)=mat_traits<A>::template read_element<3,2>(a)+mat_traits<B>::template read_element<3,2>(b);
55 mat_traits<R>::template write_element<3,3>(r)=mat_traits<A>::template read_element<3,3>(a)+mat_traits<B>::template read_element<3,3>(b);
62 using ::boost::qvm::operator+;
68 template <int R,int C>
69 struct plus_mm_defined;
75 static bool const value=true;
79 template <class A,class B>
80 BOOST_QVM_INLINE_OPERATIONS
81 typename lazy_enable_if_c<
82 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
83 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
84 deduce_mat2<A,B,4,1> >::type
85 operator+( A const & a, B const & b )
87 typedef typename deduce_mat2<A,B,4,1>::type R;
88 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==4);
89 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==1);
91 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);
92 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);
93 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)+mat_traits<B>::template read_element<2,0>(b);
94 mat_traits<R>::template write_element<3,0>(r)=mat_traits<A>::template read_element<3,0>(a)+mat_traits<B>::template read_element<3,0>(b);
101 using ::boost::qvm::operator+;
107 template <int R,int C>
108 struct plus_mm_defined;
114 static bool const value=true;
118 template <class A,class B>
119 BOOST_QVM_INLINE_OPERATIONS
120 typename lazy_enable_if_c<
121 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
122 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
123 deduce_mat2<A,B,1,4> >::type
124 operator+( A const & a, B const & b )
126 typedef typename deduce_mat2<A,B,1,4>::type R;
127 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==1);
128 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==4);
130 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);
131 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);
132 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)+mat_traits<B>::template read_element<0,2>(b);
133 mat_traits<R>::template write_element<0,3>(r)=mat_traits<A>::template read_element<0,3>(a)+mat_traits<B>::template read_element<0,3>(b);
140 using ::boost::qvm::operator+;
146 template <int R,int C>
147 struct plus_mm_defined;
153 static bool const value=true;
157 template <class A,class B>
158 BOOST_QVM_INLINE_OPERATIONS
159 typename lazy_enable_if_c<
160 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
161 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
162 deduce_mat2<A,B,4,4> >::type
163 operator-( A const & a, B const & b )
165 typedef typename deduce_mat2<A,B,4,4>::type R;
166 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==4);
167 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==4);
169 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);
170 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);
171 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)-mat_traits<B>::template read_element<0,2>(b);
172 mat_traits<R>::template write_element<0,3>(r)=mat_traits<A>::template read_element<0,3>(a)-mat_traits<B>::template read_element<0,3>(b);
173 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);
174 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);
175 mat_traits<R>::template write_element<1,2>(r)=mat_traits<A>::template read_element<1,2>(a)-mat_traits<B>::template read_element<1,2>(b);
176 mat_traits<R>::template write_element<1,3>(r)=mat_traits<A>::template read_element<1,3>(a)-mat_traits<B>::template read_element<1,3>(b);
177 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)-mat_traits<B>::template read_element<2,0>(b);
178 mat_traits<R>::template write_element<2,1>(r)=mat_traits<A>::template read_element<2,1>(a)-mat_traits<B>::template read_element<2,1>(b);
179 mat_traits<R>::template write_element<2,2>(r)=mat_traits<A>::template read_element<2,2>(a)-mat_traits<B>::template read_element<2,2>(b);
180 mat_traits<R>::template write_element<2,3>(r)=mat_traits<A>::template read_element<2,3>(a)-mat_traits<B>::template read_element<2,3>(b);
181 mat_traits<R>::template write_element<3,0>(r)=mat_traits<A>::template read_element<3,0>(a)-mat_traits<B>::template read_element<3,0>(b);
182 mat_traits<R>::template write_element<3,1>(r)=mat_traits<A>::template read_element<3,1>(a)-mat_traits<B>::template read_element<3,1>(b);
183 mat_traits<R>::template write_element<3,2>(r)=mat_traits<A>::template read_element<3,2>(a)-mat_traits<B>::template read_element<3,2>(b);
184 mat_traits<R>::template write_element<3,3>(r)=mat_traits<A>::template read_element<3,3>(a)-mat_traits<B>::template read_element<3,3>(b);
191 using ::boost::qvm::operator-;
197 template <int R,int C>
198 struct minus_mm_defined;
202 minus_mm_defined<4,4>
204 static bool const value=true;
208 template <class A,class B>
209 BOOST_QVM_INLINE_OPERATIONS
210 typename lazy_enable_if_c<
211 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
212 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
213 deduce_mat2<A,B,4,1> >::type
214 operator-( A const & a, B const & b )
216 typedef typename deduce_mat2<A,B,4,1>::type R;
217 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==4);
218 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==1);
220 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);
221 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);
222 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)-mat_traits<B>::template read_element<2,0>(b);
223 mat_traits<R>::template write_element<3,0>(r)=mat_traits<A>::template read_element<3,0>(a)-mat_traits<B>::template read_element<3,0>(b);
230 using ::boost::qvm::operator-;
236 template <int R,int C>
237 struct minus_mm_defined;
241 minus_mm_defined<4,1>
243 static bool const value=true;
247 template <class A,class B>
248 BOOST_QVM_INLINE_OPERATIONS
249 typename lazy_enable_if_c<
250 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
251 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
252 deduce_mat2<A,B,1,4> >::type
253 operator-( A const & a, B const & b )
255 typedef typename deduce_mat2<A,B,1,4>::type R;
256 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==1);
257 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==4);
259 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);
260 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);
261 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)-mat_traits<B>::template read_element<0,2>(b);
262 mat_traits<R>::template write_element<0,3>(r)=mat_traits<A>::template read_element<0,3>(a)-mat_traits<B>::template read_element<0,3>(b);
269 using ::boost::qvm::operator-;
275 template <int R,int C>
276 struct minus_mm_defined;
280 minus_mm_defined<1,4>
282 static bool const value=true;
286 template <class A,class B>
287 BOOST_QVM_INLINE_OPERATIONS
288 typename enable_if_c<
289 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
290 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
292 operator+=( A & a, B const & b )
294 mat_traits<A>::template write_element<0,0>(a)+=mat_traits<B>::template read_element<0,0>(b);
295 mat_traits<A>::template write_element<0,1>(a)+=mat_traits<B>::template read_element<0,1>(b);
296 mat_traits<A>::template write_element<0,2>(a)+=mat_traits<B>::template read_element<0,2>(b);
297 mat_traits<A>::template write_element<0,3>(a)+=mat_traits<B>::template read_element<0,3>(b);
298 mat_traits<A>::template write_element<1,0>(a)+=mat_traits<B>::template read_element<1,0>(b);
299 mat_traits<A>::template write_element<1,1>(a)+=mat_traits<B>::template read_element<1,1>(b);
300 mat_traits<A>::template write_element<1,2>(a)+=mat_traits<B>::template read_element<1,2>(b);
301 mat_traits<A>::template write_element<1,3>(a)+=mat_traits<B>::template read_element<1,3>(b);
302 mat_traits<A>::template write_element<2,0>(a)+=mat_traits<B>::template read_element<2,0>(b);
303 mat_traits<A>::template write_element<2,1>(a)+=mat_traits<B>::template read_element<2,1>(b);
304 mat_traits<A>::template write_element<2,2>(a)+=mat_traits<B>::template read_element<2,2>(b);
305 mat_traits<A>::template write_element<2,3>(a)+=mat_traits<B>::template read_element<2,3>(b);
306 mat_traits<A>::template write_element<3,0>(a)+=mat_traits<B>::template read_element<3,0>(b);
307 mat_traits<A>::template write_element<3,1>(a)+=mat_traits<B>::template read_element<3,1>(b);
308 mat_traits<A>::template write_element<3,2>(a)+=mat_traits<B>::template read_element<3,2>(b);
309 mat_traits<A>::template write_element<3,3>(a)+=mat_traits<B>::template read_element<3,3>(b);
316 using ::boost::qvm::operator+=;
322 template <int R,int C>
323 struct plus_eq_mm_defined;
327 plus_eq_mm_defined<4,4>
329 static bool const value=true;
333 template <class A,class B>
334 BOOST_QVM_INLINE_OPERATIONS
335 typename enable_if_c<
336 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
337 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
339 operator+=( A & a, B const & b )
341 mat_traits<A>::template write_element<0,0>(a)+=mat_traits<B>::template read_element<0,0>(b);
342 mat_traits<A>::template write_element<1,0>(a)+=mat_traits<B>::template read_element<1,0>(b);
343 mat_traits<A>::template write_element<2,0>(a)+=mat_traits<B>::template read_element<2,0>(b);
344 mat_traits<A>::template write_element<3,0>(a)+=mat_traits<B>::template read_element<3,0>(b);
351 using ::boost::qvm::operator+=;
357 template <int R,int C>
358 struct plus_eq_mm_defined;
362 plus_eq_mm_defined<4,1>
364 static bool const value=true;
368 template <class A,class B>
369 BOOST_QVM_INLINE_OPERATIONS
370 typename enable_if_c<
371 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
372 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
374 operator+=( A & a, B const & b )
376 mat_traits<A>::template write_element<0,0>(a)+=mat_traits<B>::template read_element<0,0>(b);
377 mat_traits<A>::template write_element<0,1>(a)+=mat_traits<B>::template read_element<0,1>(b);
378 mat_traits<A>::template write_element<0,2>(a)+=mat_traits<B>::template read_element<0,2>(b);
379 mat_traits<A>::template write_element<0,3>(a)+=mat_traits<B>::template read_element<0,3>(b);
386 using ::boost::qvm::operator+=;
392 template <int R,int C>
393 struct plus_eq_mm_defined;
397 plus_eq_mm_defined<1,4>
399 static bool const value=true;
403 template <class A,class B>
404 BOOST_QVM_INLINE_OPERATIONS
405 typename enable_if_c<
406 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
407 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
409 operator-=( A & a, B const & b )
411 mat_traits<A>::template write_element<0,0>(a)-=mat_traits<B>::template read_element<0,0>(b);
412 mat_traits<A>::template write_element<0,1>(a)-=mat_traits<B>::template read_element<0,1>(b);
413 mat_traits<A>::template write_element<0,2>(a)-=mat_traits<B>::template read_element<0,2>(b);
414 mat_traits<A>::template write_element<0,3>(a)-=mat_traits<B>::template read_element<0,3>(b);
415 mat_traits<A>::template write_element<1,0>(a)-=mat_traits<B>::template read_element<1,0>(b);
416 mat_traits<A>::template write_element<1,1>(a)-=mat_traits<B>::template read_element<1,1>(b);
417 mat_traits<A>::template write_element<1,2>(a)-=mat_traits<B>::template read_element<1,2>(b);
418 mat_traits<A>::template write_element<1,3>(a)-=mat_traits<B>::template read_element<1,3>(b);
419 mat_traits<A>::template write_element<2,0>(a)-=mat_traits<B>::template read_element<2,0>(b);
420 mat_traits<A>::template write_element<2,1>(a)-=mat_traits<B>::template read_element<2,1>(b);
421 mat_traits<A>::template write_element<2,2>(a)-=mat_traits<B>::template read_element<2,2>(b);
422 mat_traits<A>::template write_element<2,3>(a)-=mat_traits<B>::template read_element<2,3>(b);
423 mat_traits<A>::template write_element<3,0>(a)-=mat_traits<B>::template read_element<3,0>(b);
424 mat_traits<A>::template write_element<3,1>(a)-=mat_traits<B>::template read_element<3,1>(b);
425 mat_traits<A>::template write_element<3,2>(a)-=mat_traits<B>::template read_element<3,2>(b);
426 mat_traits<A>::template write_element<3,3>(a)-=mat_traits<B>::template read_element<3,3>(b);
433 using ::boost::qvm::operator-=;
439 template <int R,int C>
440 struct minus_eq_mm_defined;
444 minus_eq_mm_defined<4,4>
446 static bool const value=true;
450 template <class A,class B>
451 BOOST_QVM_INLINE_OPERATIONS
452 typename enable_if_c<
453 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
454 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
456 operator-=( A & a, B const & b )
458 mat_traits<A>::template write_element<0,0>(a)-=mat_traits<B>::template read_element<0,0>(b);
459 mat_traits<A>::template write_element<1,0>(a)-=mat_traits<B>::template read_element<1,0>(b);
460 mat_traits<A>::template write_element<2,0>(a)-=mat_traits<B>::template read_element<2,0>(b);
461 mat_traits<A>::template write_element<3,0>(a)-=mat_traits<B>::template read_element<3,0>(b);
468 using ::boost::qvm::operator-=;
474 template <int R,int C>
475 struct minus_eq_mm_defined;
479 minus_eq_mm_defined<4,1>
481 static bool const value=true;
485 template <class A,class B>
486 BOOST_QVM_INLINE_OPERATIONS
487 typename enable_if_c<
488 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
489 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
491 operator-=( A & a, B const & b )
493 mat_traits<A>::template write_element<0,0>(a)-=mat_traits<B>::template read_element<0,0>(b);
494 mat_traits<A>::template write_element<0,1>(a)-=mat_traits<B>::template read_element<0,1>(b);
495 mat_traits<A>::template write_element<0,2>(a)-=mat_traits<B>::template read_element<0,2>(b);
496 mat_traits<A>::template write_element<0,3>(a)-=mat_traits<B>::template read_element<0,3>(b);
503 using ::boost::qvm::operator-=;
509 template <int R,int C>
510 struct minus_eq_mm_defined;
514 minus_eq_mm_defined<1,4>
516 static bool const value=true;
520 template <class A,class B>
521 BOOST_QVM_INLINE_OPERATIONS
522 typename lazy_enable_if_c<
523 mat_traits<A>::rows==4 && mat_traits<A>::cols==4 && is_scalar<B>::value,
524 deduce_mat<A> >::type
525 operator*( A const & a, B b )
527 typedef typename deduce_mat<A>::type R;
529 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)*b;
530 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)*b;
531 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)*b;
532 mat_traits<R>::template write_element<0,3>(r)=mat_traits<A>::template read_element<0,3>(a)*b;
533 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)*b;
534 mat_traits<R>::template write_element<1,1>(r)=mat_traits<A>::template read_element<1,1>(a)*b;
535 mat_traits<R>::template write_element<1,2>(r)=mat_traits<A>::template read_element<1,2>(a)*b;
536 mat_traits<R>::template write_element<1,3>(r)=mat_traits<A>::template read_element<1,3>(a)*b;
537 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)*b;
538 mat_traits<R>::template write_element<2,1>(r)=mat_traits<A>::template read_element<2,1>(a)*b;
539 mat_traits<R>::template write_element<2,2>(r)=mat_traits<A>::template read_element<2,2>(a)*b;
540 mat_traits<R>::template write_element<2,3>(r)=mat_traits<A>::template read_element<2,3>(a)*b;
541 mat_traits<R>::template write_element<3,0>(r)=mat_traits<A>::template read_element<3,0>(a)*b;
542 mat_traits<R>::template write_element<3,1>(r)=mat_traits<A>::template read_element<3,1>(a)*b;
543 mat_traits<R>::template write_element<3,2>(r)=mat_traits<A>::template read_element<3,2>(a)*b;
544 mat_traits<R>::template write_element<3,3>(r)=mat_traits<A>::template read_element<3,3>(a)*b;
551 using ::boost::qvm::operator*;
557 template <int R,int C>
558 struct mul_ms_defined;
564 static bool const value=true;
568 template <class A,class B>
569 BOOST_QVM_INLINE_OPERATIONS
570 typename lazy_enable_if_c<
571 mat_traits<A>::rows==4 && mat_traits<A>::cols==1 && is_scalar<B>::value,
572 deduce_mat<A> >::type
573 operator*( A const & a, B b )
575 typedef typename deduce_mat<A>::type R;
577 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)*b;
578 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)*b;
579 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)*b;
580 mat_traits<R>::template write_element<3,0>(r)=mat_traits<A>::template read_element<3,0>(a)*b;
587 using ::boost::qvm::operator*;
593 template <int R,int C>
594 struct mul_ms_defined;
600 static bool const value=true;
604 template <class A,class B>
605 BOOST_QVM_INLINE_OPERATIONS
606 typename lazy_enable_if_c<
607 mat_traits<A>::rows==1 && mat_traits<A>::cols==4 && is_scalar<B>::value,
608 deduce_mat<A> >::type
609 operator*( A const & a, B b )
611 typedef typename deduce_mat<A>::type R;
613 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)*b;
614 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)*b;
615 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)*b;
616 mat_traits<R>::template write_element<0,3>(r)=mat_traits<A>::template read_element<0,3>(a)*b;
623 using ::boost::qvm::operator*;
629 template <int R,int C>
630 struct mul_ms_defined;
636 static bool const value=true;
640 template <class A,class B>
641 BOOST_QVM_INLINE_OPERATIONS
642 typename enable_if_c<
643 mat_traits<A>::rows==4 && mat_traits<A>::cols==4 && is_scalar<B>::value,
645 operator*=( A & a, B b )
647 mat_traits<A>::template write_element<0,0>(a)*=b;
648 mat_traits<A>::template write_element<0,1>(a)*=b;
649 mat_traits<A>::template write_element<0,2>(a)*=b;
650 mat_traits<A>::template write_element<0,3>(a)*=b;
651 mat_traits<A>::template write_element<1,0>(a)*=b;
652 mat_traits<A>::template write_element<1,1>(a)*=b;
653 mat_traits<A>::template write_element<1,2>(a)*=b;
654 mat_traits<A>::template write_element<1,3>(a)*=b;
655 mat_traits<A>::template write_element<2,0>(a)*=b;
656 mat_traits<A>::template write_element<2,1>(a)*=b;
657 mat_traits<A>::template write_element<2,2>(a)*=b;
658 mat_traits<A>::template write_element<2,3>(a)*=b;
659 mat_traits<A>::template write_element<3,0>(a)*=b;
660 mat_traits<A>::template write_element<3,1>(a)*=b;
661 mat_traits<A>::template write_element<3,2>(a)*=b;
662 mat_traits<A>::template write_element<3,3>(a)*=b;
669 using ::boost::qvm::operator*=;
675 template <int R,int C>
676 struct mul_eq_ms_defined;
680 mul_eq_ms_defined<4,4>
682 static bool const value=true;
686 template <class A,class B>
687 BOOST_QVM_INLINE_OPERATIONS
688 typename enable_if_c<
689 mat_traits<A>::rows==4 && mat_traits<A>::cols==1 && is_scalar<B>::value,
691 operator*=( A & a, B b )
693 mat_traits<A>::template write_element<0,0>(a)*=b;
694 mat_traits<A>::template write_element<1,0>(a)*=b;
695 mat_traits<A>::template write_element<2,0>(a)*=b;
696 mat_traits<A>::template write_element<3,0>(a)*=b;
703 using ::boost::qvm::operator*=;
709 template <int R,int C>
710 struct mul_eq_ms_defined;
714 mul_eq_ms_defined<4,1>
716 static bool const value=true;
720 template <class A,class B>
721 BOOST_QVM_INLINE_OPERATIONS
722 typename enable_if_c<
723 mat_traits<A>::rows==1 && mat_traits<A>::cols==4 && is_scalar<B>::value,
725 operator*=( A & a, B b )
727 mat_traits<A>::template write_element<0,0>(a)*=b;
728 mat_traits<A>::template write_element<0,1>(a)*=b;
729 mat_traits<A>::template write_element<0,2>(a)*=b;
730 mat_traits<A>::template write_element<0,3>(a)*=b;
737 using ::boost::qvm::operator*=;
743 template <int R,int C>
744 struct mul_eq_ms_defined;
748 mul_eq_ms_defined<1,4>
750 static bool const value=true;
754 template <class A,class B>
755 BOOST_QVM_INLINE_OPERATIONS
756 typename lazy_enable_if_c<
757 mat_traits<A>::rows==4 && mat_traits<A>::cols==4 && is_scalar<B>::value,
758 deduce_mat<A> >::type
759 operator/( A const & a, B b )
761 typedef typename deduce_mat<A>::type R;
763 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)/b;
764 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)/b;
765 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)/b;
766 mat_traits<R>::template write_element<0,3>(r)=mat_traits<A>::template read_element<0,3>(a)/b;
767 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)/b;
768 mat_traits<R>::template write_element<1,1>(r)=mat_traits<A>::template read_element<1,1>(a)/b;
769 mat_traits<R>::template write_element<1,2>(r)=mat_traits<A>::template read_element<1,2>(a)/b;
770 mat_traits<R>::template write_element<1,3>(r)=mat_traits<A>::template read_element<1,3>(a)/b;
771 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)/b;
772 mat_traits<R>::template write_element<2,1>(r)=mat_traits<A>::template read_element<2,1>(a)/b;
773 mat_traits<R>::template write_element<2,2>(r)=mat_traits<A>::template read_element<2,2>(a)/b;
774 mat_traits<R>::template write_element<2,3>(r)=mat_traits<A>::template read_element<2,3>(a)/b;
775 mat_traits<R>::template write_element<3,0>(r)=mat_traits<A>::template read_element<3,0>(a)/b;
776 mat_traits<R>::template write_element<3,1>(r)=mat_traits<A>::template read_element<3,1>(a)/b;
777 mat_traits<R>::template write_element<3,2>(r)=mat_traits<A>::template read_element<3,2>(a)/b;
778 mat_traits<R>::template write_element<3,3>(r)=mat_traits<A>::template read_element<3,3>(a)/b;
785 using ::boost::qvm::operator/;
791 template <int R,int C>
792 struct div_ms_defined;
798 static bool const value=true;
802 template <class A,class B>
803 BOOST_QVM_INLINE_OPERATIONS
804 typename lazy_enable_if_c<
805 mat_traits<A>::rows==4 && mat_traits<A>::cols==1 && is_scalar<B>::value,
806 deduce_mat<A> >::type
807 operator/( A const & a, B b )
809 typedef typename deduce_mat<A>::type R;
811 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)/b;
812 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)/b;
813 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)/b;
814 mat_traits<R>::template write_element<3,0>(r)=mat_traits<A>::template read_element<3,0>(a)/b;
821 using ::boost::qvm::operator/;
827 template <int R,int C>
828 struct div_ms_defined;
834 static bool const value=true;
838 template <class A,class B>
839 BOOST_QVM_INLINE_OPERATIONS
840 typename lazy_enable_if_c<
841 mat_traits<A>::rows==1 && mat_traits<A>::cols==4 && is_scalar<B>::value,
842 deduce_mat<A> >::type
843 operator/( A const & a, B b )
845 typedef typename deduce_mat<A>::type R;
847 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)/b;
848 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)/b;
849 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)/b;
850 mat_traits<R>::template write_element<0,3>(r)=mat_traits<A>::template read_element<0,3>(a)/b;
857 using ::boost::qvm::operator/;
863 template <int R,int C>
864 struct div_ms_defined;
870 static bool const value=true;
874 template <class A,class B>
875 BOOST_QVM_INLINE_OPERATIONS
876 typename enable_if_c<
877 mat_traits<A>::rows==4 && mat_traits<A>::cols==4 && is_scalar<B>::value,
879 operator/=( A & a, B b )
881 mat_traits<A>::template write_element<0,0>(a)/=b;
882 mat_traits<A>::template write_element<0,1>(a)/=b;
883 mat_traits<A>::template write_element<0,2>(a)/=b;
884 mat_traits<A>::template write_element<0,3>(a)/=b;
885 mat_traits<A>::template write_element<1,0>(a)/=b;
886 mat_traits<A>::template write_element<1,1>(a)/=b;
887 mat_traits<A>::template write_element<1,2>(a)/=b;
888 mat_traits<A>::template write_element<1,3>(a)/=b;
889 mat_traits<A>::template write_element<2,0>(a)/=b;
890 mat_traits<A>::template write_element<2,1>(a)/=b;
891 mat_traits<A>::template write_element<2,2>(a)/=b;
892 mat_traits<A>::template write_element<2,3>(a)/=b;
893 mat_traits<A>::template write_element<3,0>(a)/=b;
894 mat_traits<A>::template write_element<3,1>(a)/=b;
895 mat_traits<A>::template write_element<3,2>(a)/=b;
896 mat_traits<A>::template write_element<3,3>(a)/=b;
903 using ::boost::qvm::operator/=;
909 template <int R,int C>
910 struct div_eq_ms_defined;
914 div_eq_ms_defined<4,4>
916 static bool const value=true;
920 template <class A,class B>
921 BOOST_QVM_INLINE_OPERATIONS
922 typename enable_if_c<
923 mat_traits<A>::rows==4 && mat_traits<A>::cols==1 && is_scalar<B>::value,
925 operator/=( A & a, B b )
927 mat_traits<A>::template write_element<0,0>(a)/=b;
928 mat_traits<A>::template write_element<1,0>(a)/=b;
929 mat_traits<A>::template write_element<2,0>(a)/=b;
930 mat_traits<A>::template write_element<3,0>(a)/=b;
937 using ::boost::qvm::operator/=;
943 template <int R,int C>
944 struct div_eq_ms_defined;
948 div_eq_ms_defined<4,1>
950 static bool const value=true;
954 template <class A,class B>
955 BOOST_QVM_INLINE_OPERATIONS
956 typename enable_if_c<
957 mat_traits<A>::rows==1 && mat_traits<A>::cols==4 && is_scalar<B>::value,
959 operator/=( A & a, B b )
961 mat_traits<A>::template write_element<0,0>(a)/=b;
962 mat_traits<A>::template write_element<0,1>(a)/=b;
963 mat_traits<A>::template write_element<0,2>(a)/=b;
964 mat_traits<A>::template write_element<0,3>(a)/=b;
971 using ::boost::qvm::operator/=;
977 template <int R,int C>
978 struct div_eq_ms_defined;
982 div_eq_ms_defined<1,4>
984 static bool const value=true;
988 template <class A,class B>
989 BOOST_QVM_INLINE_OPERATIONS
990 typename enable_if_c<
991 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
992 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
994 assign( A & a, B const & b )
996 mat_traits<A>::template write_element<0,0>(a)=mat_traits<B>::template read_element<0,0>(b);
997 mat_traits<A>::template write_element<0,1>(a)=mat_traits<B>::template read_element<0,1>(b);
998 mat_traits<A>::template write_element<0,2>(a)=mat_traits<B>::template read_element<0,2>(b);
999 mat_traits<A>::template write_element<0,3>(a)=mat_traits<B>::template read_element<0,3>(b);
1000 mat_traits<A>::template write_element<1,0>(a)=mat_traits<B>::template read_element<1,0>(b);
1001 mat_traits<A>::template write_element<1,1>(a)=mat_traits<B>::template read_element<1,1>(b);
1002 mat_traits<A>::template write_element<1,2>(a)=mat_traits<B>::template read_element<1,2>(b);
1003 mat_traits<A>::template write_element<1,3>(a)=mat_traits<B>::template read_element<1,3>(b);
1004 mat_traits<A>::template write_element<2,0>(a)=mat_traits<B>::template read_element<2,0>(b);
1005 mat_traits<A>::template write_element<2,1>(a)=mat_traits<B>::template read_element<2,1>(b);
1006 mat_traits<A>::template write_element<2,2>(a)=mat_traits<B>::template read_element<2,2>(b);
1007 mat_traits<A>::template write_element<2,3>(a)=mat_traits<B>::template read_element<2,3>(b);
1008 mat_traits<A>::template write_element<3,0>(a)=mat_traits<B>::template read_element<3,0>(b);
1009 mat_traits<A>::template write_element<3,1>(a)=mat_traits<B>::template read_element<3,1>(b);
1010 mat_traits<A>::template write_element<3,2>(a)=mat_traits<B>::template read_element<3,2>(b);
1011 mat_traits<A>::template write_element<3,3>(a)=mat_traits<B>::template read_element<3,3>(b);
1018 using ::boost::qvm::assign;
1024 template <int R,int C>
1025 struct assign_mm_defined;
1029 assign_mm_defined<4,4>
1031 static bool const value=true;
1035 template <class A,class B>
1036 BOOST_QVM_INLINE_OPERATIONS
1037 typename enable_if_c<
1038 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
1039 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
1041 assign( A & a, B const & b )
1043 mat_traits<A>::template write_element<0,0>(a)=mat_traits<B>::template read_element<0,0>(b);
1044 mat_traits<A>::template write_element<1,0>(a)=mat_traits<B>::template read_element<1,0>(b);
1045 mat_traits<A>::template write_element<2,0>(a)=mat_traits<B>::template read_element<2,0>(b);
1046 mat_traits<A>::template write_element<3,0>(a)=mat_traits<B>::template read_element<3,0>(b);
1053 using ::boost::qvm::assign;
1059 template <int R,int C>
1060 struct assign_mm_defined;
1064 assign_mm_defined<4,1>
1066 static bool const value=true;
1070 template <class A,class B>
1071 BOOST_QVM_INLINE_OPERATIONS
1072 typename enable_if_c<
1073 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
1074 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
1076 assign( A & a, B const & b )
1078 mat_traits<A>::template write_element<0,0>(a)=mat_traits<B>::template read_element<0,0>(b);
1079 mat_traits<A>::template write_element<0,1>(a)=mat_traits<B>::template read_element<0,1>(b);
1080 mat_traits<A>::template write_element<0,2>(a)=mat_traits<B>::template read_element<0,2>(b);
1081 mat_traits<A>::template write_element<0,3>(a)=mat_traits<B>::template read_element<0,3>(b);
1088 using ::boost::qvm::assign;
1094 template <int R,int C>
1095 struct assign_mm_defined;
1099 assign_mm_defined<1,4>
1101 static bool const value=true;
1105 template <class R,class A>
1106 BOOST_QVM_INLINE_OPERATIONS
1107 typename enable_if_c<
1108 mat_traits<R>::rows==4 && mat_traits<A>::rows==4 &&
1109 mat_traits<R>::cols==4 && mat_traits<A>::cols==4,
1111 convert_to( A const & a )
1114 mat_traits<R>::template write_element<0,0>(r) = mat_traits<A>::template read_element<0,0>(a);
1115 mat_traits<R>::template write_element<0,1>(r) = mat_traits<A>::template read_element<0,1>(a);
1116 mat_traits<R>::template write_element<0,2>(r) = mat_traits<A>::template read_element<0,2>(a);
1117 mat_traits<R>::template write_element<0,3>(r) = mat_traits<A>::template read_element<0,3>(a);
1118 mat_traits<R>::template write_element<1,0>(r) = mat_traits<A>::template read_element<1,0>(a);
1119 mat_traits<R>::template write_element<1,1>(r) = mat_traits<A>::template read_element<1,1>(a);
1120 mat_traits<R>::template write_element<1,2>(r) = mat_traits<A>::template read_element<1,2>(a);
1121 mat_traits<R>::template write_element<1,3>(r) = mat_traits<A>::template read_element<1,3>(a);
1122 mat_traits<R>::template write_element<2,0>(r) = mat_traits<A>::template read_element<2,0>(a);
1123 mat_traits<R>::template write_element<2,1>(r) = mat_traits<A>::template read_element<2,1>(a);
1124 mat_traits<R>::template write_element<2,2>(r) = mat_traits<A>::template read_element<2,2>(a);
1125 mat_traits<R>::template write_element<2,3>(r) = mat_traits<A>::template read_element<2,3>(a);
1126 mat_traits<R>::template write_element<3,0>(r) = mat_traits<A>::template read_element<3,0>(a);
1127 mat_traits<R>::template write_element<3,1>(r) = mat_traits<A>::template read_element<3,1>(a);
1128 mat_traits<R>::template write_element<3,2>(r) = mat_traits<A>::template read_element<3,2>(a);
1129 mat_traits<R>::template write_element<3,3>(r) = mat_traits<A>::template read_element<3,3>(a);
1133 template <class R,class A>
1135 typename enable_if_c<
1136 is_mat<R>::value && is_quat<A>::value &&
1137 mat_traits<R>::rows==4 && mat_traits<R>::cols==4,
1139 convert_to( A const & q )
1141 typedef typename mat_traits<R>::scalar_type T;
1142 T const a=quat_traits<A>::template read_element<0>(q);
1143 T const b=quat_traits<A>::template read_element<1>(q);
1144 T const c=quat_traits<A>::template read_element<2>(q);
1145 T const d=quat_traits<A>::template read_element<3>(q);
1155 T const zero = scalar_traits<T>::value(0);
1156 T const one = scalar_traits<T>::value(1);
1157 T const two = one+one;
1159 mat_traits<R>::template write_element<0,0>(r) = one - two*(cc+dd);
1160 mat_traits<R>::template write_element<0,1>(r) = two*(bc-ad);
1161 mat_traits<R>::template write_element<0,2>(r) = two*(bd+ac);
1162 mat_traits<R>::template write_element<0,3>(r) = zero;
1163 mat_traits<R>::template write_element<1,0>(r) = two*(bc+ad);
1164 mat_traits<R>::template write_element<1,1>(r) = one - two*(bb+dd);
1165 mat_traits<R>::template write_element<1,2>(r) = two*(cd-ab);
1166 mat_traits<R>::template write_element<1,3>(r) = zero;
1167 mat_traits<R>::template write_element<2,0>(r) = two*(bd-ac);
1168 mat_traits<R>::template write_element<2,1>(r) = two*(cd+ab);
1169 mat_traits<R>::template write_element<2,2>(r) = one - two*(bb+cc);
1170 mat_traits<R>::template write_element<2,3>(r) = zero;
1171 mat_traits<R>::template write_element<3,0>(r) = zero;
1172 mat_traits<R>::template write_element<3,1>(r) = zero;
1173 mat_traits<R>::template write_element<3,2>(r) = zero;
1174 mat_traits<R>::template write_element<3,3>(r) = one;
1181 using ::boost::qvm::convert_to;
1187 template <int R,int C>
1188 struct convert_to_m_defined;
1192 convert_to_m_defined<4,4>
1194 static bool const value=true;
1198 template <class R,class A>
1199 BOOST_QVM_INLINE_OPERATIONS
1200 typename enable_if_c<
1201 mat_traits<R>::rows==4 && mat_traits<A>::rows==4 &&
1202 mat_traits<R>::cols==1 && mat_traits<A>::cols==1,
1204 convert_to( A const & a )
1207 mat_traits<R>::template write_element<0,0>(r) = mat_traits<A>::template read_element<0,0>(a);
1208 mat_traits<R>::template write_element<1,0>(r) = mat_traits<A>::template read_element<1,0>(a);
1209 mat_traits<R>::template write_element<2,0>(r) = mat_traits<A>::template read_element<2,0>(a);
1210 mat_traits<R>::template write_element<3,0>(r) = mat_traits<A>::template read_element<3,0>(a);
1217 using ::boost::qvm::convert_to;
1223 template <int R,int C>
1224 struct convert_to_m_defined;
1228 convert_to_m_defined<4,1>
1230 static bool const value=true;
1234 template <class R,class A>
1235 BOOST_QVM_INLINE_OPERATIONS
1236 typename enable_if_c<
1237 mat_traits<R>::rows==1 && mat_traits<A>::rows==1 &&
1238 mat_traits<R>::cols==4 && mat_traits<A>::cols==4,
1240 convert_to( A const & a )
1243 mat_traits<R>::template write_element<0,0>(r) = mat_traits<A>::template read_element<0,0>(a);
1244 mat_traits<R>::template write_element<0,1>(r) = mat_traits<A>::template read_element<0,1>(a);
1245 mat_traits<R>::template write_element<0,2>(r) = mat_traits<A>::template read_element<0,2>(a);
1246 mat_traits<R>::template write_element<0,3>(r) = mat_traits<A>::template read_element<0,3>(a);
1253 using ::boost::qvm::convert_to;
1259 template <int R,int C>
1260 struct convert_to_m_defined;
1264 convert_to_m_defined<1,4>
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==4 && mat_traits<B>::rows==4 &&
1274 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
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<0,1>(a)==mat_traits<B>::template read_element<0,1>(b) &&
1281 mat_traits<A>::template read_element<0,2>(a)==mat_traits<B>::template read_element<0,2>(b) &&
1282 mat_traits<A>::template read_element<0,3>(a)==mat_traits<B>::template read_element<0,3>(b) &&
1283 mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b) &&
1284 mat_traits<A>::template read_element<1,1>(a)==mat_traits<B>::template read_element<1,1>(b) &&
1285 mat_traits<A>::template read_element<1,2>(a)==mat_traits<B>::template read_element<1,2>(b) &&
1286 mat_traits<A>::template read_element<1,3>(a)==mat_traits<B>::template read_element<1,3>(b) &&
1287 mat_traits<A>::template read_element<2,0>(a)==mat_traits<B>::template read_element<2,0>(b) &&
1288 mat_traits<A>::template read_element<2,1>(a)==mat_traits<B>::template read_element<2,1>(b) &&
1289 mat_traits<A>::template read_element<2,2>(a)==mat_traits<B>::template read_element<2,2>(b) &&
1290 mat_traits<A>::template read_element<2,3>(a)==mat_traits<B>::template read_element<2,3>(b) &&
1291 mat_traits<A>::template read_element<3,0>(a)==mat_traits<B>::template read_element<3,0>(b) &&
1292 mat_traits<A>::template read_element<3,1>(a)==mat_traits<B>::template read_element<3,1>(b) &&
1293 mat_traits<A>::template read_element<3,2>(a)==mat_traits<B>::template read_element<3,2>(b) &&
1294 mat_traits<A>::template read_element<3,3>(a)==mat_traits<B>::template read_element<3,3>(b);
1300 using ::boost::qvm::operator==;
1306 template <int R,int C>
1307 struct eq_mm_defined;
1313 static bool const value=true;
1317 template <class A,class B>
1318 BOOST_QVM_INLINE_OPERATIONS
1319 typename enable_if_c<
1320 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
1321 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
1323 operator==( A const & a, B const & b )
1326 mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b) &&
1327 mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b) &&
1328 mat_traits<A>::template read_element<2,0>(a)==mat_traits<B>::template read_element<2,0>(b) &&
1329 mat_traits<A>::template read_element<3,0>(a)==mat_traits<B>::template read_element<3,0>(b);
1335 using ::boost::qvm::operator==;
1341 template <int R,int C>
1342 struct eq_mm_defined;
1348 static bool const value=true;
1352 template <class A,class B>
1353 BOOST_QVM_INLINE_OPERATIONS
1354 typename enable_if_c<
1355 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
1356 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
1358 operator==( A const & a, B const & b )
1361 mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b) &&
1362 mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b) &&
1363 mat_traits<A>::template read_element<0,2>(a)==mat_traits<B>::template read_element<0,2>(b) &&
1364 mat_traits<A>::template read_element<0,3>(a)==mat_traits<B>::template read_element<0,3>(b);
1370 using ::boost::qvm::operator==;
1376 template <int R,int C>
1377 struct eq_mm_defined;
1383 static bool const value=true;
1387 template <class A,class B>
1388 BOOST_QVM_INLINE_OPERATIONS
1389 typename enable_if_c<
1390 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
1391 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
1393 operator!=( A const & a, B const & b )
1396 !(mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b)) ||
1397 !(mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b)) ||
1398 !(mat_traits<A>::template read_element<0,2>(a)==mat_traits<B>::template read_element<0,2>(b)) ||
1399 !(mat_traits<A>::template read_element<0,3>(a)==mat_traits<B>::template read_element<0,3>(b)) ||
1400 !(mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b)) ||
1401 !(mat_traits<A>::template read_element<1,1>(a)==mat_traits<B>::template read_element<1,1>(b)) ||
1402 !(mat_traits<A>::template read_element<1,2>(a)==mat_traits<B>::template read_element<1,2>(b)) ||
1403 !(mat_traits<A>::template read_element<1,3>(a)==mat_traits<B>::template read_element<1,3>(b)) ||
1404 !(mat_traits<A>::template read_element<2,0>(a)==mat_traits<B>::template read_element<2,0>(b)) ||
1405 !(mat_traits<A>::template read_element<2,1>(a)==mat_traits<B>::template read_element<2,1>(b)) ||
1406 !(mat_traits<A>::template read_element<2,2>(a)==mat_traits<B>::template read_element<2,2>(b)) ||
1407 !(mat_traits<A>::template read_element<2,3>(a)==mat_traits<B>::template read_element<2,3>(b)) ||
1408 !(mat_traits<A>::template read_element<3,0>(a)==mat_traits<B>::template read_element<3,0>(b)) ||
1409 !(mat_traits<A>::template read_element<3,1>(a)==mat_traits<B>::template read_element<3,1>(b)) ||
1410 !(mat_traits<A>::template read_element<3,2>(a)==mat_traits<B>::template read_element<3,2>(b)) ||
1411 !(mat_traits<A>::template read_element<3,3>(a)==mat_traits<B>::template read_element<3,3>(b));
1417 using ::boost::qvm::operator!=;
1423 template <int R,int C>
1424 struct neq_mm_defined;
1430 static bool const value=true;
1434 template <class A,class B>
1435 BOOST_QVM_INLINE_OPERATIONS
1436 typename enable_if_c<
1437 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
1438 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
1440 operator!=( A const & a, B const & b )
1443 !(mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b)) ||
1444 !(mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b)) ||
1445 !(mat_traits<A>::template read_element<2,0>(a)==mat_traits<B>::template read_element<2,0>(b)) ||
1446 !(mat_traits<A>::template read_element<3,0>(a)==mat_traits<B>::template read_element<3,0>(b));
1452 using ::boost::qvm::operator!=;
1458 template <int R,int C>
1459 struct neq_mm_defined;
1465 static bool const value=true;
1469 template <class A,class B>
1470 BOOST_QVM_INLINE_OPERATIONS
1471 typename enable_if_c<
1472 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
1473 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
1475 operator!=( A const & a, B const & b )
1478 !(mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b)) ||
1479 !(mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b)) ||
1480 !(mat_traits<A>::template read_element<0,2>(a)==mat_traits<B>::template read_element<0,2>(b)) ||
1481 !(mat_traits<A>::template read_element<0,3>(a)==mat_traits<B>::template read_element<0,3>(b));
1487 using ::boost::qvm::operator!=;
1493 template <int R,int C>
1494 struct neq_mm_defined;
1500 static bool const value=true;
1505 BOOST_QVM_INLINE_OPERATIONS
1506 typename lazy_enable_if_c<
1507 mat_traits<A>::rows==4 && mat_traits<A>::cols==4,
1508 deduce_mat<A> >::type
1509 operator-( A const & a )
1511 typedef typename deduce_mat<A>::type R;
1513 mat_traits<R>::template write_element<0,0>(r)=-mat_traits<A>::template read_element<0,0>(a);
1514 mat_traits<R>::template write_element<0,1>(r)=-mat_traits<A>::template read_element<0,1>(a);
1515 mat_traits<R>::template write_element<0,2>(r)=-mat_traits<A>::template read_element<0,2>(a);
1516 mat_traits<R>::template write_element<0,3>(r)=-mat_traits<A>::template read_element<0,3>(a);
1517 mat_traits<R>::template write_element<1,0>(r)=-mat_traits<A>::template read_element<1,0>(a);
1518 mat_traits<R>::template write_element<1,1>(r)=-mat_traits<A>::template read_element<1,1>(a);
1519 mat_traits<R>::template write_element<1,2>(r)=-mat_traits<A>::template read_element<1,2>(a);
1520 mat_traits<R>::template write_element<1,3>(r)=-mat_traits<A>::template read_element<1,3>(a);
1521 mat_traits<R>::template write_element<2,0>(r)=-mat_traits<A>::template read_element<2,0>(a);
1522 mat_traits<R>::template write_element<2,1>(r)=-mat_traits<A>::template read_element<2,1>(a);
1523 mat_traits<R>::template write_element<2,2>(r)=-mat_traits<A>::template read_element<2,2>(a);
1524 mat_traits<R>::template write_element<2,3>(r)=-mat_traits<A>::template read_element<2,3>(a);
1525 mat_traits<R>::template write_element<3,0>(r)=-mat_traits<A>::template read_element<3,0>(a);
1526 mat_traits<R>::template write_element<3,1>(r)=-mat_traits<A>::template read_element<3,1>(a);
1527 mat_traits<R>::template write_element<3,2>(r)=-mat_traits<A>::template read_element<3,2>(a);
1528 mat_traits<R>::template write_element<3,3>(r)=-mat_traits<A>::template read_element<3,3>(a);
1535 using ::boost::qvm::operator-;
1541 template <int R,int C>
1542 struct minus_m_defined;
1546 minus_m_defined<4,4>
1548 static bool const value=true;
1553 BOOST_QVM_INLINE_OPERATIONS
1554 typename lazy_enable_if_c<
1555 mat_traits<A>::rows==4 && mat_traits<A>::cols==1,
1556 deduce_mat<A> >::type
1557 operator-( A const & a )
1559 typedef typename deduce_mat<A>::type R;
1561 mat_traits<R>::template write_element<0,0>(r)=-mat_traits<A>::template read_element<0,0>(a);
1562 mat_traits<R>::template write_element<1,0>(r)=-mat_traits<A>::template read_element<1,0>(a);
1563 mat_traits<R>::template write_element<2,0>(r)=-mat_traits<A>::template read_element<2,0>(a);
1564 mat_traits<R>::template write_element<3,0>(r)=-mat_traits<A>::template read_element<3,0>(a);
1571 using ::boost::qvm::operator-;
1577 template <int R,int C>
1578 struct minus_m_defined;
1582 minus_m_defined<4,1>
1584 static bool const value=true;
1589 BOOST_QVM_INLINE_OPERATIONS
1590 typename lazy_enable_if_c<
1591 mat_traits<A>::rows==1 && mat_traits<A>::cols==4,
1592 deduce_mat<A> >::type
1593 operator-( A const & a )
1595 typedef typename deduce_mat<A>::type R;
1597 mat_traits<R>::template write_element<0,0>(r)=-mat_traits<A>::template read_element<0,0>(a);
1598 mat_traits<R>::template write_element<0,1>(r)=-mat_traits<A>::template read_element<0,1>(a);
1599 mat_traits<R>::template write_element<0,2>(r)=-mat_traits<A>::template read_element<0,2>(a);
1600 mat_traits<R>::template write_element<0,3>(r)=-mat_traits<A>::template read_element<0,3>(a);
1607 using ::boost::qvm::operator-;
1613 template <int R,int C>
1614 struct minus_m_defined;
1618 minus_m_defined<1,4>
1620 static bool const value=true;
1625 BOOST_QVM_INLINE_OPERATIONS
1626 typename enable_if_c<
1627 mat_traits<A>::rows==4 && mat_traits<A>::cols==4,
1628 typename mat_traits<A>::scalar_type>::type
1629 determinant( A const & a )
1631 typedef typename mat_traits<A>::scalar_type T;
1632 T const a00=mat_traits<A>::template read_element<0,0>(a);
1633 T const a01=mat_traits<A>::template read_element<0,1>(a);
1634 T const a02=mat_traits<A>::template read_element<0,2>(a);
1635 T const a03=mat_traits<A>::template read_element<0,3>(a);
1636 T const a10=mat_traits<A>::template read_element<1,0>(a);
1637 T const a11=mat_traits<A>::template read_element<1,1>(a);
1638 T const a12=mat_traits<A>::template read_element<1,2>(a);
1639 T const a13=mat_traits<A>::template read_element<1,3>(a);
1640 T const a20=mat_traits<A>::template read_element<2,0>(a);
1641 T const a21=mat_traits<A>::template read_element<2,1>(a);
1642 T const a22=mat_traits<A>::template read_element<2,2>(a);
1643 T const a23=mat_traits<A>::template read_element<2,3>(a);
1644 T const a30=mat_traits<A>::template read_element<3,0>(a);
1645 T const a31=mat_traits<A>::template read_element<3,1>(a);
1646 T const a32=mat_traits<A>::template read_element<3,2>(a);
1647 T const a33=mat_traits<A>::template read_element<3,3>(a);
1648 T det=(a00*(a11*(a22*a33-a23*a32)-a12*(a21*a33-a23*a31)+a13*(a21*a32-a22*a31))-a01*(a10*(a22*a33-a23*a32)-a12*(a20*a33-a23*a30)+a13*(a20*a32-a22*a30))+a02*(a10*(a21*a33-a23*a31)-a11*(a20*a33-a23*a30)+a13*(a20*a31-a21*a30))-a03*(a10*(a21*a32-a22*a31)-a11*(a20*a32-a22*a30)+a12*(a20*a31-a21*a30)));
1655 using ::boost::qvm::determinant;
1662 struct determinant_defined;
1666 determinant_defined<4>
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==4 && mat_traits<A>::cols==4 && is_scalar<B>::value,
1676 deduce_mat<A> >::type
1677 inverse( A const & a, B det )
1679 typedef typename mat_traits<A>::scalar_type T;
1680 BOOST_QVM_ASSERT(det!=scalar_traits<B>::value(0));
1681 T const a00=mat_traits<A>::template read_element<0,0>(a);
1682 T const a01=mat_traits<A>::template read_element<0,1>(a);
1683 T const a02=mat_traits<A>::template read_element<0,2>(a);
1684 T const a03=mat_traits<A>::template read_element<0,3>(a);
1685 T const a10=mat_traits<A>::template read_element<1,0>(a);
1686 T const a11=mat_traits<A>::template read_element<1,1>(a);
1687 T const a12=mat_traits<A>::template read_element<1,2>(a);
1688 T const a13=mat_traits<A>::template read_element<1,3>(a);
1689 T const a20=mat_traits<A>::template read_element<2,0>(a);
1690 T const a21=mat_traits<A>::template read_element<2,1>(a);
1691 T const a22=mat_traits<A>::template read_element<2,2>(a);
1692 T const a23=mat_traits<A>::template read_element<2,3>(a);
1693 T const a30=mat_traits<A>::template read_element<3,0>(a);
1694 T const a31=mat_traits<A>::template read_element<3,1>(a);
1695 T const a32=mat_traits<A>::template read_element<3,2>(a);
1696 T const a33=mat_traits<A>::template read_element<3,3>(a);
1697 T const f=scalar_traits<T>::value(1)/det;
1698 typedef typename deduce_mat<A>::type R;
1700 mat_traits<R>::template write_element<0,0>(r)= f*(a11*(a22*a33-a23*a32)-a12*(a21*a33-a23*a31)+a13*(a21*a32-a22*a31));
1701 mat_traits<R>::template write_element<0,1>(r)=-f*(a01*(a22*a33-a23*a32)-a02*(a21*a33-a23*a31)+a03*(a21*a32-a22*a31));
1702 mat_traits<R>::template write_element<0,2>(r)= f*(a01*(a12*a33-a13*a32)-a02*(a11*a33-a13*a31)+a03*(a11*a32-a12*a31));
1703 mat_traits<R>::template write_element<0,3>(r)=-f*(a01*(a12*a23-a13*a22)-a02*(a11*a23-a13*a21)+a03*(a11*a22-a12*a21));
1704 mat_traits<R>::template write_element<1,0>(r)=-f*(a10*(a22*a33-a23*a32)-a12*(a20*a33-a23*a30)+a13*(a20*a32-a22*a30));
1705 mat_traits<R>::template write_element<1,1>(r)= f*(a00*(a22*a33-a23*a32)-a02*(a20*a33-a23*a30)+a03*(a20*a32-a22*a30));
1706 mat_traits<R>::template write_element<1,2>(r)=-f*(a00*(a12*a33-a13*a32)-a02*(a10*a33-a13*a30)+a03*(a10*a32-a12*a30));
1707 mat_traits<R>::template write_element<1,3>(r)= f*(a00*(a12*a23-a13*a22)-a02*(a10*a23-a13*a20)+a03*(a10*a22-a12*a20));
1708 mat_traits<R>::template write_element<2,0>(r)= f*(a10*(a21*a33-a23*a31)-a11*(a20*a33-a23*a30)+a13*(a20*a31-a21*a30));
1709 mat_traits<R>::template write_element<2,1>(r)=-f*(a00*(a21*a33-a23*a31)-a01*(a20*a33-a23*a30)+a03*(a20*a31-a21*a30));
1710 mat_traits<R>::template write_element<2,2>(r)= f*(a00*(a11*a33-a13*a31)-a01*(a10*a33-a13*a30)+a03*(a10*a31-a11*a30));
1711 mat_traits<R>::template write_element<2,3>(r)=-f*(a00*(a11*a23-a13*a21)-a01*(a10*a23-a13*a20)+a03*(a10*a21-a11*a20));
1712 mat_traits<R>::template write_element<3,0>(r)=-f*(a10*(a21*a32-a22*a31)-a11*(a20*a32-a22*a30)+a12*(a20*a31-a21*a30));
1713 mat_traits<R>::template write_element<3,1>(r)= f*(a00*(a21*a32-a22*a31)-a01*(a20*a32-a22*a30)+a02*(a20*a31-a21*a30));
1714 mat_traits<R>::template write_element<3,2>(r)=-f*(a00*(a11*a32-a12*a31)-a01*(a10*a32-a12*a30)+a02*(a10*a31-a11*a30));
1715 mat_traits<R>::template write_element<3,3>(r)= f*(a00*(a11*a22-a12*a21)-a01*(a10*a22-a12*a20)+a02*(a10*a21-a11*a20));
1720 BOOST_QVM_INLINE_OPERATIONS
1721 typename lazy_enable_if_c<
1722 mat_traits<A>::rows==4 && mat_traits<A>::cols==4,
1723 deduce_mat<A> >::type
1724 inverse( A const & a )
1726 typedef typename mat_traits<A>::scalar_type T;
1727 T det=determinant(a);
1728 if( det==scalar_traits<T>::value(0) )
1729 BOOST_QVM_THROW_EXCEPTION(zero_determinant_error());
1730 return inverse(a,det);
1736 using ::boost::qvm::inverse;
1743 struct inverse_m_defined;
1747 inverse_m_defined<4>
1749 static bool const value=true;
1753 template <class A,class B>
1754 BOOST_QVM_INLINE_OPERATIONS
1755 typename lazy_enable_if_c<
1756 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
1757 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
1758 deduce_mat2<A,B,4,4> >::type
1759 operator*( A const & a, B const & b )
1761 typedef typename mat_traits<A>::scalar_type Ta;
1762 typedef typename mat_traits<B>::scalar_type Tb;
1763 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
1764 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
1765 Ta const a02 = mat_traits<A>::template read_element<0,2>(a);
1766 Ta const a03 = mat_traits<A>::template read_element<0,3>(a);
1767 Ta const a10 = mat_traits<A>::template read_element<1,0>(a);
1768 Ta const a11 = mat_traits<A>::template read_element<1,1>(a);
1769 Ta const a12 = mat_traits<A>::template read_element<1,2>(a);
1770 Ta const a13 = mat_traits<A>::template read_element<1,3>(a);
1771 Ta const a20 = mat_traits<A>::template read_element<2,0>(a);
1772 Ta const a21 = mat_traits<A>::template read_element<2,1>(a);
1773 Ta const a22 = mat_traits<A>::template read_element<2,2>(a);
1774 Ta const a23 = mat_traits<A>::template read_element<2,3>(a);
1775 Ta const a30 = mat_traits<A>::template read_element<3,0>(a);
1776 Ta const a31 = mat_traits<A>::template read_element<3,1>(a);
1777 Ta const a32 = mat_traits<A>::template read_element<3,2>(a);
1778 Ta const a33 = mat_traits<A>::template read_element<3,3>(a);
1779 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
1780 Tb const b01 = mat_traits<B>::template read_element<0,1>(b);
1781 Tb const b02 = mat_traits<B>::template read_element<0,2>(b);
1782 Tb const b03 = mat_traits<B>::template read_element<0,3>(b);
1783 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
1784 Tb const b11 = mat_traits<B>::template read_element<1,1>(b);
1785 Tb const b12 = mat_traits<B>::template read_element<1,2>(b);
1786 Tb const b13 = mat_traits<B>::template read_element<1,3>(b);
1787 Tb const b20 = mat_traits<B>::template read_element<2,0>(b);
1788 Tb const b21 = mat_traits<B>::template read_element<2,1>(b);
1789 Tb const b22 = mat_traits<B>::template read_element<2,2>(b);
1790 Tb const b23 = mat_traits<B>::template read_element<2,3>(b);
1791 Tb const b30 = mat_traits<B>::template read_element<3,0>(b);
1792 Tb const b31 = mat_traits<B>::template read_element<3,1>(b);
1793 Tb const b32 = mat_traits<B>::template read_element<3,2>(b);
1794 Tb const b33 = mat_traits<B>::template read_element<3,3>(b);
1795 typedef typename deduce_mat2<A,B,4,4>::type R;
1796 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==4);
1797 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==4);
1799 mat_traits<R>::template write_element<0,0>(r)=a00*b00+a01*b10+a02*b20+a03*b30;
1800 mat_traits<R>::template write_element<0,1>(r)=a00*b01+a01*b11+a02*b21+a03*b31;
1801 mat_traits<R>::template write_element<0,2>(r)=a00*b02+a01*b12+a02*b22+a03*b32;
1802 mat_traits<R>::template write_element<0,3>(r)=a00*b03+a01*b13+a02*b23+a03*b33;
1803 mat_traits<R>::template write_element<1,0>(r)=a10*b00+a11*b10+a12*b20+a13*b30;
1804 mat_traits<R>::template write_element<1,1>(r)=a10*b01+a11*b11+a12*b21+a13*b31;
1805 mat_traits<R>::template write_element<1,2>(r)=a10*b02+a11*b12+a12*b22+a13*b32;
1806 mat_traits<R>::template write_element<1,3>(r)=a10*b03+a11*b13+a12*b23+a13*b33;
1807 mat_traits<R>::template write_element<2,0>(r)=a20*b00+a21*b10+a22*b20+a23*b30;
1808 mat_traits<R>::template write_element<2,1>(r)=a20*b01+a21*b11+a22*b21+a23*b31;
1809 mat_traits<R>::template write_element<2,2>(r)=a20*b02+a21*b12+a22*b22+a23*b32;
1810 mat_traits<R>::template write_element<2,3>(r)=a20*b03+a21*b13+a22*b23+a23*b33;
1811 mat_traits<R>::template write_element<3,0>(r)=a30*b00+a31*b10+a32*b20+a33*b30;
1812 mat_traits<R>::template write_element<3,1>(r)=a30*b01+a31*b11+a32*b21+a33*b31;
1813 mat_traits<R>::template write_element<3,2>(r)=a30*b02+a31*b12+a32*b22+a33*b32;
1814 mat_traits<R>::template write_element<3,3>(r)=a30*b03+a31*b13+a32*b23+a33*b33;
1821 using ::boost::qvm::operator*;
1827 template <int R,int CR,int C>
1828 struct mul_mm_defined;
1832 mul_mm_defined<4,4,4>
1834 static bool const value=true;
1838 template <class A,class B>
1839 BOOST_QVM_INLINE_OPERATIONS
1840 typename enable_if_c<
1841 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
1842 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
1844 operator*=( A & a, B const & b )
1846 typedef typename mat_traits<A>::scalar_type Ta;
1847 typedef typename mat_traits<B>::scalar_type Tb;
1848 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
1849 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
1850 Ta const a02 = mat_traits<A>::template read_element<0,2>(a);
1851 Ta const a03 = mat_traits<A>::template read_element<0,3>(a);
1852 Ta const a10 = mat_traits<A>::template read_element<1,0>(a);
1853 Ta const a11 = mat_traits<A>::template read_element<1,1>(a);
1854 Ta const a12 = mat_traits<A>::template read_element<1,2>(a);
1855 Ta const a13 = mat_traits<A>::template read_element<1,3>(a);
1856 Ta const a20 = mat_traits<A>::template read_element<2,0>(a);
1857 Ta const a21 = mat_traits<A>::template read_element<2,1>(a);
1858 Ta const a22 = mat_traits<A>::template read_element<2,2>(a);
1859 Ta const a23 = mat_traits<A>::template read_element<2,3>(a);
1860 Ta const a30 = mat_traits<A>::template read_element<3,0>(a);
1861 Ta const a31 = mat_traits<A>::template read_element<3,1>(a);
1862 Ta const a32 = mat_traits<A>::template read_element<3,2>(a);
1863 Ta const a33 = mat_traits<A>::template read_element<3,3>(a);
1864 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
1865 Tb const b01 = mat_traits<B>::template read_element<0,1>(b);
1866 Tb const b02 = mat_traits<B>::template read_element<0,2>(b);
1867 Tb const b03 = mat_traits<B>::template read_element<0,3>(b);
1868 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
1869 Tb const b11 = mat_traits<B>::template read_element<1,1>(b);
1870 Tb const b12 = mat_traits<B>::template read_element<1,2>(b);
1871 Tb const b13 = mat_traits<B>::template read_element<1,3>(b);
1872 Tb const b20 = mat_traits<B>::template read_element<2,0>(b);
1873 Tb const b21 = mat_traits<B>::template read_element<2,1>(b);
1874 Tb const b22 = mat_traits<B>::template read_element<2,2>(b);
1875 Tb const b23 = mat_traits<B>::template read_element<2,3>(b);
1876 Tb const b30 = mat_traits<B>::template read_element<3,0>(b);
1877 Tb const b31 = mat_traits<B>::template read_element<3,1>(b);
1878 Tb const b32 = mat_traits<B>::template read_element<3,2>(b);
1879 Tb const b33 = mat_traits<B>::template read_element<3,3>(b);
1880 mat_traits<A>::template write_element<0,0>(a)=a00*b00+a01*b10+a02*b20+a03*b30;
1881 mat_traits<A>::template write_element<0,1>(a)=a00*b01+a01*b11+a02*b21+a03*b31;
1882 mat_traits<A>::template write_element<0,2>(a)=a00*b02+a01*b12+a02*b22+a03*b32;
1883 mat_traits<A>::template write_element<0,3>(a)=a00*b03+a01*b13+a02*b23+a03*b33;
1884 mat_traits<A>::template write_element<1,0>(a)=a10*b00+a11*b10+a12*b20+a13*b30;
1885 mat_traits<A>::template write_element<1,1>(a)=a10*b01+a11*b11+a12*b21+a13*b31;
1886 mat_traits<A>::template write_element<1,2>(a)=a10*b02+a11*b12+a12*b22+a13*b32;
1887 mat_traits<A>::template write_element<1,3>(a)=a10*b03+a11*b13+a12*b23+a13*b33;
1888 mat_traits<A>::template write_element<2,0>(a)=a20*b00+a21*b10+a22*b20+a23*b30;
1889 mat_traits<A>::template write_element<2,1>(a)=a20*b01+a21*b11+a22*b21+a23*b31;
1890 mat_traits<A>::template write_element<2,2>(a)=a20*b02+a21*b12+a22*b22+a23*b32;
1891 mat_traits<A>::template write_element<2,3>(a)=a20*b03+a21*b13+a22*b23+a23*b33;
1892 mat_traits<A>::template write_element<3,0>(a)=a30*b00+a31*b10+a32*b20+a33*b30;
1893 mat_traits<A>::template write_element<3,1>(a)=a30*b01+a31*b11+a32*b21+a33*b31;
1894 mat_traits<A>::template write_element<3,2>(a)=a30*b02+a31*b12+a32*b22+a33*b32;
1895 mat_traits<A>::template write_element<3,3>(a)=a30*b03+a31*b13+a32*b23+a33*b33;
1902 using ::boost::qvm::operator*=;
1909 struct mul_eq_mm_defined;
1913 mul_eq_mm_defined<4>
1915 static bool const value=true;
1919 template <class A,class B>
1920 BOOST_QVM_INLINE_OPERATIONS
1921 typename lazy_enable_if_c<
1922 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
1923 mat_traits<A>::cols==4 && mat_traits<B>::cols==1,
1924 deduce_mat2<A,B,4,1> >::type
1925 operator*( A const & a, B const & b )
1927 typedef typename mat_traits<A>::scalar_type Ta;
1928 typedef typename mat_traits<B>::scalar_type Tb;
1929 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
1930 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
1931 Ta const a02 = mat_traits<A>::template read_element<0,2>(a);
1932 Ta const a03 = mat_traits<A>::template read_element<0,3>(a);
1933 Ta const a10 = mat_traits<A>::template read_element<1,0>(a);
1934 Ta const a11 = mat_traits<A>::template read_element<1,1>(a);
1935 Ta const a12 = mat_traits<A>::template read_element<1,2>(a);
1936 Ta const a13 = mat_traits<A>::template read_element<1,3>(a);
1937 Ta const a20 = mat_traits<A>::template read_element<2,0>(a);
1938 Ta const a21 = mat_traits<A>::template read_element<2,1>(a);
1939 Ta const a22 = mat_traits<A>::template read_element<2,2>(a);
1940 Ta const a23 = mat_traits<A>::template read_element<2,3>(a);
1941 Ta const a30 = mat_traits<A>::template read_element<3,0>(a);
1942 Ta const a31 = mat_traits<A>::template read_element<3,1>(a);
1943 Ta const a32 = mat_traits<A>::template read_element<3,2>(a);
1944 Ta const a33 = mat_traits<A>::template read_element<3,3>(a);
1945 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
1946 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
1947 Tb const b20 = mat_traits<B>::template read_element<2,0>(b);
1948 Tb const b30 = mat_traits<B>::template read_element<3,0>(b);
1949 typedef typename deduce_mat2<A,B,4,1>::type R;
1950 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==4);
1951 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==1);
1953 mat_traits<R>::template write_element<0,0>(r)=a00*b00+a01*b10+a02*b20+a03*b30;
1954 mat_traits<R>::template write_element<1,0>(r)=a10*b00+a11*b10+a12*b20+a13*b30;
1955 mat_traits<R>::template write_element<2,0>(r)=a20*b00+a21*b10+a22*b20+a23*b30;
1956 mat_traits<R>::template write_element<3,0>(r)=a30*b00+a31*b10+a32*b20+a33*b30;
1963 using ::boost::qvm::operator*;
1969 template <int R,int CR,int C>
1970 struct mul_mm_defined;
1974 mul_mm_defined<4,4,1>
1976 static bool const value=true;
1980 template <class A,class B>
1981 BOOST_QVM_INLINE_OPERATIONS
1982 typename lazy_enable_if_c<
1983 mat_traits<A>::rows==1 && mat_traits<B>::rows==4 &&
1984 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
1985 deduce_mat2<A,B,1,4> >::type
1986 operator*( A const & a, B const & b )
1988 typedef typename mat_traits<A>::scalar_type Ta;
1989 typedef typename mat_traits<B>::scalar_type Tb;
1990 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
1991 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
1992 Ta const a02 = mat_traits<A>::template read_element<0,2>(a);
1993 Ta const a03 = mat_traits<A>::template read_element<0,3>(a);
1994 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
1995 Tb const b01 = mat_traits<B>::template read_element<0,1>(b);
1996 Tb const b02 = mat_traits<B>::template read_element<0,2>(b);
1997 Tb const b03 = mat_traits<B>::template read_element<0,3>(b);
1998 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
1999 Tb const b11 = mat_traits<B>::template read_element<1,1>(b);
2000 Tb const b12 = mat_traits<B>::template read_element<1,2>(b);
2001 Tb const b13 = mat_traits<B>::template read_element<1,3>(b);
2002 Tb const b20 = mat_traits<B>::template read_element<2,0>(b);
2003 Tb const b21 = mat_traits<B>::template read_element<2,1>(b);
2004 Tb const b22 = mat_traits<B>::template read_element<2,2>(b);
2005 Tb const b23 = mat_traits<B>::template read_element<2,3>(b);
2006 Tb const b30 = mat_traits<B>::template read_element<3,0>(b);
2007 Tb const b31 = mat_traits<B>::template read_element<3,1>(b);
2008 Tb const b32 = mat_traits<B>::template read_element<3,2>(b);
2009 Tb const b33 = mat_traits<B>::template read_element<3,3>(b);
2010 typedef typename deduce_mat2<A,B,1,4>::type R;
2011 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==1);
2012 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==4);
2014 mat_traits<R>::template write_element<0,0>(r)=a00*b00+a01*b10+a02*b20+a03*b30;
2015 mat_traits<R>::template write_element<0,1>(r)=a00*b01+a01*b11+a02*b21+a03*b31;
2016 mat_traits<R>::template write_element<0,2>(r)=a00*b02+a01*b12+a02*b22+a03*b32;
2017 mat_traits<R>::template write_element<0,3>(r)=a00*b03+a01*b13+a02*b23+a03*b33;
2024 using ::boost::qvm::operator*;
2030 template <int R,int CR,int C>
2031 struct mul_mm_defined;
2035 mul_mm_defined<1,4,4>
2037 static bool const value=true;