]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/qvm/include/boost/qvm/gen/mat_operations4.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / qvm / include / boost / qvm / gen / mat_operations4.hpp
1 //Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc.
2
3 //Distributed under the Boost Software License, Version 1.0. (See accompanying
4 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6 #ifndef BOOST_QVM_B3124DC843BB8BA61F35A7D938251F
7 #define BOOST_QVM_B3124DC843BB8BA61F35A7D938251F
8
9 //This file was generated by a program. Do not edit manually.
10
11 #include <boost/qvm/assert.hpp>
12 #include <boost/qvm/deduce_mat.hpp>
13 #include <boost/qvm/deduce_vec.hpp>
14 #include <boost/qvm/enable_if.hpp>
15 #include <boost/qvm/error.hpp>
16 #include <boost/qvm/inline.hpp>
17 #include <boost/qvm/mat_traits.hpp>
18 #include <boost/qvm/quat_traits.hpp>
19 #include <boost/qvm/scalar_traits.hpp>
20 #include <boost/qvm/throw_exception.hpp>
21
22 namespace
23 boost
24 {
25 namespace
26 qvm
27 {
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 )
35 {
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);
39 R 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);
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);
56 return r;
57 }
58
59 namespace
60 sfinae
61 {
62 using ::boost::qvm::operator+;
63 }
64
65 namespace
66 qvm_detail
67 {
68 template <int R,int C>
69 struct plus_mm_defined;
70
71 template <>
72 struct
73 plus_mm_defined<4,4>
74 {
75 static bool const value=true;
76 };
77 }
78
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 )
86 {
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);
90 R 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);
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);
95 return r;
96 }
97
98 namespace
99 sfinae
100 {
101 using ::boost::qvm::operator+;
102 }
103
104 namespace
105 qvm_detail
106 {
107 template <int R,int C>
108 struct plus_mm_defined;
109
110 template <>
111 struct
112 plus_mm_defined<4,1>
113 {
114 static bool const value=true;
115 };
116 }
117
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 )
125 {
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);
129 R 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);
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);
134 return r;
135 }
136
137 namespace
138 sfinae
139 {
140 using ::boost::qvm::operator+;
141 }
142
143 namespace
144 qvm_detail
145 {
146 template <int R,int C>
147 struct plus_mm_defined;
148
149 template <>
150 struct
151 plus_mm_defined<1,4>
152 {
153 static bool const value=true;
154 };
155 }
156
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 )
164 {
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);
168 R 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);
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);
185 return r;
186 }
187
188 namespace
189 sfinae
190 {
191 using ::boost::qvm::operator-;
192 }
193
194 namespace
195 qvm_detail
196 {
197 template <int R,int C>
198 struct minus_mm_defined;
199
200 template <>
201 struct
202 minus_mm_defined<4,4>
203 {
204 static bool const value=true;
205 };
206 }
207
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 )
215 {
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);
219 R 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);
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);
224 return r;
225 }
226
227 namespace
228 sfinae
229 {
230 using ::boost::qvm::operator-;
231 }
232
233 namespace
234 qvm_detail
235 {
236 template <int R,int C>
237 struct minus_mm_defined;
238
239 template <>
240 struct
241 minus_mm_defined<4,1>
242 {
243 static bool const value=true;
244 };
245 }
246
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 )
254 {
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);
258 R 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);
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);
263 return r;
264 }
265
266 namespace
267 sfinae
268 {
269 using ::boost::qvm::operator-;
270 }
271
272 namespace
273 qvm_detail
274 {
275 template <int R,int C>
276 struct minus_mm_defined;
277
278 template <>
279 struct
280 minus_mm_defined<1,4>
281 {
282 static bool const value=true;
283 };
284 }
285
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,
291 A &>::type
292 operator+=( A & a, B const & b )
293 {
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);
310 return a;
311 }
312
313 namespace
314 sfinae
315 {
316 using ::boost::qvm::operator+=;
317 }
318
319 namespace
320 qvm_detail
321 {
322 template <int R,int C>
323 struct plus_eq_mm_defined;
324
325 template <>
326 struct
327 plus_eq_mm_defined<4,4>
328 {
329 static bool const value=true;
330 };
331 }
332
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,
338 A &>::type
339 operator+=( A & a, B const & b )
340 {
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);
345 return a;
346 }
347
348 namespace
349 sfinae
350 {
351 using ::boost::qvm::operator+=;
352 }
353
354 namespace
355 qvm_detail
356 {
357 template <int R,int C>
358 struct plus_eq_mm_defined;
359
360 template <>
361 struct
362 plus_eq_mm_defined<4,1>
363 {
364 static bool const value=true;
365 };
366 }
367
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,
373 A &>::type
374 operator+=( A & a, B const & b )
375 {
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);
380 return a;
381 }
382
383 namespace
384 sfinae
385 {
386 using ::boost::qvm::operator+=;
387 }
388
389 namespace
390 qvm_detail
391 {
392 template <int R,int C>
393 struct plus_eq_mm_defined;
394
395 template <>
396 struct
397 plus_eq_mm_defined<1,4>
398 {
399 static bool const value=true;
400 };
401 }
402
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,
408 A &>::type
409 operator-=( A & a, B const & b )
410 {
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);
427 return a;
428 }
429
430 namespace
431 sfinae
432 {
433 using ::boost::qvm::operator-=;
434 }
435
436 namespace
437 qvm_detail
438 {
439 template <int R,int C>
440 struct minus_eq_mm_defined;
441
442 template <>
443 struct
444 minus_eq_mm_defined<4,4>
445 {
446 static bool const value=true;
447 };
448 }
449
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,
455 A &>::type
456 operator-=( A & a, B const & b )
457 {
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);
462 return a;
463 }
464
465 namespace
466 sfinae
467 {
468 using ::boost::qvm::operator-=;
469 }
470
471 namespace
472 qvm_detail
473 {
474 template <int R,int C>
475 struct minus_eq_mm_defined;
476
477 template <>
478 struct
479 minus_eq_mm_defined<4,1>
480 {
481 static bool const value=true;
482 };
483 }
484
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,
490 A &>::type
491 operator-=( A & a, B const & b )
492 {
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);
497 return a;
498 }
499
500 namespace
501 sfinae
502 {
503 using ::boost::qvm::operator-=;
504 }
505
506 namespace
507 qvm_detail
508 {
509 template <int R,int C>
510 struct minus_eq_mm_defined;
511
512 template <>
513 struct
514 minus_eq_mm_defined<1,4>
515 {
516 static bool const value=true;
517 };
518 }
519
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 )
526 {
527 typedef typename deduce_mat<A>::type R;
528 R 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;
545 return r;
546 }
547
548 namespace
549 sfinae
550 {
551 using ::boost::qvm::operator*;
552 }
553
554 namespace
555 qvm_detail
556 {
557 template <int R,int C>
558 struct mul_ms_defined;
559
560 template <>
561 struct
562 mul_ms_defined<4,4>
563 {
564 static bool const value=true;
565 };
566 }
567
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 )
574 {
575 typedef typename deduce_mat<A>::type R;
576 R 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;
581 return r;
582 }
583
584 namespace
585 sfinae
586 {
587 using ::boost::qvm::operator*;
588 }
589
590 namespace
591 qvm_detail
592 {
593 template <int R,int C>
594 struct mul_ms_defined;
595
596 template <>
597 struct
598 mul_ms_defined<4,1>
599 {
600 static bool const value=true;
601 };
602 }
603
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 )
610 {
611 typedef typename deduce_mat<A>::type R;
612 R 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;
617 return r;
618 }
619
620 namespace
621 sfinae
622 {
623 using ::boost::qvm::operator*;
624 }
625
626 namespace
627 qvm_detail
628 {
629 template <int R,int C>
630 struct mul_ms_defined;
631
632 template <>
633 struct
634 mul_ms_defined<1,4>
635 {
636 static bool const value=true;
637 };
638 }
639
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,
644 A &>::type
645 operator*=( A & a, B b )
646 {
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;
663 return a;
664 }
665
666 namespace
667 sfinae
668 {
669 using ::boost::qvm::operator*=;
670 }
671
672 namespace
673 qvm_detail
674 {
675 template <int R,int C>
676 struct mul_eq_ms_defined;
677
678 template <>
679 struct
680 mul_eq_ms_defined<4,4>
681 {
682 static bool const value=true;
683 };
684 }
685
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,
690 A &>::type
691 operator*=( A & a, B b )
692 {
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;
697 return a;
698 }
699
700 namespace
701 sfinae
702 {
703 using ::boost::qvm::operator*=;
704 }
705
706 namespace
707 qvm_detail
708 {
709 template <int R,int C>
710 struct mul_eq_ms_defined;
711
712 template <>
713 struct
714 mul_eq_ms_defined<4,1>
715 {
716 static bool const value=true;
717 };
718 }
719
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,
724 A &>::type
725 operator*=( A & a, B b )
726 {
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;
731 return a;
732 }
733
734 namespace
735 sfinae
736 {
737 using ::boost::qvm::operator*=;
738 }
739
740 namespace
741 qvm_detail
742 {
743 template <int R,int C>
744 struct mul_eq_ms_defined;
745
746 template <>
747 struct
748 mul_eq_ms_defined<1,4>
749 {
750 static bool const value=true;
751 };
752 }
753
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 )
760 {
761 typedef typename deduce_mat<A>::type R;
762 R 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;
779 return r;
780 }
781
782 namespace
783 sfinae
784 {
785 using ::boost::qvm::operator/;
786 }
787
788 namespace
789 qvm_detail
790 {
791 template <int R,int C>
792 struct div_ms_defined;
793
794 template <>
795 struct
796 div_ms_defined<4,4>
797 {
798 static bool const value=true;
799 };
800 }
801
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 )
808 {
809 typedef typename deduce_mat<A>::type R;
810 R 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;
815 return r;
816 }
817
818 namespace
819 sfinae
820 {
821 using ::boost::qvm::operator/;
822 }
823
824 namespace
825 qvm_detail
826 {
827 template <int R,int C>
828 struct div_ms_defined;
829
830 template <>
831 struct
832 div_ms_defined<4,1>
833 {
834 static bool const value=true;
835 };
836 }
837
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 )
844 {
845 typedef typename deduce_mat<A>::type R;
846 R 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;
851 return r;
852 }
853
854 namespace
855 sfinae
856 {
857 using ::boost::qvm::operator/;
858 }
859
860 namespace
861 qvm_detail
862 {
863 template <int R,int C>
864 struct div_ms_defined;
865
866 template <>
867 struct
868 div_ms_defined<1,4>
869 {
870 static bool const value=true;
871 };
872 }
873
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,
878 A &>::type
879 operator/=( A & a, B b )
880 {
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;
897 return a;
898 }
899
900 namespace
901 sfinae
902 {
903 using ::boost::qvm::operator/=;
904 }
905
906 namespace
907 qvm_detail
908 {
909 template <int R,int C>
910 struct div_eq_ms_defined;
911
912 template <>
913 struct
914 div_eq_ms_defined<4,4>
915 {
916 static bool const value=true;
917 };
918 }
919
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,
924 A &>::type
925 operator/=( A & a, B b )
926 {
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;
931 return a;
932 }
933
934 namespace
935 sfinae
936 {
937 using ::boost::qvm::operator/=;
938 }
939
940 namespace
941 qvm_detail
942 {
943 template <int R,int C>
944 struct div_eq_ms_defined;
945
946 template <>
947 struct
948 div_eq_ms_defined<4,1>
949 {
950 static bool const value=true;
951 };
952 }
953
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,
958 A &>::type
959 operator/=( A & a, B b )
960 {
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;
965 return a;
966 }
967
968 namespace
969 sfinae
970 {
971 using ::boost::qvm::operator/=;
972 }
973
974 namespace
975 qvm_detail
976 {
977 template <int R,int C>
978 struct div_eq_ms_defined;
979
980 template <>
981 struct
982 div_eq_ms_defined<1,4>
983 {
984 static bool const value=true;
985 };
986 }
987
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,
993 A &>::type
994 assign( A & a, B const & b )
995 {
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);
1012 return a;
1013 }
1014
1015 namespace
1016 sfinae
1017 {
1018 using ::boost::qvm::assign;
1019 }
1020
1021 namespace
1022 qvm_detail
1023 {
1024 template <int R,int C>
1025 struct assign_mm_defined;
1026
1027 template <>
1028 struct
1029 assign_mm_defined<4,4>
1030 {
1031 static bool const value=true;
1032 };
1033 }
1034
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,
1040 A &>::type
1041 assign( A & a, B const & b )
1042 {
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);
1047 return a;
1048 }
1049
1050 namespace
1051 sfinae
1052 {
1053 using ::boost::qvm::assign;
1054 }
1055
1056 namespace
1057 qvm_detail
1058 {
1059 template <int R,int C>
1060 struct assign_mm_defined;
1061
1062 template <>
1063 struct
1064 assign_mm_defined<4,1>
1065 {
1066 static bool const value=true;
1067 };
1068 }
1069
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,
1075 A &>::type
1076 assign( A & a, B const & b )
1077 {
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);
1082 return a;
1083 }
1084
1085 namespace
1086 sfinae
1087 {
1088 using ::boost::qvm::assign;
1089 }
1090
1091 namespace
1092 qvm_detail
1093 {
1094 template <int R,int C>
1095 struct assign_mm_defined;
1096
1097 template <>
1098 struct
1099 assign_mm_defined<1,4>
1100 {
1101 static bool const value=true;
1102 };
1103 }
1104
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,
1110 R>::type
1111 convert_to( A const & a )
1112 {
1113 R r;
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);
1130 return r;
1131 }
1132
1133 template <class R,class A>
1134 BOOST_QVM_INLINE
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,
1138 R>::type
1139 convert_to( A const & q )
1140 {
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);
1146 T const bb = b*b;
1147 T const cc = c*c;
1148 T const dd = d*d;
1149 T const bc = b*c;
1150 T const bd = b*d;
1151 T const cd = c*d;
1152 T const ab = a*b;
1153 T const ac = a*c;
1154 T const ad = a*d;
1155 T const zero = scalar_traits<T>::value(0);
1156 T const one = scalar_traits<T>::value(1);
1157 T const two = one+one;
1158 R r;
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;
1175 return r;
1176 }
1177
1178 namespace
1179 sfinae
1180 {
1181 using ::boost::qvm::convert_to;
1182 }
1183
1184 namespace
1185 qvm_detail
1186 {
1187 template <int R,int C>
1188 struct convert_to_m_defined;
1189
1190 template <>
1191 struct
1192 convert_to_m_defined<4,4>
1193 {
1194 static bool const value=true;
1195 };
1196 }
1197
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,
1203 R>::type
1204 convert_to( A const & a )
1205 {
1206 R r;
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);
1211 return r;
1212 }
1213
1214 namespace
1215 sfinae
1216 {
1217 using ::boost::qvm::convert_to;
1218 }
1219
1220 namespace
1221 qvm_detail
1222 {
1223 template <int R,int C>
1224 struct convert_to_m_defined;
1225
1226 template <>
1227 struct
1228 convert_to_m_defined<4,1>
1229 {
1230 static bool const value=true;
1231 };
1232 }
1233
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,
1239 R>::type
1240 convert_to( A const & a )
1241 {
1242 R r;
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);
1247 return r;
1248 }
1249
1250 namespace
1251 sfinae
1252 {
1253 using ::boost::qvm::convert_to;
1254 }
1255
1256 namespace
1257 qvm_detail
1258 {
1259 template <int R,int C>
1260 struct convert_to_m_defined;
1261
1262 template <>
1263 struct
1264 convert_to_m_defined<1,4>
1265 {
1266 static bool const value=true;
1267 };
1268 }
1269
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,
1275 bool>::type
1276 operator==( A const & a, B const & b )
1277 {
1278 return
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);
1295 }
1296
1297 namespace
1298 sfinae
1299 {
1300 using ::boost::qvm::operator==;
1301 }
1302
1303 namespace
1304 qvm_detail
1305 {
1306 template <int R,int C>
1307 struct eq_mm_defined;
1308
1309 template <>
1310 struct
1311 eq_mm_defined<4,4>
1312 {
1313 static bool const value=true;
1314 };
1315 }
1316
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,
1322 bool>::type
1323 operator==( A const & a, B const & b )
1324 {
1325 return
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);
1330 }
1331
1332 namespace
1333 sfinae
1334 {
1335 using ::boost::qvm::operator==;
1336 }
1337
1338 namespace
1339 qvm_detail
1340 {
1341 template <int R,int C>
1342 struct eq_mm_defined;
1343
1344 template <>
1345 struct
1346 eq_mm_defined<4,1>
1347 {
1348 static bool const value=true;
1349 };
1350 }
1351
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,
1357 bool>::type
1358 operator==( A const & a, B const & b )
1359 {
1360 return
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);
1365 }
1366
1367 namespace
1368 sfinae
1369 {
1370 using ::boost::qvm::operator==;
1371 }
1372
1373 namespace
1374 qvm_detail
1375 {
1376 template <int R,int C>
1377 struct eq_mm_defined;
1378
1379 template <>
1380 struct
1381 eq_mm_defined<1,4>
1382 {
1383 static bool const value=true;
1384 };
1385 }
1386
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,
1392 bool>::type
1393 operator!=( A const & a, B const & b )
1394 {
1395 return
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));
1412 }
1413
1414 namespace
1415 sfinae
1416 {
1417 using ::boost::qvm::operator!=;
1418 }
1419
1420 namespace
1421 qvm_detail
1422 {
1423 template <int R,int C>
1424 struct neq_mm_defined;
1425
1426 template <>
1427 struct
1428 neq_mm_defined<4,4>
1429 {
1430 static bool const value=true;
1431 };
1432 }
1433
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,
1439 bool>::type
1440 operator!=( A const & a, B const & b )
1441 {
1442 return
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));
1447 }
1448
1449 namespace
1450 sfinae
1451 {
1452 using ::boost::qvm::operator!=;
1453 }
1454
1455 namespace
1456 qvm_detail
1457 {
1458 template <int R,int C>
1459 struct neq_mm_defined;
1460
1461 template <>
1462 struct
1463 neq_mm_defined<4,1>
1464 {
1465 static bool const value=true;
1466 };
1467 }
1468
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,
1474 bool>::type
1475 operator!=( A const & a, B const & b )
1476 {
1477 return
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));
1482 }
1483
1484 namespace
1485 sfinae
1486 {
1487 using ::boost::qvm::operator!=;
1488 }
1489
1490 namespace
1491 qvm_detail
1492 {
1493 template <int R,int C>
1494 struct neq_mm_defined;
1495
1496 template <>
1497 struct
1498 neq_mm_defined<1,4>
1499 {
1500 static bool const value=true;
1501 };
1502 }
1503
1504 template <class A>
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 )
1510 {
1511 typedef typename deduce_mat<A>::type R;
1512 R 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);
1529 return r;
1530 }
1531
1532 namespace
1533 sfinae
1534 {
1535 using ::boost::qvm::operator-;
1536 }
1537
1538 namespace
1539 qvm_detail
1540 {
1541 template <int R,int C>
1542 struct minus_m_defined;
1543
1544 template <>
1545 struct
1546 minus_m_defined<4,4>
1547 {
1548 static bool const value=true;
1549 };
1550 }
1551
1552 template <class A>
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 )
1558 {
1559 typedef typename deduce_mat<A>::type R;
1560 R 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);
1565 return r;
1566 }
1567
1568 namespace
1569 sfinae
1570 {
1571 using ::boost::qvm::operator-;
1572 }
1573
1574 namespace
1575 qvm_detail
1576 {
1577 template <int R,int C>
1578 struct minus_m_defined;
1579
1580 template <>
1581 struct
1582 minus_m_defined<4,1>
1583 {
1584 static bool const value=true;
1585 };
1586 }
1587
1588 template <class A>
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 )
1594 {
1595 typedef typename deduce_mat<A>::type R;
1596 R 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);
1601 return r;
1602 }
1603
1604 namespace
1605 sfinae
1606 {
1607 using ::boost::qvm::operator-;
1608 }
1609
1610 namespace
1611 qvm_detail
1612 {
1613 template <int R,int C>
1614 struct minus_m_defined;
1615
1616 template <>
1617 struct
1618 minus_m_defined<1,4>
1619 {
1620 static bool const value=true;
1621 };
1622 }
1623
1624 template <class A>
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 )
1630 {
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)));
1649 return det;
1650 }
1651
1652 namespace
1653 sfinae
1654 {
1655 using ::boost::qvm::determinant;
1656 }
1657
1658 namespace
1659 qvm_detail
1660 {
1661 template <int D>
1662 struct determinant_defined;
1663
1664 template <>
1665 struct
1666 determinant_defined<4>
1667 {
1668 static bool const value=true;
1669 };
1670 }
1671
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 )
1678 {
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;
1699 R 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));
1716 return r;
1717 }
1718
1719 template <class A>
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 )
1725 {
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);
1731 }
1732
1733 namespace
1734 sfinae
1735 {
1736 using ::boost::qvm::inverse;
1737 }
1738
1739 namespace
1740 qvm_detail
1741 {
1742 template <int D>
1743 struct inverse_m_defined;
1744
1745 template <>
1746 struct
1747 inverse_m_defined<4>
1748 {
1749 static bool const value=true;
1750 };
1751 }
1752
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 )
1760 {
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);
1798 R r;
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;
1815 return r;
1816 }
1817
1818 namespace
1819 sfinae
1820 {
1821 using ::boost::qvm::operator*;
1822 }
1823
1824 namespace
1825 qvm_detail
1826 {
1827 template <int R,int CR,int C>
1828 struct mul_mm_defined;
1829
1830 template <>
1831 struct
1832 mul_mm_defined<4,4,4>
1833 {
1834 static bool const value=true;
1835 };
1836 }
1837
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,
1843 A &>::type
1844 operator*=( A & a, B const & b )
1845 {
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;
1896 return a;
1897 }
1898
1899 namespace
1900 sfinae
1901 {
1902 using ::boost::qvm::operator*=;
1903 }
1904
1905 namespace
1906 qvm_detail
1907 {
1908 template <int D>
1909 struct mul_eq_mm_defined;
1910
1911 template <>
1912 struct
1913 mul_eq_mm_defined<4>
1914 {
1915 static bool const value=true;
1916 };
1917 }
1918
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 )
1926 {
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);
1952 R r;
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;
1957 return r;
1958 }
1959
1960 namespace
1961 sfinae
1962 {
1963 using ::boost::qvm::operator*;
1964 }
1965
1966 namespace
1967 qvm_detail
1968 {
1969 template <int R,int CR,int C>
1970 struct mul_mm_defined;
1971
1972 template <>
1973 struct
1974 mul_mm_defined<4,4,1>
1975 {
1976 static bool const value=true;
1977 };
1978 }
1979
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 )
1987 {
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);
2013 R r;
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;
2018 return r;
2019 }
2020
2021 namespace
2022 sfinae
2023 {
2024 using ::boost::qvm::operator*;
2025 }
2026
2027 namespace
2028 qvm_detail
2029 {
2030 template <int R,int CR,int C>
2031 struct mul_mm_defined;
2032
2033 template <>
2034 struct
2035 mul_mm_defined<1,4,4>
2036 {
2037 static bool const value=true;
2038 };
2039 }
2040
2041 }
2042 }
2043
2044 #endif