1 //Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc.
\r
3 //Distributed under the Boost Software License, Version 1.0. (See accompanying
\r
4 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
\r
6 #ifndef BOOST_QVM_B3124DC843BB8BA61F35A7D938251F
\r
7 #define BOOST_QVM_B3124DC843BB8BA61F35A7D938251F
\r
9 //This file was generated by a program. Do not edit manually.
\r
11 #include <boost/qvm/assert.hpp>
\r
12 #include <boost/qvm/deduce_mat.hpp>
\r
13 #include <boost/qvm/deduce_vec.hpp>
\r
14 #include <boost/qvm/enable_if.hpp>
\r
15 #include <boost/qvm/error.hpp>
\r
16 #include <boost/qvm/inline.hpp>
\r
17 #include <boost/qvm/mat_traits.hpp>
\r
18 #include <boost/qvm/quat_traits.hpp>
\r
19 #include <boost/qvm/scalar_traits.hpp>
\r
20 #include <boost/qvm/throw_exception.hpp>
\r
28 template <class A,class B>
\r
29 BOOST_QVM_INLINE_OPERATIONS
\r
30 typename lazy_enable_if_c<
\r
31 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
\r
32 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
\r
33 deduce_mat2<A,B,4,4> >::type
\r
34 operator+( A const & a, B const & b )
\r
36 typedef typename deduce_mat2<A,B,4,4>::type R;
\r
37 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==4);
\r
38 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==4);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
62 using ::boost::qvm::operator+;
\r
68 template <int R,int C>
\r
69 struct plus_mm_defined;
\r
73 plus_mm_defined<4,4>
\r
75 static bool const value=true;
\r
79 template <class A,class B>
\r
80 BOOST_QVM_INLINE_OPERATIONS
\r
81 typename lazy_enable_if_c<
\r
82 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
\r
83 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
\r
84 deduce_mat2<A,B,4,1> >::type
\r
85 operator+( A const & a, B const & b )
\r
87 typedef typename deduce_mat2<A,B,4,1>::type R;
\r
88 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==4);
\r
89 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==1);
\r
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);
\r
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);
\r
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);
\r
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);
\r
101 using ::boost::qvm::operator+;
\r
107 template <int R,int C>
\r
108 struct plus_mm_defined;
\r
112 plus_mm_defined<4,1>
\r
114 static bool const value=true;
\r
118 template <class A,class B>
\r
119 BOOST_QVM_INLINE_OPERATIONS
\r
120 typename lazy_enable_if_c<
\r
121 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
\r
122 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
\r
123 deduce_mat2<A,B,1,4> >::type
\r
124 operator+( A const & a, B const & b )
\r
126 typedef typename deduce_mat2<A,B,1,4>::type R;
\r
127 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==1);
\r
128 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==4);
\r
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);
\r
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);
\r
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);
\r
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);
\r
140 using ::boost::qvm::operator+;
\r
146 template <int R,int C>
\r
147 struct plus_mm_defined;
\r
151 plus_mm_defined<1,4>
\r
153 static bool const value=true;
\r
157 template <class A,class B>
\r
158 BOOST_QVM_INLINE_OPERATIONS
\r
159 typename lazy_enable_if_c<
\r
160 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
\r
161 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
\r
162 deduce_mat2<A,B,4,4> >::type
\r
163 operator-( A const & a, B const & b )
\r
165 typedef typename deduce_mat2<A,B,4,4>::type R;
\r
166 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==4);
\r
167 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==4);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
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);
\r
191 using ::boost::qvm::operator-;
\r
197 template <int R,int C>
\r
198 struct minus_mm_defined;
\r
202 minus_mm_defined<4,4>
\r
204 static bool const value=true;
\r
208 template <class A,class B>
\r
209 BOOST_QVM_INLINE_OPERATIONS
\r
210 typename lazy_enable_if_c<
\r
211 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
\r
212 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
\r
213 deduce_mat2<A,B,4,1> >::type
\r
214 operator-( A const & a, B const & b )
\r
216 typedef typename deduce_mat2<A,B,4,1>::type R;
\r
217 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==4);
\r
218 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==1);
\r
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);
\r
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);
\r
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);
\r
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);
\r
230 using ::boost::qvm::operator-;
\r
236 template <int R,int C>
\r
237 struct minus_mm_defined;
\r
241 minus_mm_defined<4,1>
\r
243 static bool const value=true;
\r
247 template <class A,class B>
\r
248 BOOST_QVM_INLINE_OPERATIONS
\r
249 typename lazy_enable_if_c<
\r
250 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
\r
251 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
\r
252 deduce_mat2<A,B,1,4> >::type
\r
253 operator-( A const & a, B const & b )
\r
255 typedef typename deduce_mat2<A,B,1,4>::type R;
\r
256 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==1);
\r
257 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==4);
\r
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);
\r
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);
\r
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);
\r
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);
\r
269 using ::boost::qvm::operator-;
\r
275 template <int R,int C>
\r
276 struct minus_mm_defined;
\r
280 minus_mm_defined<1,4>
\r
282 static bool const value=true;
\r
286 template <class A,class B>
\r
287 BOOST_QVM_INLINE_OPERATIONS
\r
288 typename enable_if_c<
\r
289 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
\r
290 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
\r
292 operator+=( A & a, B const & b )
\r
294 mat_traits<A>::template write_element<0,0>(a)+=mat_traits<B>::template read_element<0,0>(b);
\r
295 mat_traits<A>::template write_element<0,1>(a)+=mat_traits<B>::template read_element<0,1>(b);
\r
296 mat_traits<A>::template write_element<0,2>(a)+=mat_traits<B>::template read_element<0,2>(b);
\r
297 mat_traits<A>::template write_element<0,3>(a)+=mat_traits<B>::template read_element<0,3>(b);
\r
298 mat_traits<A>::template write_element<1,0>(a)+=mat_traits<B>::template read_element<1,0>(b);
\r
299 mat_traits<A>::template write_element<1,1>(a)+=mat_traits<B>::template read_element<1,1>(b);
\r
300 mat_traits<A>::template write_element<1,2>(a)+=mat_traits<B>::template read_element<1,2>(b);
\r
301 mat_traits<A>::template write_element<1,3>(a)+=mat_traits<B>::template read_element<1,3>(b);
\r
302 mat_traits<A>::template write_element<2,0>(a)+=mat_traits<B>::template read_element<2,0>(b);
\r
303 mat_traits<A>::template write_element<2,1>(a)+=mat_traits<B>::template read_element<2,1>(b);
\r
304 mat_traits<A>::template write_element<2,2>(a)+=mat_traits<B>::template read_element<2,2>(b);
\r
305 mat_traits<A>::template write_element<2,3>(a)+=mat_traits<B>::template read_element<2,3>(b);
\r
306 mat_traits<A>::template write_element<3,0>(a)+=mat_traits<B>::template read_element<3,0>(b);
\r
307 mat_traits<A>::template write_element<3,1>(a)+=mat_traits<B>::template read_element<3,1>(b);
\r
308 mat_traits<A>::template write_element<3,2>(a)+=mat_traits<B>::template read_element<3,2>(b);
\r
309 mat_traits<A>::template write_element<3,3>(a)+=mat_traits<B>::template read_element<3,3>(b);
\r
316 using ::boost::qvm::operator+=;
\r
322 template <int R,int C>
\r
323 struct plus_eq_mm_defined;
\r
327 plus_eq_mm_defined<4,4>
\r
329 static bool const value=true;
\r
333 template <class A,class B>
\r
334 BOOST_QVM_INLINE_OPERATIONS
\r
335 typename enable_if_c<
\r
336 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
\r
337 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
\r
339 operator+=( A & a, B const & b )
\r
341 mat_traits<A>::template write_element<0,0>(a)+=mat_traits<B>::template read_element<0,0>(b);
\r
342 mat_traits<A>::template write_element<1,0>(a)+=mat_traits<B>::template read_element<1,0>(b);
\r
343 mat_traits<A>::template write_element<2,0>(a)+=mat_traits<B>::template read_element<2,0>(b);
\r
344 mat_traits<A>::template write_element<3,0>(a)+=mat_traits<B>::template read_element<3,0>(b);
\r
351 using ::boost::qvm::operator+=;
\r
357 template <int R,int C>
\r
358 struct plus_eq_mm_defined;
\r
362 plus_eq_mm_defined<4,1>
\r
364 static bool const value=true;
\r
368 template <class A,class B>
\r
369 BOOST_QVM_INLINE_OPERATIONS
\r
370 typename enable_if_c<
\r
371 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
\r
372 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
\r
374 operator+=( A & a, B const & b )
\r
376 mat_traits<A>::template write_element<0,0>(a)+=mat_traits<B>::template read_element<0,0>(b);
\r
377 mat_traits<A>::template write_element<0,1>(a)+=mat_traits<B>::template read_element<0,1>(b);
\r
378 mat_traits<A>::template write_element<0,2>(a)+=mat_traits<B>::template read_element<0,2>(b);
\r
379 mat_traits<A>::template write_element<0,3>(a)+=mat_traits<B>::template read_element<0,3>(b);
\r
386 using ::boost::qvm::operator+=;
\r
392 template <int R,int C>
\r
393 struct plus_eq_mm_defined;
\r
397 plus_eq_mm_defined<1,4>
\r
399 static bool const value=true;
\r
403 template <class A,class B>
\r
404 BOOST_QVM_INLINE_OPERATIONS
\r
405 typename enable_if_c<
\r
406 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
\r
407 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
\r
409 operator-=( A & a, B const & b )
\r
411 mat_traits<A>::template write_element<0,0>(a)-=mat_traits<B>::template read_element<0,0>(b);
\r
412 mat_traits<A>::template write_element<0,1>(a)-=mat_traits<B>::template read_element<0,1>(b);
\r
413 mat_traits<A>::template write_element<0,2>(a)-=mat_traits<B>::template read_element<0,2>(b);
\r
414 mat_traits<A>::template write_element<0,3>(a)-=mat_traits<B>::template read_element<0,3>(b);
\r
415 mat_traits<A>::template write_element<1,0>(a)-=mat_traits<B>::template read_element<1,0>(b);
\r
416 mat_traits<A>::template write_element<1,1>(a)-=mat_traits<B>::template read_element<1,1>(b);
\r
417 mat_traits<A>::template write_element<1,2>(a)-=mat_traits<B>::template read_element<1,2>(b);
\r
418 mat_traits<A>::template write_element<1,3>(a)-=mat_traits<B>::template read_element<1,3>(b);
\r
419 mat_traits<A>::template write_element<2,0>(a)-=mat_traits<B>::template read_element<2,0>(b);
\r
420 mat_traits<A>::template write_element<2,1>(a)-=mat_traits<B>::template read_element<2,1>(b);
\r
421 mat_traits<A>::template write_element<2,2>(a)-=mat_traits<B>::template read_element<2,2>(b);
\r
422 mat_traits<A>::template write_element<2,3>(a)-=mat_traits<B>::template read_element<2,3>(b);
\r
423 mat_traits<A>::template write_element<3,0>(a)-=mat_traits<B>::template read_element<3,0>(b);
\r
424 mat_traits<A>::template write_element<3,1>(a)-=mat_traits<B>::template read_element<3,1>(b);
\r
425 mat_traits<A>::template write_element<3,2>(a)-=mat_traits<B>::template read_element<3,2>(b);
\r
426 mat_traits<A>::template write_element<3,3>(a)-=mat_traits<B>::template read_element<3,3>(b);
\r
433 using ::boost::qvm::operator-=;
\r
439 template <int R,int C>
\r
440 struct minus_eq_mm_defined;
\r
444 minus_eq_mm_defined<4,4>
\r
446 static bool const value=true;
\r
450 template <class A,class B>
\r
451 BOOST_QVM_INLINE_OPERATIONS
\r
452 typename enable_if_c<
\r
453 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
\r
454 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
\r
456 operator-=( A & a, B const & b )
\r
458 mat_traits<A>::template write_element<0,0>(a)-=mat_traits<B>::template read_element<0,0>(b);
\r
459 mat_traits<A>::template write_element<1,0>(a)-=mat_traits<B>::template read_element<1,0>(b);
\r
460 mat_traits<A>::template write_element<2,0>(a)-=mat_traits<B>::template read_element<2,0>(b);
\r
461 mat_traits<A>::template write_element<3,0>(a)-=mat_traits<B>::template read_element<3,0>(b);
\r
468 using ::boost::qvm::operator-=;
\r
474 template <int R,int C>
\r
475 struct minus_eq_mm_defined;
\r
479 minus_eq_mm_defined<4,1>
\r
481 static bool const value=true;
\r
485 template <class A,class B>
\r
486 BOOST_QVM_INLINE_OPERATIONS
\r
487 typename enable_if_c<
\r
488 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
\r
489 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
\r
491 operator-=( A & a, B const & b )
\r
493 mat_traits<A>::template write_element<0,0>(a)-=mat_traits<B>::template read_element<0,0>(b);
\r
494 mat_traits<A>::template write_element<0,1>(a)-=mat_traits<B>::template read_element<0,1>(b);
\r
495 mat_traits<A>::template write_element<0,2>(a)-=mat_traits<B>::template read_element<0,2>(b);
\r
496 mat_traits<A>::template write_element<0,3>(a)-=mat_traits<B>::template read_element<0,3>(b);
\r
503 using ::boost::qvm::operator-=;
\r
509 template <int R,int C>
\r
510 struct minus_eq_mm_defined;
\r
514 minus_eq_mm_defined<1,4>
\r
516 static bool const value=true;
\r
520 template <class A,class B>
\r
521 BOOST_QVM_INLINE_OPERATIONS
\r
522 typename lazy_enable_if_c<
\r
523 mat_traits<A>::rows==4 && mat_traits<A>::cols==4 && is_scalar<B>::value,
\r
524 deduce_mat<A> >::type
\r
525 operator*( A const & a, B b )
\r
527 typedef typename deduce_mat<A>::type R;
\r
529 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)*b;
\r
530 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)*b;
\r
531 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)*b;
\r
532 mat_traits<R>::template write_element<0,3>(r)=mat_traits<A>::template read_element<0,3>(a)*b;
\r
533 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)*b;
\r
534 mat_traits<R>::template write_element<1,1>(r)=mat_traits<A>::template read_element<1,1>(a)*b;
\r
535 mat_traits<R>::template write_element<1,2>(r)=mat_traits<A>::template read_element<1,2>(a)*b;
\r
536 mat_traits<R>::template write_element<1,3>(r)=mat_traits<A>::template read_element<1,3>(a)*b;
\r
537 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)*b;
\r
538 mat_traits<R>::template write_element<2,1>(r)=mat_traits<A>::template read_element<2,1>(a)*b;
\r
539 mat_traits<R>::template write_element<2,2>(r)=mat_traits<A>::template read_element<2,2>(a)*b;
\r
540 mat_traits<R>::template write_element<2,3>(r)=mat_traits<A>::template read_element<2,3>(a)*b;
\r
541 mat_traits<R>::template write_element<3,0>(r)=mat_traits<A>::template read_element<3,0>(a)*b;
\r
542 mat_traits<R>::template write_element<3,1>(r)=mat_traits<A>::template read_element<3,1>(a)*b;
\r
543 mat_traits<R>::template write_element<3,2>(r)=mat_traits<A>::template read_element<3,2>(a)*b;
\r
544 mat_traits<R>::template write_element<3,3>(r)=mat_traits<A>::template read_element<3,3>(a)*b;
\r
551 using ::boost::qvm::operator*;
\r
557 template <int R,int C>
\r
558 struct mul_ms_defined;
\r
562 mul_ms_defined<4,4>
\r
564 static bool const value=true;
\r
568 template <class A,class B>
\r
569 BOOST_QVM_INLINE_OPERATIONS
\r
570 typename lazy_enable_if_c<
\r
571 is_scalar<A>::value && mat_traits<B>::rows==4 && mat_traits<B>::cols==4,
\r
572 deduce_mat<B> >::type
\r
573 operator*( A a, B const & b )
\r
575 typedef typename deduce_mat<B>::type R;
\r
577 mat_traits<R>::template write_element<0,0>(r)=a*mat_traits<B>::template read_element<0,0>(b);
\r
578 mat_traits<R>::template write_element<0,1>(r)=a*mat_traits<B>::template read_element<0,1>(b);
\r
579 mat_traits<R>::template write_element<0,2>(r)=a*mat_traits<B>::template read_element<0,2>(b);
\r
580 mat_traits<R>::template write_element<0,3>(r)=a*mat_traits<B>::template read_element<0,3>(b);
\r
581 mat_traits<R>::template write_element<1,0>(r)=a*mat_traits<B>::template read_element<1,0>(b);
\r
582 mat_traits<R>::template write_element<1,1>(r)=a*mat_traits<B>::template read_element<1,1>(b);
\r
583 mat_traits<R>::template write_element<1,2>(r)=a*mat_traits<B>::template read_element<1,2>(b);
\r
584 mat_traits<R>::template write_element<1,3>(r)=a*mat_traits<B>::template read_element<1,3>(b);
\r
585 mat_traits<R>::template write_element<2,0>(r)=a*mat_traits<B>::template read_element<2,0>(b);
\r
586 mat_traits<R>::template write_element<2,1>(r)=a*mat_traits<B>::template read_element<2,1>(b);
\r
587 mat_traits<R>::template write_element<2,2>(r)=a*mat_traits<B>::template read_element<2,2>(b);
\r
588 mat_traits<R>::template write_element<2,3>(r)=a*mat_traits<B>::template read_element<2,3>(b);
\r
589 mat_traits<R>::template write_element<3,0>(r)=a*mat_traits<B>::template read_element<3,0>(b);
\r
590 mat_traits<R>::template write_element<3,1>(r)=a*mat_traits<B>::template read_element<3,1>(b);
\r
591 mat_traits<R>::template write_element<3,2>(r)=a*mat_traits<B>::template read_element<3,2>(b);
\r
592 mat_traits<R>::template write_element<3,3>(r)=a*mat_traits<B>::template read_element<3,3>(b);
\r
599 using ::boost::qvm::operator*;
\r
605 template <int R,int C>
\r
606 struct mul_sm_defined;
\r
610 mul_sm_defined<4,4>
\r
612 static bool const value=true;
\r
616 template <class A,class B>
\r
617 BOOST_QVM_INLINE_OPERATIONS
\r
618 typename lazy_enable_if_c<
\r
619 mat_traits<A>::rows==4 && mat_traits<A>::cols==1 && is_scalar<B>::value,
\r
620 deduce_mat<A> >::type
\r
621 operator*( A const & a, B b )
\r
623 typedef typename deduce_mat<A>::type R;
\r
625 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)*b;
\r
626 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)*b;
\r
627 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)*b;
\r
628 mat_traits<R>::template write_element<3,0>(r)=mat_traits<A>::template read_element<3,0>(a)*b;
\r
635 using ::boost::qvm::operator*;
\r
641 template <int R,int C>
\r
642 struct mul_ms_defined;
\r
646 mul_ms_defined<4,1>
\r
648 static bool const value=true;
\r
652 template <class A,class B>
\r
653 BOOST_QVM_INLINE_OPERATIONS
\r
654 typename lazy_enable_if_c<
\r
655 is_scalar<A>::value && mat_traits<B>::rows==4 && mat_traits<B>::cols==1,
\r
656 deduce_mat<B> >::type
\r
657 operator*( A a, B const & b )
\r
659 typedef typename deduce_mat<B>::type R;
\r
661 mat_traits<R>::template write_element<0,0>(r)=a*mat_traits<B>::template read_element<0,0>(b);
\r
662 mat_traits<R>::template write_element<1,0>(r)=a*mat_traits<B>::template read_element<1,0>(b);
\r
663 mat_traits<R>::template write_element<2,0>(r)=a*mat_traits<B>::template read_element<2,0>(b);
\r
664 mat_traits<R>::template write_element<3,0>(r)=a*mat_traits<B>::template read_element<3,0>(b);
\r
671 using ::boost::qvm::operator*;
\r
677 template <int R,int C>
\r
678 struct mul_sm_defined;
\r
682 mul_sm_defined<4,1>
\r
684 static bool const value=true;
\r
688 template <class A,class B>
\r
689 BOOST_QVM_INLINE_OPERATIONS
\r
690 typename lazy_enable_if_c<
\r
691 mat_traits<A>::rows==1 && mat_traits<A>::cols==4 && is_scalar<B>::value,
\r
692 deduce_mat<A> >::type
\r
693 operator*( A const & a, B b )
\r
695 typedef typename deduce_mat<A>::type R;
\r
697 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)*b;
\r
698 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)*b;
\r
699 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)*b;
\r
700 mat_traits<R>::template write_element<0,3>(r)=mat_traits<A>::template read_element<0,3>(a)*b;
\r
707 using ::boost::qvm::operator*;
\r
713 template <int R,int C>
\r
714 struct mul_ms_defined;
\r
718 mul_ms_defined<1,4>
\r
720 static bool const value=true;
\r
724 template <class A,class B>
\r
725 BOOST_QVM_INLINE_OPERATIONS
\r
726 typename lazy_enable_if_c<
\r
727 is_scalar<A>::value && mat_traits<B>::rows==1 && mat_traits<B>::cols==4,
\r
728 deduce_mat<B> >::type
\r
729 operator*( A a, B const & b )
\r
731 typedef typename deduce_mat<B>::type R;
\r
733 mat_traits<R>::template write_element<0,0>(r)=a*mat_traits<B>::template read_element<0,0>(b);
\r
734 mat_traits<R>::template write_element<0,1>(r)=a*mat_traits<B>::template read_element<0,1>(b);
\r
735 mat_traits<R>::template write_element<0,2>(r)=a*mat_traits<B>::template read_element<0,2>(b);
\r
736 mat_traits<R>::template write_element<0,3>(r)=a*mat_traits<B>::template read_element<0,3>(b);
\r
743 using ::boost::qvm::operator*;
\r
749 template <int R,int C>
\r
750 struct mul_sm_defined;
\r
754 mul_sm_defined<1,4>
\r
756 static bool const value=true;
\r
760 template <class A,class B>
\r
761 BOOST_QVM_INLINE_OPERATIONS
\r
762 typename enable_if_c<
\r
763 mat_traits<A>::rows==4 && mat_traits<A>::cols==4 && is_scalar<B>::value,
\r
765 operator*=( A & a, B b )
\r
767 mat_traits<A>::template write_element<0,0>(a)*=b;
\r
768 mat_traits<A>::template write_element<0,1>(a)*=b;
\r
769 mat_traits<A>::template write_element<0,2>(a)*=b;
\r
770 mat_traits<A>::template write_element<0,3>(a)*=b;
\r
771 mat_traits<A>::template write_element<1,0>(a)*=b;
\r
772 mat_traits<A>::template write_element<1,1>(a)*=b;
\r
773 mat_traits<A>::template write_element<1,2>(a)*=b;
\r
774 mat_traits<A>::template write_element<1,3>(a)*=b;
\r
775 mat_traits<A>::template write_element<2,0>(a)*=b;
\r
776 mat_traits<A>::template write_element<2,1>(a)*=b;
\r
777 mat_traits<A>::template write_element<2,2>(a)*=b;
\r
778 mat_traits<A>::template write_element<2,3>(a)*=b;
\r
779 mat_traits<A>::template write_element<3,0>(a)*=b;
\r
780 mat_traits<A>::template write_element<3,1>(a)*=b;
\r
781 mat_traits<A>::template write_element<3,2>(a)*=b;
\r
782 mat_traits<A>::template write_element<3,3>(a)*=b;
\r
789 using ::boost::qvm::operator*=;
\r
795 template <int R,int C>
\r
796 struct mul_eq_ms_defined;
\r
800 mul_eq_ms_defined<4,4>
\r
802 static bool const value=true;
\r
806 template <class A,class B>
\r
807 BOOST_QVM_INLINE_OPERATIONS
\r
808 typename enable_if_c<
\r
809 mat_traits<A>::rows==4 && mat_traits<A>::cols==1 && is_scalar<B>::value,
\r
811 operator*=( A & a, B b )
\r
813 mat_traits<A>::template write_element<0,0>(a)*=b;
\r
814 mat_traits<A>::template write_element<1,0>(a)*=b;
\r
815 mat_traits<A>::template write_element<2,0>(a)*=b;
\r
816 mat_traits<A>::template write_element<3,0>(a)*=b;
\r
823 using ::boost::qvm::operator*=;
\r
829 template <int R,int C>
\r
830 struct mul_eq_ms_defined;
\r
834 mul_eq_ms_defined<4,1>
\r
836 static bool const value=true;
\r
840 template <class A,class B>
\r
841 BOOST_QVM_INLINE_OPERATIONS
\r
842 typename enable_if_c<
\r
843 mat_traits<A>::rows==1 && mat_traits<A>::cols==4 && is_scalar<B>::value,
\r
845 operator*=( A & a, B b )
\r
847 mat_traits<A>::template write_element<0,0>(a)*=b;
\r
848 mat_traits<A>::template write_element<0,1>(a)*=b;
\r
849 mat_traits<A>::template write_element<0,2>(a)*=b;
\r
850 mat_traits<A>::template write_element<0,3>(a)*=b;
\r
857 using ::boost::qvm::operator*=;
\r
863 template <int R,int C>
\r
864 struct mul_eq_ms_defined;
\r
868 mul_eq_ms_defined<1,4>
\r
870 static bool const value=true;
\r
874 template <class A,class B>
\r
875 BOOST_QVM_INLINE_OPERATIONS
\r
876 typename lazy_enable_if_c<
\r
877 mat_traits<A>::rows==4 && mat_traits<A>::cols==4 && is_scalar<B>::value,
\r
878 deduce_mat<A> >::type
\r
879 operator/( A const & a, B b )
\r
881 typedef typename deduce_mat<A>::type R;
\r
883 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)/b;
\r
884 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)/b;
\r
885 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)/b;
\r
886 mat_traits<R>::template write_element<0,3>(r)=mat_traits<A>::template read_element<0,3>(a)/b;
\r
887 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)/b;
\r
888 mat_traits<R>::template write_element<1,1>(r)=mat_traits<A>::template read_element<1,1>(a)/b;
\r
889 mat_traits<R>::template write_element<1,2>(r)=mat_traits<A>::template read_element<1,2>(a)/b;
\r
890 mat_traits<R>::template write_element<1,3>(r)=mat_traits<A>::template read_element<1,3>(a)/b;
\r
891 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)/b;
\r
892 mat_traits<R>::template write_element<2,1>(r)=mat_traits<A>::template read_element<2,1>(a)/b;
\r
893 mat_traits<R>::template write_element<2,2>(r)=mat_traits<A>::template read_element<2,2>(a)/b;
\r
894 mat_traits<R>::template write_element<2,3>(r)=mat_traits<A>::template read_element<2,3>(a)/b;
\r
895 mat_traits<R>::template write_element<3,0>(r)=mat_traits<A>::template read_element<3,0>(a)/b;
\r
896 mat_traits<R>::template write_element<3,1>(r)=mat_traits<A>::template read_element<3,1>(a)/b;
\r
897 mat_traits<R>::template write_element<3,2>(r)=mat_traits<A>::template read_element<3,2>(a)/b;
\r
898 mat_traits<R>::template write_element<3,3>(r)=mat_traits<A>::template read_element<3,3>(a)/b;
\r
905 using ::boost::qvm::operator/;
\r
911 template <int R,int C>
\r
912 struct div_ms_defined;
\r
916 div_ms_defined<4,4>
\r
918 static bool const value=true;
\r
922 template <class A,class B>
\r
923 BOOST_QVM_INLINE_OPERATIONS
\r
924 typename lazy_enable_if_c<
\r
925 is_scalar<A>::value && mat_traits<B>::rows==4 && mat_traits<B>::cols==4,
\r
926 deduce_mat<B> >::type
\r
927 operator/( A a, B const & b )
\r
929 typedef typename deduce_mat<B>::type R;
\r
931 mat_traits<R>::template write_element<0,0>(r)=a/mat_traits<B>::template read_element<0,0>(b);
\r
932 mat_traits<R>::template write_element<0,1>(r)=a/mat_traits<B>::template read_element<0,1>(b);
\r
933 mat_traits<R>::template write_element<0,2>(r)=a/mat_traits<B>::template read_element<0,2>(b);
\r
934 mat_traits<R>::template write_element<0,3>(r)=a/mat_traits<B>::template read_element<0,3>(b);
\r
935 mat_traits<R>::template write_element<1,0>(r)=a/mat_traits<B>::template read_element<1,0>(b);
\r
936 mat_traits<R>::template write_element<1,1>(r)=a/mat_traits<B>::template read_element<1,1>(b);
\r
937 mat_traits<R>::template write_element<1,2>(r)=a/mat_traits<B>::template read_element<1,2>(b);
\r
938 mat_traits<R>::template write_element<1,3>(r)=a/mat_traits<B>::template read_element<1,3>(b);
\r
939 mat_traits<R>::template write_element<2,0>(r)=a/mat_traits<B>::template read_element<2,0>(b);
\r
940 mat_traits<R>::template write_element<2,1>(r)=a/mat_traits<B>::template read_element<2,1>(b);
\r
941 mat_traits<R>::template write_element<2,2>(r)=a/mat_traits<B>::template read_element<2,2>(b);
\r
942 mat_traits<R>::template write_element<2,3>(r)=a/mat_traits<B>::template read_element<2,3>(b);
\r
943 mat_traits<R>::template write_element<3,0>(r)=a/mat_traits<B>::template read_element<3,0>(b);
\r
944 mat_traits<R>::template write_element<3,1>(r)=a/mat_traits<B>::template read_element<3,1>(b);
\r
945 mat_traits<R>::template write_element<3,2>(r)=a/mat_traits<B>::template read_element<3,2>(b);
\r
946 mat_traits<R>::template write_element<3,3>(r)=a/mat_traits<B>::template read_element<3,3>(b);
\r
953 using ::boost::qvm::operator/;
\r
959 template <int R,int C>
\r
960 struct div_sm_defined;
\r
964 div_sm_defined<4,4>
\r
966 static bool const value=true;
\r
970 template <class A,class B>
\r
971 BOOST_QVM_INLINE_OPERATIONS
\r
972 typename lazy_enable_if_c<
\r
973 mat_traits<A>::rows==4 && mat_traits<A>::cols==1 && is_scalar<B>::value,
\r
974 deduce_mat<A> >::type
\r
975 operator/( A const & a, B b )
\r
977 typedef typename deduce_mat<A>::type R;
\r
979 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)/b;
\r
980 mat_traits<R>::template write_element<1,0>(r)=mat_traits<A>::template read_element<1,0>(a)/b;
\r
981 mat_traits<R>::template write_element<2,0>(r)=mat_traits<A>::template read_element<2,0>(a)/b;
\r
982 mat_traits<R>::template write_element<3,0>(r)=mat_traits<A>::template read_element<3,0>(a)/b;
\r
989 using ::boost::qvm::operator/;
\r
995 template <int R,int C>
\r
996 struct div_ms_defined;
\r
1000 div_ms_defined<4,1>
\r
1002 static bool const value=true;
\r
1006 template <class A,class B>
\r
1007 BOOST_QVM_INLINE_OPERATIONS
\r
1008 typename lazy_enable_if_c<
\r
1009 is_scalar<A>::value && mat_traits<B>::rows==4 && mat_traits<B>::cols==1,
\r
1010 deduce_mat<B> >::type
\r
1011 operator/( A a, B const & b )
\r
1013 typedef typename deduce_mat<B>::type R;
\r
1015 mat_traits<R>::template write_element<0,0>(r)=a/mat_traits<B>::template read_element<0,0>(b);
\r
1016 mat_traits<R>::template write_element<1,0>(r)=a/mat_traits<B>::template read_element<1,0>(b);
\r
1017 mat_traits<R>::template write_element<2,0>(r)=a/mat_traits<B>::template read_element<2,0>(b);
\r
1018 mat_traits<R>::template write_element<3,0>(r)=a/mat_traits<B>::template read_element<3,0>(b);
\r
1025 using ::boost::qvm::operator/;
\r
1031 template <int R,int C>
\r
1032 struct div_sm_defined;
\r
1036 div_sm_defined<4,1>
\r
1038 static bool const value=true;
\r
1042 template <class A,class B>
\r
1043 BOOST_QVM_INLINE_OPERATIONS
\r
1044 typename lazy_enable_if_c<
\r
1045 mat_traits<A>::rows==1 && mat_traits<A>::cols==4 && is_scalar<B>::value,
\r
1046 deduce_mat<A> >::type
\r
1047 operator/( A const & a, B b )
\r
1049 typedef typename deduce_mat<A>::type R;
\r
1051 mat_traits<R>::template write_element<0,0>(r)=mat_traits<A>::template read_element<0,0>(a)/b;
\r
1052 mat_traits<R>::template write_element<0,1>(r)=mat_traits<A>::template read_element<0,1>(a)/b;
\r
1053 mat_traits<R>::template write_element<0,2>(r)=mat_traits<A>::template read_element<0,2>(a)/b;
\r
1054 mat_traits<R>::template write_element<0,3>(r)=mat_traits<A>::template read_element<0,3>(a)/b;
\r
1061 using ::boost::qvm::operator/;
\r
1067 template <int R,int C>
\r
1068 struct div_ms_defined;
\r
1072 div_ms_defined<1,4>
\r
1074 static bool const value=true;
\r
1078 template <class A,class B>
\r
1079 BOOST_QVM_INLINE_OPERATIONS
\r
1080 typename enable_if_c<
\r
1081 mat_traits<A>::rows==4 && mat_traits<A>::cols==4 && is_scalar<B>::value,
\r
1083 operator/=( A & a, B b )
\r
1085 mat_traits<A>::template write_element<0,0>(a)/=b;
\r
1086 mat_traits<A>::template write_element<0,1>(a)/=b;
\r
1087 mat_traits<A>::template write_element<0,2>(a)/=b;
\r
1088 mat_traits<A>::template write_element<0,3>(a)/=b;
\r
1089 mat_traits<A>::template write_element<1,0>(a)/=b;
\r
1090 mat_traits<A>::template write_element<1,1>(a)/=b;
\r
1091 mat_traits<A>::template write_element<1,2>(a)/=b;
\r
1092 mat_traits<A>::template write_element<1,3>(a)/=b;
\r
1093 mat_traits<A>::template write_element<2,0>(a)/=b;
\r
1094 mat_traits<A>::template write_element<2,1>(a)/=b;
\r
1095 mat_traits<A>::template write_element<2,2>(a)/=b;
\r
1096 mat_traits<A>::template write_element<2,3>(a)/=b;
\r
1097 mat_traits<A>::template write_element<3,0>(a)/=b;
\r
1098 mat_traits<A>::template write_element<3,1>(a)/=b;
\r
1099 mat_traits<A>::template write_element<3,2>(a)/=b;
\r
1100 mat_traits<A>::template write_element<3,3>(a)/=b;
\r
1107 using ::boost::qvm::operator/=;
\r
1113 template <int R,int C>
\r
1114 struct div_eq_ms_defined;
\r
1118 div_eq_ms_defined<4,4>
\r
1120 static bool const value=true;
\r
1124 template <class A,class B>
\r
1125 BOOST_QVM_INLINE_OPERATIONS
\r
1126 typename enable_if_c<
\r
1127 mat_traits<A>::rows==4 && mat_traits<A>::cols==1 && is_scalar<B>::value,
\r
1129 operator/=( A & a, B b )
\r
1131 mat_traits<A>::template write_element<0,0>(a)/=b;
\r
1132 mat_traits<A>::template write_element<1,0>(a)/=b;
\r
1133 mat_traits<A>::template write_element<2,0>(a)/=b;
\r
1134 mat_traits<A>::template write_element<3,0>(a)/=b;
\r
1141 using ::boost::qvm::operator/=;
\r
1147 template <int R,int C>
\r
1148 struct div_eq_ms_defined;
\r
1152 div_eq_ms_defined<4,1>
\r
1154 static bool const value=true;
\r
1158 template <class A,class B>
\r
1159 BOOST_QVM_INLINE_OPERATIONS
\r
1160 typename enable_if_c<
\r
1161 mat_traits<A>::rows==1 && mat_traits<A>::cols==4 && is_scalar<B>::value,
\r
1163 operator/=( A & a, B b )
\r
1165 mat_traits<A>::template write_element<0,0>(a)/=b;
\r
1166 mat_traits<A>::template write_element<0,1>(a)/=b;
\r
1167 mat_traits<A>::template write_element<0,2>(a)/=b;
\r
1168 mat_traits<A>::template write_element<0,3>(a)/=b;
\r
1175 using ::boost::qvm::operator/=;
\r
1181 template <int R,int C>
\r
1182 struct div_eq_ms_defined;
\r
1186 div_eq_ms_defined<1,4>
\r
1188 static bool const value=true;
\r
1192 template <class A,class B>
\r
1193 BOOST_QVM_INLINE_OPERATIONS
\r
1194 typename enable_if_c<
\r
1195 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
\r
1196 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
\r
1198 assign( A & a, B const & b )
\r
1200 mat_traits<A>::template write_element<0,0>(a)=mat_traits<B>::template read_element<0,0>(b);
\r
1201 mat_traits<A>::template write_element<0,1>(a)=mat_traits<B>::template read_element<0,1>(b);
\r
1202 mat_traits<A>::template write_element<0,2>(a)=mat_traits<B>::template read_element<0,2>(b);
\r
1203 mat_traits<A>::template write_element<0,3>(a)=mat_traits<B>::template read_element<0,3>(b);
\r
1204 mat_traits<A>::template write_element<1,0>(a)=mat_traits<B>::template read_element<1,0>(b);
\r
1205 mat_traits<A>::template write_element<1,1>(a)=mat_traits<B>::template read_element<1,1>(b);
\r
1206 mat_traits<A>::template write_element<1,2>(a)=mat_traits<B>::template read_element<1,2>(b);
\r
1207 mat_traits<A>::template write_element<1,3>(a)=mat_traits<B>::template read_element<1,3>(b);
\r
1208 mat_traits<A>::template write_element<2,0>(a)=mat_traits<B>::template read_element<2,0>(b);
\r
1209 mat_traits<A>::template write_element<2,1>(a)=mat_traits<B>::template read_element<2,1>(b);
\r
1210 mat_traits<A>::template write_element<2,2>(a)=mat_traits<B>::template read_element<2,2>(b);
\r
1211 mat_traits<A>::template write_element<2,3>(a)=mat_traits<B>::template read_element<2,3>(b);
\r
1212 mat_traits<A>::template write_element<3,0>(a)=mat_traits<B>::template read_element<3,0>(b);
\r
1213 mat_traits<A>::template write_element<3,1>(a)=mat_traits<B>::template read_element<3,1>(b);
\r
1214 mat_traits<A>::template write_element<3,2>(a)=mat_traits<B>::template read_element<3,2>(b);
\r
1215 mat_traits<A>::template write_element<3,3>(a)=mat_traits<B>::template read_element<3,3>(b);
\r
1222 using ::boost::qvm::assign;
\r
1228 template <int R,int C>
\r
1229 struct assign_mm_defined;
\r
1233 assign_mm_defined<4,4>
\r
1235 static bool const value=true;
\r
1239 template <class A,class B>
\r
1240 BOOST_QVM_INLINE_OPERATIONS
\r
1241 typename enable_if_c<
\r
1242 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
\r
1243 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
\r
1245 assign( A & a, B const & b )
\r
1247 mat_traits<A>::template write_element<0,0>(a)=mat_traits<B>::template read_element<0,0>(b);
\r
1248 mat_traits<A>::template write_element<1,0>(a)=mat_traits<B>::template read_element<1,0>(b);
\r
1249 mat_traits<A>::template write_element<2,0>(a)=mat_traits<B>::template read_element<2,0>(b);
\r
1250 mat_traits<A>::template write_element<3,0>(a)=mat_traits<B>::template read_element<3,0>(b);
\r
1257 using ::boost::qvm::assign;
\r
1263 template <int R,int C>
\r
1264 struct assign_mm_defined;
\r
1268 assign_mm_defined<4,1>
\r
1270 static bool const value=true;
\r
1274 template <class A,class B>
\r
1275 BOOST_QVM_INLINE_OPERATIONS
\r
1276 typename enable_if_c<
\r
1277 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
\r
1278 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
\r
1280 assign( A & a, B const & b )
\r
1282 mat_traits<A>::template write_element<0,0>(a)=mat_traits<B>::template read_element<0,0>(b);
\r
1283 mat_traits<A>::template write_element<0,1>(a)=mat_traits<B>::template read_element<0,1>(b);
\r
1284 mat_traits<A>::template write_element<0,2>(a)=mat_traits<B>::template read_element<0,2>(b);
\r
1285 mat_traits<A>::template write_element<0,3>(a)=mat_traits<B>::template read_element<0,3>(b);
\r
1292 using ::boost::qvm::assign;
\r
1298 template <int R,int C>
\r
1299 struct assign_mm_defined;
\r
1303 assign_mm_defined<1,4>
\r
1305 static bool const value=true;
\r
1309 template <class R,class A>
\r
1310 BOOST_QVM_INLINE_OPERATIONS
\r
1311 typename enable_if_c<
\r
1312 mat_traits<R>::rows==4 && mat_traits<A>::rows==4 &&
\r
1313 mat_traits<R>::cols==4 && mat_traits<A>::cols==4,
\r
1315 convert_to( A const & a )
\r
1318 mat_traits<R>::template write_element<0,0>(r) = mat_traits<A>::template read_element<0,0>(a);
\r
1319 mat_traits<R>::template write_element<0,1>(r) = mat_traits<A>::template read_element<0,1>(a);
\r
1320 mat_traits<R>::template write_element<0,2>(r) = mat_traits<A>::template read_element<0,2>(a);
\r
1321 mat_traits<R>::template write_element<0,3>(r) = mat_traits<A>::template read_element<0,3>(a);
\r
1322 mat_traits<R>::template write_element<1,0>(r) = mat_traits<A>::template read_element<1,0>(a);
\r
1323 mat_traits<R>::template write_element<1,1>(r) = mat_traits<A>::template read_element<1,1>(a);
\r
1324 mat_traits<R>::template write_element<1,2>(r) = mat_traits<A>::template read_element<1,2>(a);
\r
1325 mat_traits<R>::template write_element<1,3>(r) = mat_traits<A>::template read_element<1,3>(a);
\r
1326 mat_traits<R>::template write_element<2,0>(r) = mat_traits<A>::template read_element<2,0>(a);
\r
1327 mat_traits<R>::template write_element<2,1>(r) = mat_traits<A>::template read_element<2,1>(a);
\r
1328 mat_traits<R>::template write_element<2,2>(r) = mat_traits<A>::template read_element<2,2>(a);
\r
1329 mat_traits<R>::template write_element<2,3>(r) = mat_traits<A>::template read_element<2,3>(a);
\r
1330 mat_traits<R>::template write_element<3,0>(r) = mat_traits<A>::template read_element<3,0>(a);
\r
1331 mat_traits<R>::template write_element<3,1>(r) = mat_traits<A>::template read_element<3,1>(a);
\r
1332 mat_traits<R>::template write_element<3,2>(r) = mat_traits<A>::template read_element<3,2>(a);
\r
1333 mat_traits<R>::template write_element<3,3>(r) = mat_traits<A>::template read_element<3,3>(a);
\r
1337 template <class R,class A>
\r
1339 typename enable_if_c<
\r
1340 is_mat<R>::value && is_quat<A>::value &&
\r
1341 mat_traits<R>::rows==4 && mat_traits<R>::cols==4,
\r
1343 convert_to( A const & q )
\r
1345 typedef typename mat_traits<R>::scalar_type T;
\r
1346 T const a=quat_traits<A>::template read_element<0>(q);
\r
1347 T const b=quat_traits<A>::template read_element<1>(q);
\r
1348 T const c=quat_traits<A>::template read_element<2>(q);
\r
1349 T const d=quat_traits<A>::template read_element<3>(q);
\r
1359 T const zero = scalar_traits<T>::value(0);
\r
1360 T const one = scalar_traits<T>::value(1);
\r
1361 T const two = one+one;
\r
1363 mat_traits<R>::template write_element<0,0>(r) = one - two*(cc+dd);
\r
1364 mat_traits<R>::template write_element<0,1>(r) = two*(bc-ad);
\r
1365 mat_traits<R>::template write_element<0,2>(r) = two*(bd+ac);
\r
1366 mat_traits<R>::template write_element<0,3>(r) = zero;
\r
1367 mat_traits<R>::template write_element<1,0>(r) = two*(bc+ad);
\r
1368 mat_traits<R>::template write_element<1,1>(r) = one - two*(bb+dd);
\r
1369 mat_traits<R>::template write_element<1,2>(r) = two*(cd-ab);
\r
1370 mat_traits<R>::template write_element<1,3>(r) = zero;
\r
1371 mat_traits<R>::template write_element<2,0>(r) = two*(bd-ac);
\r
1372 mat_traits<R>::template write_element<2,1>(r) = two*(cd+ab);
\r
1373 mat_traits<R>::template write_element<2,2>(r) = one - two*(bb+cc);
\r
1374 mat_traits<R>::template write_element<2,3>(r) = zero;
\r
1375 mat_traits<R>::template write_element<3,0>(r) = zero;
\r
1376 mat_traits<R>::template write_element<3,1>(r) = zero;
\r
1377 mat_traits<R>::template write_element<3,2>(r) = zero;
\r
1378 mat_traits<R>::template write_element<3,3>(r) = one;
\r
1385 using ::boost::qvm::convert_to;
\r
1391 template <int R,int C>
\r
1392 struct convert_to_m_defined;
\r
1396 convert_to_m_defined<4,4>
\r
1398 static bool const value=true;
\r
1402 template <class R,class A>
\r
1403 BOOST_QVM_INLINE_OPERATIONS
\r
1404 typename enable_if_c<
\r
1405 mat_traits<R>::rows==4 && mat_traits<A>::rows==4 &&
\r
1406 mat_traits<R>::cols==1 && mat_traits<A>::cols==1,
\r
1408 convert_to( A const & a )
\r
1411 mat_traits<R>::template write_element<0,0>(r) = mat_traits<A>::template read_element<0,0>(a);
\r
1412 mat_traits<R>::template write_element<1,0>(r) = mat_traits<A>::template read_element<1,0>(a);
\r
1413 mat_traits<R>::template write_element<2,0>(r) = mat_traits<A>::template read_element<2,0>(a);
\r
1414 mat_traits<R>::template write_element<3,0>(r) = mat_traits<A>::template read_element<3,0>(a);
\r
1421 using ::boost::qvm::convert_to;
\r
1427 template <int R,int C>
\r
1428 struct convert_to_m_defined;
\r
1432 convert_to_m_defined<4,1>
\r
1434 static bool const value=true;
\r
1438 template <class R,class A>
\r
1439 BOOST_QVM_INLINE_OPERATIONS
\r
1440 typename enable_if_c<
\r
1441 mat_traits<R>::rows==1 && mat_traits<A>::rows==1 &&
\r
1442 mat_traits<R>::cols==4 && mat_traits<A>::cols==4,
\r
1444 convert_to( A const & a )
\r
1447 mat_traits<R>::template write_element<0,0>(r) = mat_traits<A>::template read_element<0,0>(a);
\r
1448 mat_traits<R>::template write_element<0,1>(r) = mat_traits<A>::template read_element<0,1>(a);
\r
1449 mat_traits<R>::template write_element<0,2>(r) = mat_traits<A>::template read_element<0,2>(a);
\r
1450 mat_traits<R>::template write_element<0,3>(r) = mat_traits<A>::template read_element<0,3>(a);
\r
1457 using ::boost::qvm::convert_to;
\r
1463 template <int R,int C>
\r
1464 struct convert_to_m_defined;
\r
1468 convert_to_m_defined<1,4>
\r
1470 static bool const value=true;
\r
1474 template <class A,class B>
\r
1475 BOOST_QVM_INLINE_OPERATIONS
\r
1476 typename enable_if_c<
\r
1477 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
\r
1478 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
\r
1480 operator==( A const & a, B const & b )
\r
1483 mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b) &&
\r
1484 mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b) &&
\r
1485 mat_traits<A>::template read_element<0,2>(a)==mat_traits<B>::template read_element<0,2>(b) &&
\r
1486 mat_traits<A>::template read_element<0,3>(a)==mat_traits<B>::template read_element<0,3>(b) &&
\r
1487 mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b) &&
\r
1488 mat_traits<A>::template read_element<1,1>(a)==mat_traits<B>::template read_element<1,1>(b) &&
\r
1489 mat_traits<A>::template read_element<1,2>(a)==mat_traits<B>::template read_element<1,2>(b) &&
\r
1490 mat_traits<A>::template read_element<1,3>(a)==mat_traits<B>::template read_element<1,3>(b) &&
\r
1491 mat_traits<A>::template read_element<2,0>(a)==mat_traits<B>::template read_element<2,0>(b) &&
\r
1492 mat_traits<A>::template read_element<2,1>(a)==mat_traits<B>::template read_element<2,1>(b) &&
\r
1493 mat_traits<A>::template read_element<2,2>(a)==mat_traits<B>::template read_element<2,2>(b) &&
\r
1494 mat_traits<A>::template read_element<2,3>(a)==mat_traits<B>::template read_element<2,3>(b) &&
\r
1495 mat_traits<A>::template read_element<3,0>(a)==mat_traits<B>::template read_element<3,0>(b) &&
\r
1496 mat_traits<A>::template read_element<3,1>(a)==mat_traits<B>::template read_element<3,1>(b) &&
\r
1497 mat_traits<A>::template read_element<3,2>(a)==mat_traits<B>::template read_element<3,2>(b) &&
\r
1498 mat_traits<A>::template read_element<3,3>(a)==mat_traits<B>::template read_element<3,3>(b);
\r
1504 using ::boost::qvm::operator==;
\r
1510 template <int R,int C>
\r
1511 struct eq_mm_defined;
\r
1515 eq_mm_defined<4,4>
\r
1517 static bool const value=true;
\r
1521 template <class A,class B>
\r
1522 BOOST_QVM_INLINE_OPERATIONS
\r
1523 typename enable_if_c<
\r
1524 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
\r
1525 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
\r
1527 operator==( A const & a, B const & b )
\r
1530 mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b) &&
\r
1531 mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b) &&
\r
1532 mat_traits<A>::template read_element<2,0>(a)==mat_traits<B>::template read_element<2,0>(b) &&
\r
1533 mat_traits<A>::template read_element<3,0>(a)==mat_traits<B>::template read_element<3,0>(b);
\r
1539 using ::boost::qvm::operator==;
\r
1545 template <int R,int C>
\r
1546 struct eq_mm_defined;
\r
1550 eq_mm_defined<4,1>
\r
1552 static bool const value=true;
\r
1556 template <class A,class B>
\r
1557 BOOST_QVM_INLINE_OPERATIONS
\r
1558 typename enable_if_c<
\r
1559 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
\r
1560 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
\r
1562 operator==( A const & a, B const & b )
\r
1565 mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b) &&
\r
1566 mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b) &&
\r
1567 mat_traits<A>::template read_element<0,2>(a)==mat_traits<B>::template read_element<0,2>(b) &&
\r
1568 mat_traits<A>::template read_element<0,3>(a)==mat_traits<B>::template read_element<0,3>(b);
\r
1574 using ::boost::qvm::operator==;
\r
1580 template <int R,int C>
\r
1581 struct eq_mm_defined;
\r
1585 eq_mm_defined<1,4>
\r
1587 static bool const value=true;
\r
1591 template <class A,class B>
\r
1592 BOOST_QVM_INLINE_OPERATIONS
\r
1593 typename enable_if_c<
\r
1594 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
\r
1595 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
\r
1597 operator!=( A const & a, B const & b )
\r
1600 !(mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b)) ||
\r
1601 !(mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b)) ||
\r
1602 !(mat_traits<A>::template read_element<0,2>(a)==mat_traits<B>::template read_element<0,2>(b)) ||
\r
1603 !(mat_traits<A>::template read_element<0,3>(a)==mat_traits<B>::template read_element<0,3>(b)) ||
\r
1604 !(mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b)) ||
\r
1605 !(mat_traits<A>::template read_element<1,1>(a)==mat_traits<B>::template read_element<1,1>(b)) ||
\r
1606 !(mat_traits<A>::template read_element<1,2>(a)==mat_traits<B>::template read_element<1,2>(b)) ||
\r
1607 !(mat_traits<A>::template read_element<1,3>(a)==mat_traits<B>::template read_element<1,3>(b)) ||
\r
1608 !(mat_traits<A>::template read_element<2,0>(a)==mat_traits<B>::template read_element<2,0>(b)) ||
\r
1609 !(mat_traits<A>::template read_element<2,1>(a)==mat_traits<B>::template read_element<2,1>(b)) ||
\r
1610 !(mat_traits<A>::template read_element<2,2>(a)==mat_traits<B>::template read_element<2,2>(b)) ||
\r
1611 !(mat_traits<A>::template read_element<2,3>(a)==mat_traits<B>::template read_element<2,3>(b)) ||
\r
1612 !(mat_traits<A>::template read_element<3,0>(a)==mat_traits<B>::template read_element<3,0>(b)) ||
\r
1613 !(mat_traits<A>::template read_element<3,1>(a)==mat_traits<B>::template read_element<3,1>(b)) ||
\r
1614 !(mat_traits<A>::template read_element<3,2>(a)==mat_traits<B>::template read_element<3,2>(b)) ||
\r
1615 !(mat_traits<A>::template read_element<3,3>(a)==mat_traits<B>::template read_element<3,3>(b));
\r
1621 using ::boost::qvm::operator!=;
\r
1627 template <int R,int C>
\r
1628 struct neq_mm_defined;
\r
1632 neq_mm_defined<4,4>
\r
1634 static bool const value=true;
\r
1638 template <class A,class B>
\r
1639 BOOST_QVM_INLINE_OPERATIONS
\r
1640 typename enable_if_c<
\r
1641 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
\r
1642 mat_traits<A>::cols==1 && mat_traits<B>::cols==1,
\r
1644 operator!=( A const & a, B const & b )
\r
1647 !(mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b)) ||
\r
1648 !(mat_traits<A>::template read_element<1,0>(a)==mat_traits<B>::template read_element<1,0>(b)) ||
\r
1649 !(mat_traits<A>::template read_element<2,0>(a)==mat_traits<B>::template read_element<2,0>(b)) ||
\r
1650 !(mat_traits<A>::template read_element<3,0>(a)==mat_traits<B>::template read_element<3,0>(b));
\r
1656 using ::boost::qvm::operator!=;
\r
1662 template <int R,int C>
\r
1663 struct neq_mm_defined;
\r
1667 neq_mm_defined<4,1>
\r
1669 static bool const value=true;
\r
1673 template <class A,class B>
\r
1674 BOOST_QVM_INLINE_OPERATIONS
\r
1675 typename enable_if_c<
\r
1676 mat_traits<A>::rows==1 && mat_traits<B>::rows==1 &&
\r
1677 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
\r
1679 operator!=( A const & a, B const & b )
\r
1682 !(mat_traits<A>::template read_element<0,0>(a)==mat_traits<B>::template read_element<0,0>(b)) ||
\r
1683 !(mat_traits<A>::template read_element<0,1>(a)==mat_traits<B>::template read_element<0,1>(b)) ||
\r
1684 !(mat_traits<A>::template read_element<0,2>(a)==mat_traits<B>::template read_element<0,2>(b)) ||
\r
1685 !(mat_traits<A>::template read_element<0,3>(a)==mat_traits<B>::template read_element<0,3>(b));
\r
1691 using ::boost::qvm::operator!=;
\r
1697 template <int R,int C>
\r
1698 struct neq_mm_defined;
\r
1702 neq_mm_defined<1,4>
\r
1704 static bool const value=true;
\r
1708 template <class A>
\r
1709 BOOST_QVM_INLINE_OPERATIONS
\r
1710 typename lazy_enable_if_c<
\r
1711 mat_traits<A>::rows==4 && mat_traits<A>::cols==4,
\r
1712 deduce_mat<A> >::type
\r
1713 operator-( A const & a )
\r
1715 typedef typename deduce_mat<A>::type R;
\r
1717 mat_traits<R>::template write_element<0,0>(r)=-mat_traits<A>::template read_element<0,0>(a);
\r
1718 mat_traits<R>::template write_element<0,1>(r)=-mat_traits<A>::template read_element<0,1>(a);
\r
1719 mat_traits<R>::template write_element<0,2>(r)=-mat_traits<A>::template read_element<0,2>(a);
\r
1720 mat_traits<R>::template write_element<0,3>(r)=-mat_traits<A>::template read_element<0,3>(a);
\r
1721 mat_traits<R>::template write_element<1,0>(r)=-mat_traits<A>::template read_element<1,0>(a);
\r
1722 mat_traits<R>::template write_element<1,1>(r)=-mat_traits<A>::template read_element<1,1>(a);
\r
1723 mat_traits<R>::template write_element<1,2>(r)=-mat_traits<A>::template read_element<1,2>(a);
\r
1724 mat_traits<R>::template write_element<1,3>(r)=-mat_traits<A>::template read_element<1,3>(a);
\r
1725 mat_traits<R>::template write_element<2,0>(r)=-mat_traits<A>::template read_element<2,0>(a);
\r
1726 mat_traits<R>::template write_element<2,1>(r)=-mat_traits<A>::template read_element<2,1>(a);
\r
1727 mat_traits<R>::template write_element<2,2>(r)=-mat_traits<A>::template read_element<2,2>(a);
\r
1728 mat_traits<R>::template write_element<2,3>(r)=-mat_traits<A>::template read_element<2,3>(a);
\r
1729 mat_traits<R>::template write_element<3,0>(r)=-mat_traits<A>::template read_element<3,0>(a);
\r
1730 mat_traits<R>::template write_element<3,1>(r)=-mat_traits<A>::template read_element<3,1>(a);
\r
1731 mat_traits<R>::template write_element<3,2>(r)=-mat_traits<A>::template read_element<3,2>(a);
\r
1732 mat_traits<R>::template write_element<3,3>(r)=-mat_traits<A>::template read_element<3,3>(a);
\r
1739 using ::boost::qvm::operator-;
\r
1745 template <int R,int C>
\r
1746 struct minus_m_defined;
\r
1750 minus_m_defined<4,4>
\r
1752 static bool const value=true;
\r
1756 template <class A>
\r
1757 BOOST_QVM_INLINE_OPERATIONS
\r
1758 typename lazy_enable_if_c<
\r
1759 mat_traits<A>::rows==4 && mat_traits<A>::cols==1,
\r
1760 deduce_mat<A> >::type
\r
1761 operator-( A const & a )
\r
1763 typedef typename deduce_mat<A>::type R;
\r
1765 mat_traits<R>::template write_element<0,0>(r)=-mat_traits<A>::template read_element<0,0>(a);
\r
1766 mat_traits<R>::template write_element<1,0>(r)=-mat_traits<A>::template read_element<1,0>(a);
\r
1767 mat_traits<R>::template write_element<2,0>(r)=-mat_traits<A>::template read_element<2,0>(a);
\r
1768 mat_traits<R>::template write_element<3,0>(r)=-mat_traits<A>::template read_element<3,0>(a);
\r
1775 using ::boost::qvm::operator-;
\r
1781 template <int R,int C>
\r
1782 struct minus_m_defined;
\r
1786 minus_m_defined<4,1>
\r
1788 static bool const value=true;
\r
1792 template <class A>
\r
1793 BOOST_QVM_INLINE_OPERATIONS
\r
1794 typename lazy_enable_if_c<
\r
1795 mat_traits<A>::rows==1 && mat_traits<A>::cols==4,
\r
1796 deduce_mat<A> >::type
\r
1797 operator-( A const & a )
\r
1799 typedef typename deduce_mat<A>::type R;
\r
1801 mat_traits<R>::template write_element<0,0>(r)=-mat_traits<A>::template read_element<0,0>(a);
\r
1802 mat_traits<R>::template write_element<0,1>(r)=-mat_traits<A>::template read_element<0,1>(a);
\r
1803 mat_traits<R>::template write_element<0,2>(r)=-mat_traits<A>::template read_element<0,2>(a);
\r
1804 mat_traits<R>::template write_element<0,3>(r)=-mat_traits<A>::template read_element<0,3>(a);
\r
1811 using ::boost::qvm::operator-;
\r
1817 template <int R,int C>
\r
1818 struct minus_m_defined;
\r
1822 minus_m_defined<1,4>
\r
1824 static bool const value=true;
\r
1828 template <class A>
\r
1829 BOOST_QVM_INLINE_OPERATIONS
\r
1830 typename enable_if_c<
\r
1831 mat_traits<A>::rows==4 && mat_traits<A>::cols==4,
\r
1832 typename mat_traits<A>::scalar_type>::type
\r
1833 determinant( A const & a )
\r
1835 typedef typename mat_traits<A>::scalar_type T;
\r
1836 T const a00=mat_traits<A>::template read_element<0,0>(a);
\r
1837 T const a01=mat_traits<A>::template read_element<0,1>(a);
\r
1838 T const a02=mat_traits<A>::template read_element<0,2>(a);
\r
1839 T const a03=mat_traits<A>::template read_element<0,3>(a);
\r
1840 T const a10=mat_traits<A>::template read_element<1,0>(a);
\r
1841 T const a11=mat_traits<A>::template read_element<1,1>(a);
\r
1842 T const a12=mat_traits<A>::template read_element<1,2>(a);
\r
1843 T const a13=mat_traits<A>::template read_element<1,3>(a);
\r
1844 T const a20=mat_traits<A>::template read_element<2,0>(a);
\r
1845 T const a21=mat_traits<A>::template read_element<2,1>(a);
\r
1846 T const a22=mat_traits<A>::template read_element<2,2>(a);
\r
1847 T const a23=mat_traits<A>::template read_element<2,3>(a);
\r
1848 T const a30=mat_traits<A>::template read_element<3,0>(a);
\r
1849 T const a31=mat_traits<A>::template read_element<3,1>(a);
\r
1850 T const a32=mat_traits<A>::template read_element<3,2>(a);
\r
1851 T const a33=mat_traits<A>::template read_element<3,3>(a);
\r
1852 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)));
\r
1859 using ::boost::qvm::determinant;
\r
1866 struct determinant_defined;
\r
1870 determinant_defined<4>
\r
1872 static bool const value=true;
\r
1876 template <class A,class B>
\r
1877 BOOST_QVM_INLINE_OPERATIONS
\r
1878 typename lazy_enable_if_c<
\r
1879 mat_traits<A>::rows==4 && mat_traits<A>::cols==4 && is_scalar<B>::value,
\r
1880 deduce_mat<A> >::type
\r
1881 inverse( A const & a, B det )
\r
1883 typedef typename mat_traits<A>::scalar_type T;
\r
1884 BOOST_QVM_ASSERT(det!=scalar_traits<B>::value(0));
\r
1885 T const a00=mat_traits<A>::template read_element<0,0>(a);
\r
1886 T const a01=mat_traits<A>::template read_element<0,1>(a);
\r
1887 T const a02=mat_traits<A>::template read_element<0,2>(a);
\r
1888 T const a03=mat_traits<A>::template read_element<0,3>(a);
\r
1889 T const a10=mat_traits<A>::template read_element<1,0>(a);
\r
1890 T const a11=mat_traits<A>::template read_element<1,1>(a);
\r
1891 T const a12=mat_traits<A>::template read_element<1,2>(a);
\r
1892 T const a13=mat_traits<A>::template read_element<1,3>(a);
\r
1893 T const a20=mat_traits<A>::template read_element<2,0>(a);
\r
1894 T const a21=mat_traits<A>::template read_element<2,1>(a);
\r
1895 T const a22=mat_traits<A>::template read_element<2,2>(a);
\r
1896 T const a23=mat_traits<A>::template read_element<2,3>(a);
\r
1897 T const a30=mat_traits<A>::template read_element<3,0>(a);
\r
1898 T const a31=mat_traits<A>::template read_element<3,1>(a);
\r
1899 T const a32=mat_traits<A>::template read_element<3,2>(a);
\r
1900 T const a33=mat_traits<A>::template read_element<3,3>(a);
\r
1901 T const f=scalar_traits<T>::value(1)/det;
\r
1902 typedef typename deduce_mat<A>::type R;
\r
1904 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));
\r
1905 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));
\r
1906 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));
\r
1907 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));
\r
1908 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));
\r
1909 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));
\r
1910 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));
\r
1911 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));
\r
1912 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));
\r
1913 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));
\r
1914 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));
\r
1915 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));
\r
1916 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));
\r
1917 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));
\r
1918 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));
\r
1919 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));
\r
1923 template <class A>
\r
1924 BOOST_QVM_INLINE_OPERATIONS
\r
1925 typename lazy_enable_if_c<
\r
1926 mat_traits<A>::rows==4 && mat_traits<A>::cols==4,
\r
1927 deduce_mat<A> >::type
\r
1928 inverse( A const & a )
\r
1930 typedef typename mat_traits<A>::scalar_type T;
\r
1931 T det=determinant(a);
\r
1932 if( det==scalar_traits<T>::value(0) )
\r
1933 BOOST_QVM_THROW_EXCEPTION(zero_determinant_error());
\r
1934 return inverse(a,det);
\r
1940 using ::boost::qvm::inverse;
\r
1947 struct inverse_m_defined;
\r
1951 inverse_m_defined<4>
\r
1953 static bool const value=true;
\r
1957 template <class A,class B>
\r
1958 BOOST_QVM_INLINE_OPERATIONS
\r
1959 typename lazy_enable_if_c<
\r
1960 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
\r
1961 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
\r
1962 deduce_mat2<A,B,4,4> >::type
\r
1963 operator*( A const & a, B const & b )
\r
1965 typedef typename mat_traits<A>::scalar_type Ta;
\r
1966 typedef typename mat_traits<B>::scalar_type Tb;
\r
1967 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
\r
1968 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
\r
1969 Ta const a02 = mat_traits<A>::template read_element<0,2>(a);
\r
1970 Ta const a03 = mat_traits<A>::template read_element<0,3>(a);
\r
1971 Ta const a10 = mat_traits<A>::template read_element<1,0>(a);
\r
1972 Ta const a11 = mat_traits<A>::template read_element<1,1>(a);
\r
1973 Ta const a12 = mat_traits<A>::template read_element<1,2>(a);
\r
1974 Ta const a13 = mat_traits<A>::template read_element<1,3>(a);
\r
1975 Ta const a20 = mat_traits<A>::template read_element<2,0>(a);
\r
1976 Ta const a21 = mat_traits<A>::template read_element<2,1>(a);
\r
1977 Ta const a22 = mat_traits<A>::template read_element<2,2>(a);
\r
1978 Ta const a23 = mat_traits<A>::template read_element<2,3>(a);
\r
1979 Ta const a30 = mat_traits<A>::template read_element<3,0>(a);
\r
1980 Ta const a31 = mat_traits<A>::template read_element<3,1>(a);
\r
1981 Ta const a32 = mat_traits<A>::template read_element<3,2>(a);
\r
1982 Ta const a33 = mat_traits<A>::template read_element<3,3>(a);
\r
1983 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
\r
1984 Tb const b01 = mat_traits<B>::template read_element<0,1>(b);
\r
1985 Tb const b02 = mat_traits<B>::template read_element<0,2>(b);
\r
1986 Tb const b03 = mat_traits<B>::template read_element<0,3>(b);
\r
1987 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
\r
1988 Tb const b11 = mat_traits<B>::template read_element<1,1>(b);
\r
1989 Tb const b12 = mat_traits<B>::template read_element<1,2>(b);
\r
1990 Tb const b13 = mat_traits<B>::template read_element<1,3>(b);
\r
1991 Tb const b20 = mat_traits<B>::template read_element<2,0>(b);
\r
1992 Tb const b21 = mat_traits<B>::template read_element<2,1>(b);
\r
1993 Tb const b22 = mat_traits<B>::template read_element<2,2>(b);
\r
1994 Tb const b23 = mat_traits<B>::template read_element<2,3>(b);
\r
1995 Tb const b30 = mat_traits<B>::template read_element<3,0>(b);
\r
1996 Tb const b31 = mat_traits<B>::template read_element<3,1>(b);
\r
1997 Tb const b32 = mat_traits<B>::template read_element<3,2>(b);
\r
1998 Tb const b33 = mat_traits<B>::template read_element<3,3>(b);
\r
1999 typedef typename deduce_mat2<A,B,4,4>::type R;
\r
2000 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==4);
\r
2001 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==4);
\r
2003 mat_traits<R>::template write_element<0,0>(r)=a00*b00+a01*b10+a02*b20+a03*b30;
\r
2004 mat_traits<R>::template write_element<0,1>(r)=a00*b01+a01*b11+a02*b21+a03*b31;
\r
2005 mat_traits<R>::template write_element<0,2>(r)=a00*b02+a01*b12+a02*b22+a03*b32;
\r
2006 mat_traits<R>::template write_element<0,3>(r)=a00*b03+a01*b13+a02*b23+a03*b33;
\r
2007 mat_traits<R>::template write_element<1,0>(r)=a10*b00+a11*b10+a12*b20+a13*b30;
\r
2008 mat_traits<R>::template write_element<1,1>(r)=a10*b01+a11*b11+a12*b21+a13*b31;
\r
2009 mat_traits<R>::template write_element<1,2>(r)=a10*b02+a11*b12+a12*b22+a13*b32;
\r
2010 mat_traits<R>::template write_element<1,3>(r)=a10*b03+a11*b13+a12*b23+a13*b33;
\r
2011 mat_traits<R>::template write_element<2,0>(r)=a20*b00+a21*b10+a22*b20+a23*b30;
\r
2012 mat_traits<R>::template write_element<2,1>(r)=a20*b01+a21*b11+a22*b21+a23*b31;
\r
2013 mat_traits<R>::template write_element<2,2>(r)=a20*b02+a21*b12+a22*b22+a23*b32;
\r
2014 mat_traits<R>::template write_element<2,3>(r)=a20*b03+a21*b13+a22*b23+a23*b33;
\r
2015 mat_traits<R>::template write_element<3,0>(r)=a30*b00+a31*b10+a32*b20+a33*b30;
\r
2016 mat_traits<R>::template write_element<3,1>(r)=a30*b01+a31*b11+a32*b21+a33*b31;
\r
2017 mat_traits<R>::template write_element<3,2>(r)=a30*b02+a31*b12+a32*b22+a33*b32;
\r
2018 mat_traits<R>::template write_element<3,3>(r)=a30*b03+a31*b13+a32*b23+a33*b33;
\r
2025 using ::boost::qvm::operator*;
\r
2031 template <int R,int CR,int C>
\r
2032 struct mul_mm_defined;
\r
2036 mul_mm_defined<4,4,4>
\r
2038 static bool const value=true;
\r
2042 template <class A,class B>
\r
2043 BOOST_QVM_INLINE_OPERATIONS
\r
2044 typename enable_if_c<
\r
2045 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
\r
2046 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
\r
2048 operator*=( A & a, B const & b )
\r
2050 typedef typename mat_traits<A>::scalar_type Ta;
\r
2051 typedef typename mat_traits<B>::scalar_type Tb;
\r
2052 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
\r
2053 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
\r
2054 Ta const a02 = mat_traits<A>::template read_element<0,2>(a);
\r
2055 Ta const a03 = mat_traits<A>::template read_element<0,3>(a);
\r
2056 Ta const a10 = mat_traits<A>::template read_element<1,0>(a);
\r
2057 Ta const a11 = mat_traits<A>::template read_element<1,1>(a);
\r
2058 Ta const a12 = mat_traits<A>::template read_element<1,2>(a);
\r
2059 Ta const a13 = mat_traits<A>::template read_element<1,3>(a);
\r
2060 Ta const a20 = mat_traits<A>::template read_element<2,0>(a);
\r
2061 Ta const a21 = mat_traits<A>::template read_element<2,1>(a);
\r
2062 Ta const a22 = mat_traits<A>::template read_element<2,2>(a);
\r
2063 Ta const a23 = mat_traits<A>::template read_element<2,3>(a);
\r
2064 Ta const a30 = mat_traits<A>::template read_element<3,0>(a);
\r
2065 Ta const a31 = mat_traits<A>::template read_element<3,1>(a);
\r
2066 Ta const a32 = mat_traits<A>::template read_element<3,2>(a);
\r
2067 Ta const a33 = mat_traits<A>::template read_element<3,3>(a);
\r
2068 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
\r
2069 Tb const b01 = mat_traits<B>::template read_element<0,1>(b);
\r
2070 Tb const b02 = mat_traits<B>::template read_element<0,2>(b);
\r
2071 Tb const b03 = mat_traits<B>::template read_element<0,3>(b);
\r
2072 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
\r
2073 Tb const b11 = mat_traits<B>::template read_element<1,1>(b);
\r
2074 Tb const b12 = mat_traits<B>::template read_element<1,2>(b);
\r
2075 Tb const b13 = mat_traits<B>::template read_element<1,3>(b);
\r
2076 Tb const b20 = mat_traits<B>::template read_element<2,0>(b);
\r
2077 Tb const b21 = mat_traits<B>::template read_element<2,1>(b);
\r
2078 Tb const b22 = mat_traits<B>::template read_element<2,2>(b);
\r
2079 Tb const b23 = mat_traits<B>::template read_element<2,3>(b);
\r
2080 Tb const b30 = mat_traits<B>::template read_element<3,0>(b);
\r
2081 Tb const b31 = mat_traits<B>::template read_element<3,1>(b);
\r
2082 Tb const b32 = mat_traits<B>::template read_element<3,2>(b);
\r
2083 Tb const b33 = mat_traits<B>::template read_element<3,3>(b);
\r
2084 mat_traits<A>::template write_element<0,0>(a)=a00*b00+a01*b10+a02*b20+a03*b30;
\r
2085 mat_traits<A>::template write_element<0,1>(a)=a00*b01+a01*b11+a02*b21+a03*b31;
\r
2086 mat_traits<A>::template write_element<0,2>(a)=a00*b02+a01*b12+a02*b22+a03*b32;
\r
2087 mat_traits<A>::template write_element<0,3>(a)=a00*b03+a01*b13+a02*b23+a03*b33;
\r
2088 mat_traits<A>::template write_element<1,0>(a)=a10*b00+a11*b10+a12*b20+a13*b30;
\r
2089 mat_traits<A>::template write_element<1,1>(a)=a10*b01+a11*b11+a12*b21+a13*b31;
\r
2090 mat_traits<A>::template write_element<1,2>(a)=a10*b02+a11*b12+a12*b22+a13*b32;
\r
2091 mat_traits<A>::template write_element<1,3>(a)=a10*b03+a11*b13+a12*b23+a13*b33;
\r
2092 mat_traits<A>::template write_element<2,0>(a)=a20*b00+a21*b10+a22*b20+a23*b30;
\r
2093 mat_traits<A>::template write_element<2,1>(a)=a20*b01+a21*b11+a22*b21+a23*b31;
\r
2094 mat_traits<A>::template write_element<2,2>(a)=a20*b02+a21*b12+a22*b22+a23*b32;
\r
2095 mat_traits<A>::template write_element<2,3>(a)=a20*b03+a21*b13+a22*b23+a23*b33;
\r
2096 mat_traits<A>::template write_element<3,0>(a)=a30*b00+a31*b10+a32*b20+a33*b30;
\r
2097 mat_traits<A>::template write_element<3,1>(a)=a30*b01+a31*b11+a32*b21+a33*b31;
\r
2098 mat_traits<A>::template write_element<3,2>(a)=a30*b02+a31*b12+a32*b22+a33*b32;
\r
2099 mat_traits<A>::template write_element<3,3>(a)=a30*b03+a31*b13+a32*b23+a33*b33;
\r
2106 using ::boost::qvm::operator*=;
\r
2113 struct mul_eq_mm_defined;
\r
2117 mul_eq_mm_defined<4>
\r
2119 static bool const value=true;
\r
2123 template <class A,class B>
\r
2124 BOOST_QVM_INLINE_OPERATIONS
\r
2125 typename lazy_enable_if_c<
\r
2126 mat_traits<A>::rows==4 && mat_traits<B>::rows==4 &&
\r
2127 mat_traits<A>::cols==4 && mat_traits<B>::cols==1,
\r
2128 deduce_mat2<A,B,4,1> >::type
\r
2129 operator*( A const & a, B const & b )
\r
2131 typedef typename mat_traits<A>::scalar_type Ta;
\r
2132 typedef typename mat_traits<B>::scalar_type Tb;
\r
2133 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
\r
2134 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
\r
2135 Ta const a02 = mat_traits<A>::template read_element<0,2>(a);
\r
2136 Ta const a03 = mat_traits<A>::template read_element<0,3>(a);
\r
2137 Ta const a10 = mat_traits<A>::template read_element<1,0>(a);
\r
2138 Ta const a11 = mat_traits<A>::template read_element<1,1>(a);
\r
2139 Ta const a12 = mat_traits<A>::template read_element<1,2>(a);
\r
2140 Ta const a13 = mat_traits<A>::template read_element<1,3>(a);
\r
2141 Ta const a20 = mat_traits<A>::template read_element<2,0>(a);
\r
2142 Ta const a21 = mat_traits<A>::template read_element<2,1>(a);
\r
2143 Ta const a22 = mat_traits<A>::template read_element<2,2>(a);
\r
2144 Ta const a23 = mat_traits<A>::template read_element<2,3>(a);
\r
2145 Ta const a30 = mat_traits<A>::template read_element<3,0>(a);
\r
2146 Ta const a31 = mat_traits<A>::template read_element<3,1>(a);
\r
2147 Ta const a32 = mat_traits<A>::template read_element<3,2>(a);
\r
2148 Ta const a33 = mat_traits<A>::template read_element<3,3>(a);
\r
2149 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
\r
2150 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
\r
2151 Tb const b20 = mat_traits<B>::template read_element<2,0>(b);
\r
2152 Tb const b30 = mat_traits<B>::template read_element<3,0>(b);
\r
2153 typedef typename deduce_mat2<A,B,4,1>::type R;
\r
2154 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==4);
\r
2155 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==1);
\r
2157 mat_traits<R>::template write_element<0,0>(r)=a00*b00+a01*b10+a02*b20+a03*b30;
\r
2158 mat_traits<R>::template write_element<1,0>(r)=a10*b00+a11*b10+a12*b20+a13*b30;
\r
2159 mat_traits<R>::template write_element<2,0>(r)=a20*b00+a21*b10+a22*b20+a23*b30;
\r
2160 mat_traits<R>::template write_element<3,0>(r)=a30*b00+a31*b10+a32*b20+a33*b30;
\r
2167 using ::boost::qvm::operator*;
\r
2173 template <int R,int CR,int C>
\r
2174 struct mul_mm_defined;
\r
2178 mul_mm_defined<4,4,1>
\r
2180 static bool const value=true;
\r
2184 template <class A,class B>
\r
2185 BOOST_QVM_INLINE_OPERATIONS
\r
2186 typename lazy_enable_if_c<
\r
2187 mat_traits<A>::rows==1 && mat_traits<B>::rows==4 &&
\r
2188 mat_traits<A>::cols==4 && mat_traits<B>::cols==4,
\r
2189 deduce_mat2<A,B,1,4> >::type
\r
2190 operator*( A const & a, B const & b )
\r
2192 typedef typename mat_traits<A>::scalar_type Ta;
\r
2193 typedef typename mat_traits<B>::scalar_type Tb;
\r
2194 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
\r
2195 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
\r
2196 Ta const a02 = mat_traits<A>::template read_element<0,2>(a);
\r
2197 Ta const a03 = mat_traits<A>::template read_element<0,3>(a);
\r
2198 Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
\r
2199 Tb const b01 = mat_traits<B>::template read_element<0,1>(b);
\r
2200 Tb const b02 = mat_traits<B>::template read_element<0,2>(b);
\r
2201 Tb const b03 = mat_traits<B>::template read_element<0,3>(b);
\r
2202 Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
\r
2203 Tb const b11 = mat_traits<B>::template read_element<1,1>(b);
\r
2204 Tb const b12 = mat_traits<B>::template read_element<1,2>(b);
\r
2205 Tb const b13 = mat_traits<B>::template read_element<1,3>(b);
\r
2206 Tb const b20 = mat_traits<B>::template read_element<2,0>(b);
\r
2207 Tb const b21 = mat_traits<B>::template read_element<2,1>(b);
\r
2208 Tb const b22 = mat_traits<B>::template read_element<2,2>(b);
\r
2209 Tb const b23 = mat_traits<B>::template read_element<2,3>(b);
\r
2210 Tb const b30 = mat_traits<B>::template read_element<3,0>(b);
\r
2211 Tb const b31 = mat_traits<B>::template read_element<3,1>(b);
\r
2212 Tb const b32 = mat_traits<B>::template read_element<3,2>(b);
\r
2213 Tb const b33 = mat_traits<B>::template read_element<3,3>(b);
\r
2214 typedef typename deduce_mat2<A,B,1,4>::type R;
\r
2215 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::rows==1);
\r
2216 BOOST_QVM_STATIC_ASSERT(mat_traits<R>::cols==4);
\r
2218 mat_traits<R>::template write_element<0,0>(r)=a00*b00+a01*b10+a02*b20+a03*b30;
\r
2219 mat_traits<R>::template write_element<0,1>(r)=a00*b01+a01*b11+a02*b21+a03*b31;
\r
2220 mat_traits<R>::template write_element<0,2>(r)=a00*b02+a01*b12+a02*b22+a03*b32;
\r
2221 mat_traits<R>::template write_element<0,3>(r)=a00*b03+a01*b13+a02*b23+a03*b33;
\r
2228 using ::boost::qvm::operator*;
\r
2234 template <int R,int CR,int C>
\r
2235 struct mul_mm_defined;
\r
2239 mul_mm_defined<1,4,4>
\r
2241 static bool const value=true;
\r