1 //Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc.
3 //Distributed under the Boost Software License, Version 1.0. (See accompanying
4 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 #ifndef UUID_3EDF999CA1C011DEBA5C8DA956D89593
7 #define UUID_3EDF999CA1C011DEBA5C8DA956D89593
9 #include <boost/qvm/inline.hpp>
10 #include <boost/qvm/deduce_mat.hpp>
11 #include <boost/qvm/vec_traits.hpp>
12 #include <boost/qvm/assert.hpp>
13 #include <boost/qvm/enable_if.hpp>
21 ////////////////////////////////////////////////
26 template <class OriginalVector>
30 col_mat_( col_mat_ const & );
31 col_mat_ & operator=( col_mat_ const & );
37 BOOST_QVM_INLINE_TRIVIAL
39 operator=( T const & x )
46 BOOST_QVM_INLINE_TRIVIAL
56 template <class OriginalVector>
58 mat_traits< qvm_detail::col_mat_<OriginalVector> >
60 typedef qvm_detail::col_mat_<OriginalVector> this_matrix;
61 typedef typename vec_traits<OriginalVector>::scalar_type scalar_type;
62 static int const rows=vec_traits<OriginalVector>::dim;
63 static int const cols=1;
65 template <int Row,int Col>
67 BOOST_QVM_INLINE_CRITICAL
69 read_element( this_matrix const & x )
71 BOOST_QVM_STATIC_ASSERT(Col==0);
72 BOOST_QVM_STATIC_ASSERT(Row>=0);
73 BOOST_QVM_STATIC_ASSERT(Row<rows);
74 return vec_traits<OriginalVector>::template read_element<Row>(reinterpret_cast<OriginalVector const &>(x));
77 template <int Row,int Col>
79 BOOST_QVM_INLINE_CRITICAL
81 write_element( this_matrix & x )
83 BOOST_QVM_STATIC_ASSERT(Col==0);
84 BOOST_QVM_STATIC_ASSERT(Row>=0);
85 BOOST_QVM_STATIC_ASSERT(Row<rows);
86 return vec_traits<OriginalVector>::template write_element<Row>(reinterpret_cast<OriginalVector &>(x));
90 BOOST_QVM_INLINE_CRITICAL
92 read_element_idx( int row, int col, this_matrix const & x )
94 BOOST_QVM_ASSERT(col==0);
95 BOOST_QVM_ASSERT(row>=0);
96 BOOST_QVM_ASSERT(row<rows);
97 return vec_traits<OriginalVector>::read_element_idx(row,reinterpret_cast<OriginalVector const &>(x));
101 BOOST_QVM_INLINE_CRITICAL
103 write_element_idx( int row, int col, this_matrix & x )
105 BOOST_QVM_ASSERT(col==0);
106 BOOST_QVM_ASSERT(row>=0);
107 BOOST_QVM_ASSERT(row<rows);
108 return vec_traits<OriginalVector>::write_element_idx(row,reinterpret_cast<OriginalVector &>(x));
112 template <class OriginalVector,int R,int C>
114 deduce_mat<qvm_detail::col_mat_<OriginalVector>,R,C>
116 typedef mat<typename vec_traits<OriginalVector>::scalar_type,R,C> type;
119 template <class OriginalVector,int R,int C>
121 deduce_mat2<qvm_detail::col_mat_<OriginalVector>,qvm_detail::col_mat_<OriginalVector>,R,C>
123 typedef mat<typename vec_traits<OriginalVector>::scalar_type,R,C> type;
127 typename boost::enable_if_c<
129 qvm_detail::col_mat_<A> const &>::type
130 BOOST_QVM_INLINE_TRIVIAL
131 col_mat( A const & a )
133 return reinterpret_cast<typename qvm_detail::col_mat_<A> const &>(a);
137 typename boost::enable_if_c<
139 qvm_detail::col_mat_<A> &>::type
140 BOOST_QVM_INLINE_TRIVIAL
143 return reinterpret_cast<typename qvm_detail::col_mat_<A> &>(a);
146 ////////////////////////////////////////////////
151 template <class OriginalVector>
155 row_mat_( row_mat_ const & );
156 row_mat_ & operator=( row_mat_ const & );
162 BOOST_QVM_INLINE_TRIVIAL
164 operator=( T const & x )
171 BOOST_QVM_INLINE_TRIVIAL
181 template <class OriginalVector>
183 mat_traits< qvm_detail::row_mat_<OriginalVector> >
185 typedef qvm_detail::row_mat_<OriginalVector> this_matrix;
186 typedef typename vec_traits<OriginalVector>::scalar_type scalar_type;
187 static int const rows=1;
188 static int const cols=vec_traits<OriginalVector>::dim;
190 template <int Row,int Col>
192 BOOST_QVM_INLINE_CRITICAL
194 read_element( this_matrix const & x )
196 BOOST_QVM_STATIC_ASSERT(Row==0);
197 BOOST_QVM_STATIC_ASSERT(Col>=0);
198 BOOST_QVM_STATIC_ASSERT(Col<cols);
199 return vec_traits<OriginalVector>::template read_element<Col>(reinterpret_cast<OriginalVector const &>(x));
202 template <int Row,int Col>
204 BOOST_QVM_INLINE_CRITICAL
206 write_element( this_matrix & x )
208 BOOST_QVM_STATIC_ASSERT(Row==0);
209 BOOST_QVM_STATIC_ASSERT(Col>=0);
210 BOOST_QVM_STATIC_ASSERT(Col<cols);
211 return vec_traits<OriginalVector>::template write_element<Col>(reinterpret_cast<OriginalVector &>(x));
215 BOOST_QVM_INLINE_CRITICAL
217 read_element_idx( int row, int col, this_matrix const & x )
219 BOOST_QVM_ASSERT(row==0);
220 BOOST_QVM_ASSERT(col>=0);
221 BOOST_QVM_ASSERT(col<cols);
222 return vec_traits<OriginalVector>::read_element_idx(col,reinterpret_cast<OriginalVector const &>(x));
226 BOOST_QVM_INLINE_CRITICAL
228 write_element_idx( int row, int col, this_matrix & x )
230 BOOST_QVM_ASSERT(row==0);
231 BOOST_QVM_ASSERT(col>=0);
232 BOOST_QVM_ASSERT(col<cols);
233 return vec_traits<OriginalVector>::write_element_idx(col,reinterpret_cast<OriginalVector &>(x));
237 template <class OriginalVector,int R,int C>
239 deduce_mat<qvm_detail::row_mat_<OriginalVector>,R,C>
241 typedef mat<typename vec_traits<OriginalVector>::scalar_type,R,C> type;
244 template <class OriginalVector,int R,int C>
246 deduce_mat2<qvm_detail::row_mat_<OriginalVector>,qvm_detail::row_mat_<OriginalVector>,R,C>
248 typedef mat<typename vec_traits<OriginalVector>::scalar_type,R,C> type;
252 typename boost::enable_if_c<
254 qvm_detail::row_mat_<A> const &>::type
255 BOOST_QVM_INLINE_TRIVIAL
256 row_mat( A const & a )
258 return reinterpret_cast<typename qvm_detail::row_mat_<A> const &>(a);
262 typename boost::enable_if_c<
264 qvm_detail::row_mat_<A> &>::type
265 BOOST_QVM_INLINE_TRIVIAL
268 return reinterpret_cast<typename qvm_detail::row_mat_<A> &>(a);
271 ////////////////////////////////////////////////
276 template <class OriginalVector>
280 translation_mat_( translation_mat_ const & );
281 translation_mat_ & operator=( translation_mat_ const & );
287 BOOST_QVM_INLINE_TRIVIAL
289 operator=( T const & x )
296 BOOST_QVM_INLINE_TRIVIAL
305 template <class M,int Row,int Col,bool TransCol=(Col==mat_traits<M>::cols-1)>
306 struct read_translation_matat;
308 template <class OriginalVector,int Row,int Col,bool TransCol>
310 read_translation_matat<translation_mat_<OriginalVector>,Row,Col,TransCol>
313 BOOST_QVM_INLINE_CRITICAL
314 typename mat_traits< translation_mat_<OriginalVector> >::scalar_type
315 f( translation_mat_<OriginalVector> const & )
317 return scalar_traits<typename mat_traits< translation_mat_<OriginalVector> >::scalar_type>::value(0);
321 template <class OriginalVector,int D>
323 read_translation_matat<translation_mat_<OriginalVector>,D,D,false>
326 BOOST_QVM_INLINE_CRITICAL
327 typename mat_traits< translation_mat_<OriginalVector> >::scalar_type
328 f( translation_mat_<OriginalVector> const & )
330 return scalar_traits<typename mat_traits< translation_mat_<OriginalVector> >::scalar_type>::value(1);
334 template <class OriginalVector,int D>
336 read_translation_matat<translation_mat_<OriginalVector>,D,D,true>
339 BOOST_QVM_INLINE_CRITICAL
340 typename mat_traits< translation_mat_<OriginalVector> >::scalar_type
341 f( translation_mat_<OriginalVector> const & )
343 return scalar_traits<typename mat_traits< translation_mat_<OriginalVector> >::scalar_type>::value(1);
347 template <class OriginalVector,int Row,int Col>
349 read_translation_matat<translation_mat_<OriginalVector>,Row,Col,true>
352 BOOST_QVM_INLINE_CRITICAL
353 typename mat_traits< translation_mat_<OriginalVector> >::scalar_type
354 f( translation_mat_<OriginalVector> const & x )
356 return vec_traits<OriginalVector>::template read_element<Row>(reinterpret_cast<OriginalVector const &>(x));
361 template <class OriginalVector>
363 mat_traits< qvm_detail::translation_mat_<OriginalVector> >
365 typedef qvm_detail::translation_mat_<OriginalVector> this_matrix;
366 typedef typename vec_traits<OriginalVector>::scalar_type scalar_type;
367 static int const rows=vec_traits<OriginalVector>::dim+1;
368 static int const cols=vec_traits<OriginalVector>::dim+1;
370 template <int Row,int Col>
372 BOOST_QVM_INLINE_CRITICAL
374 read_element( this_matrix const & x )
376 BOOST_QVM_STATIC_ASSERT(Row>=0);
377 BOOST_QVM_STATIC_ASSERT(Row<rows);
378 BOOST_QVM_STATIC_ASSERT(Col>=0);
379 BOOST_QVM_STATIC_ASSERT(Col<cols);
380 return qvm_detail::read_translation_matat<qvm_detail::translation_mat_<OriginalVector>,Row,Col>::f(x);
383 template <int Row,int Col>
385 BOOST_QVM_INLINE_CRITICAL
387 write_element( this_matrix & x )
389 BOOST_QVM_STATIC_ASSERT(Row>=0);
390 BOOST_QVM_STATIC_ASSERT(Row<rows);
391 BOOST_QVM_STATIC_ASSERT(Col==cols-1);
392 BOOST_QVM_STATIC_ASSERT(Col!=Row);
393 return vec_traits<OriginalVector>::template write_element<Row>(reinterpret_cast<OriginalVector &>(x));
397 BOOST_QVM_INLINE_CRITICAL
399 read_element_idx( int row, int col, this_matrix const & x )
401 BOOST_QVM_ASSERT(row>=0);
402 BOOST_QVM_ASSERT(row<rows);
403 BOOST_QVM_ASSERT(col>=0);
404 BOOST_QVM_ASSERT(col<cols);
407 scalar_traits<scalar_type>::value(1):
409 vec_traits<OriginalVector>::read_element_idx(row,reinterpret_cast<OriginalVector const &>(x)):
410 scalar_traits<scalar_type>::value(0));
414 BOOST_QVM_INLINE_CRITICAL
416 write_element_idx( int row, int col, this_matrix const & x )
418 BOOST_QVM_ASSERT(row>=0);
419 BOOST_QVM_ASSERT(row<rows);
420 BOOST_QVM_ASSERT(col==cols-1);
421 BOOST_QVM_ASSERT(col!=row);
422 return vec_traits<OriginalVector>::write_element_idx(row,reinterpret_cast<OriginalVector &>(x));
426 template <class OriginalVector,int R,int C>
428 deduce_mat<qvm_detail::translation_mat_<OriginalVector>,R,C>
430 typedef mat<typename vec_traits<OriginalVector>::scalar_type,R,C> type;
433 template <class OriginalVector,int R,int C>
435 deduce_mat2<qvm_detail::translation_mat_<OriginalVector>,qvm_detail::translation_mat_<OriginalVector>,R,C>
437 typedef mat<typename vec_traits<OriginalVector>::scalar_type,R,C> type;
441 typename boost::enable_if_c<
443 qvm_detail::translation_mat_<A> const &>::type
444 BOOST_QVM_INLINE_TRIVIAL
445 translation_mat( A const & a )
447 return reinterpret_cast<typename qvm_detail::translation_mat_<A> const &>(a);
451 typename boost::enable_if_c<
453 qvm_detail::translation_mat_<A> &>::type
454 BOOST_QVM_INLINE_TRIVIAL
455 translation_mat( A & a )
457 return reinterpret_cast<typename qvm_detail::translation_mat_<A> &>(a);
460 ////////////////////////////////////////////////
465 template <class OriginalVector>
469 diag_mat_( diag_mat_ const & );
470 diag_mat_ & operator=( diag_mat_ const & );
476 BOOST_QVM_INLINE_TRIVIAL
478 operator=( T const & x )
485 BOOST_QVM_INLINE_TRIVIAL
495 template <class OriginalVector>
497 mat_traits< qvm_detail::diag_mat_<OriginalVector> >
499 typedef qvm_detail::diag_mat_<OriginalVector> this_matrix;
500 typedef typename vec_traits<OriginalVector>::scalar_type scalar_type;
501 static int const rows=vec_traits<OriginalVector>::dim;
502 static int const cols=vec_traits<OriginalVector>::dim;
504 template <int Row,int Col>
506 BOOST_QVM_INLINE_CRITICAL
508 read_element( this_matrix const & x )
510 BOOST_QVM_STATIC_ASSERT(Row>=0);
511 BOOST_QVM_STATIC_ASSERT(Row<rows);
512 BOOST_QVM_STATIC_ASSERT(Col>=0);
513 BOOST_QVM_STATIC_ASSERT(Col<cols);
514 return Row==Col?vec_traits<OriginalVector>::template read_element<Row>(reinterpret_cast<OriginalVector const &>(x)):scalar_traits<scalar_type>::value(0);
517 template <int Row,int Col>
519 BOOST_QVM_INLINE_CRITICAL
521 write_element( this_matrix & x )
523 BOOST_QVM_STATIC_ASSERT(Row>=0);
524 BOOST_QVM_STATIC_ASSERT(Row<rows);
525 BOOST_QVM_STATIC_ASSERT(Row==Col);
526 return vec_traits<OriginalVector>::template write_element<Row>(reinterpret_cast<OriginalVector &>(x));
530 BOOST_QVM_INLINE_CRITICAL
532 read_element_idx( int row, int col, this_matrix const & x )
534 BOOST_QVM_ASSERT(row>=0);
535 BOOST_QVM_ASSERT(row<rows);
536 BOOST_QVM_ASSERT(col>=0);
537 BOOST_QVM_ASSERT(col<cols);
538 return row==col?vec_traits<OriginalVector>::read_element_idx(row,reinterpret_cast<OriginalVector const &>(x)):scalar_traits<scalar_type>::value(0);
542 BOOST_QVM_INLINE_CRITICAL
544 write_element_idx( int row, int col, this_matrix & x )
546 BOOST_QVM_ASSERT(row>=0);
547 BOOST_QVM_ASSERT(row<rows);
548 BOOST_QVM_ASSERT(row==col);
549 return vec_traits<OriginalVector>::write_element_idx(row,reinterpret_cast<OriginalVector &>(x));
553 template <class OriginalVector,int R,int C>
555 deduce_mat<qvm_detail::diag_mat_<OriginalVector>,R,C>
557 typedef mat<typename vec_traits<OriginalVector>::scalar_type,R,C> type;
560 template <class OriginalVector,int R,int C>
562 deduce_mat2<qvm_detail::diag_mat_<OriginalVector>,qvm_detail::diag_mat_<OriginalVector>,R,C>
564 typedef mat<typename vec_traits<OriginalVector>::scalar_type,R,C> type;
568 typename boost::enable_if_c<
570 qvm_detail::diag_mat_<A> const &>::type
571 BOOST_QVM_INLINE_TRIVIAL
572 diag_mat( A const & a )
574 return reinterpret_cast<typename qvm_detail::diag_mat_<A> const &>(a);
578 typename boost::enable_if_c<
580 qvm_detail::diag_mat_<A> &>::type
581 BOOST_QVM_INLINE_TRIVIAL
584 return reinterpret_cast<typename qvm_detail::diag_mat_<A> &>(a);
587 ////////////////////////////////////////////////