1 #ifndef BOOST_QVM_MAP_MAT_VEC_HPP_INCLUDED
2 #define BOOST_QVM_MAP_MAT_VEC_HPP_INCLUDED
4 // Copyright 2008-2022 Emil Dotchevski and Reverge Studios, Inc.
6 // Distributed under the Boost Software License, Version 1.0. (See accompanying
7 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 #include <boost/qvm/inline.hpp>
10 #include <boost/qvm/mat_traits.hpp>
11 #include <boost/qvm/deduce_vec.hpp>
12 #include <boost/qvm/assert.hpp>
13 #include <boost/qvm/enable_if.hpp>
15 namespace boost { namespace qvm {
20 template <int Col,class OriginalMatrix>
25 col_ & operator=( col_ const & );
31 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_TRIVIAL
33 operator=( T const & x )
40 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_TRIVIAL
50 template <int Col,class OriginalMatrix>
52 vec_traits< qvm_detail::col_<Col,OriginalMatrix> >
54 typedef qvm_detail::col_<Col,OriginalMatrix> this_vector;
55 typedef typename mat_traits<OriginalMatrix>::scalar_type scalar_type;
56 static int const dim=mat_traits<OriginalMatrix>::rows;
57 BOOST_QVM_STATIC_ASSERT(Col>=0);
58 BOOST_QVM_STATIC_ASSERT(Col<mat_traits<OriginalMatrix>::cols);
62 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
64 read_element( this_vector const & x )
66 BOOST_QVM_STATIC_ASSERT(I>=0);
67 BOOST_QVM_STATIC_ASSERT(I<dim);
68 return mat_traits<OriginalMatrix>::template read_element<I,Col>(reinterpret_cast<OriginalMatrix const &>(x));
73 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
75 write_element( this_vector & x )
77 BOOST_QVM_STATIC_ASSERT(I>=0);
78 BOOST_QVM_STATIC_ASSERT(I<dim);
79 return mat_traits<OriginalMatrix>::template write_element<I,Col>(reinterpret_cast<OriginalMatrix &>(x));
83 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
85 read_element_idx( int i, this_vector const & x )
87 BOOST_QVM_ASSERT(i>=0);
88 BOOST_QVM_ASSERT(i<dim);
89 return mat_traits<OriginalMatrix>::read_element_idx(i,Col,reinterpret_cast<OriginalMatrix const &>(x));
93 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
95 write_element_idx( int i, this_vector & x )
97 BOOST_QVM_ASSERT(i>=0);
98 BOOST_QVM_ASSERT(i<dim);
99 return mat_traits<OriginalMatrix>::write_element_idx(i,Col,reinterpret_cast<OriginalMatrix &>(x));
103 template <int Col,class OriginalMatrix,int D>
105 deduce_vec<qvm_detail::col_<Col,OriginalMatrix>,D>
107 typedef vec<typename mat_traits<OriginalMatrix>::scalar_type,D> type;
110 template <int Col,class OriginalMatrix,int D>
112 deduce_vec2<qvm_detail::col_<Col,OriginalMatrix>,qvm_detail::col_<Col,OriginalMatrix>,D>
114 typedef vec<typename mat_traits<OriginalMatrix>::scalar_type,D> type;
117 template <int Col,class A>
118 typename enable_if_c<
120 qvm_detail::col_<Col,A> const &>::type
121 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_TRIVIAL
124 return reinterpret_cast<typename qvm_detail::col_<Col,A> const &>(a);
127 template <int Col,class A>
128 typename enable_if_c<
130 qvm_detail::col_<Col,A> &>::type
131 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_TRIVIAL
134 return reinterpret_cast<typename qvm_detail::col_<Col,A> &>(a);
137 ////////////////////////////////////////////////
142 template <int Row,class OriginalMatrix>
146 row_( row_ const & );
147 row_ & operator=( row_ const & );
153 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_TRIVIAL
155 operator=( T const & x )
162 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_TRIVIAL
172 template <int Row,class OriginalMatrix>
174 vec_traits< qvm_detail::row_<Row,OriginalMatrix> >
176 typedef qvm_detail::row_<Row,OriginalMatrix> this_vector;
177 typedef typename mat_traits<OriginalMatrix>::scalar_type scalar_type;
178 static int const dim=mat_traits<OriginalMatrix>::cols;
179 BOOST_QVM_STATIC_ASSERT(Row>=0);
180 BOOST_QVM_STATIC_ASSERT(Row<mat_traits<OriginalMatrix>::rows);
184 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
186 read_element( this_vector const & x )
188 BOOST_QVM_STATIC_ASSERT(I>=0);
189 BOOST_QVM_STATIC_ASSERT(I<dim);
190 return mat_traits<OriginalMatrix>::template read_element<Row,I>(reinterpret_cast<OriginalMatrix const &>(x));
195 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
197 write_element( this_vector & x )
199 BOOST_QVM_STATIC_ASSERT(I>=0);
200 BOOST_QVM_STATIC_ASSERT(I<dim);
201 return mat_traits<OriginalMatrix>::template write_element<Row,I>(reinterpret_cast<OriginalMatrix &>(x));
205 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
207 read_element_idx( int i, this_vector const & x )
209 BOOST_QVM_ASSERT(i>=0);
210 BOOST_QVM_ASSERT(i<dim);
211 return mat_traits<OriginalMatrix>::read_element_idx(Row,i,reinterpret_cast<OriginalMatrix const &>(x));
215 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
217 write_element_idx( int i, this_vector & x )
219 BOOST_QVM_ASSERT(i>=0);
220 BOOST_QVM_ASSERT(i<dim);
221 return mat_traits<OriginalMatrix>::write_element_idx(Row,i,reinterpret_cast<OriginalMatrix &>(x));
225 template <int Row,class OriginalMatrix,int D>
227 deduce_vec<qvm_detail::row_<Row,OriginalMatrix>,D>
229 typedef vec<typename mat_traits<OriginalMatrix>::scalar_type,D> type;
232 template <int Row,class OriginalMatrix,int D>
234 deduce_vec2<qvm_detail::row_<Row,OriginalMatrix>,qvm_detail::row_<Row,OriginalMatrix>,D>
236 typedef vec<typename mat_traits<OriginalMatrix>::scalar_type,D> type;
239 template <int Row,class A>
240 typename enable_if_c<
242 qvm_detail::row_<Row,A> const &>::type
243 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_TRIVIAL
246 return reinterpret_cast<typename qvm_detail::row_<Row,A> const &>(a);
249 template <int Row,class A>
250 typename enable_if_c<
252 qvm_detail::row_<Row,A> &>::type
253 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_TRIVIAL
256 return reinterpret_cast<typename qvm_detail::row_<Row,A> &>(a);
259 ////////////////////////////////////////////////
264 template <class OriginalMatrix>
268 diag_( diag_ const & );
269 diag_ & operator=( diag_ const & );
275 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_TRIVIAL
277 operator=( T const & x )
284 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_TRIVIAL
293 template <int X,int Y,bool Which>
294 struct diag_bool_dispatch;
296 template <int X,int Y>
298 diag_bool_dispatch<X,Y,true>
300 static int const value=X;
303 template <int X,int Y>
305 diag_bool_dispatch<X,Y,false>
307 static int const value=Y;
311 template <class OriginalMatrix>
313 vec_traits< qvm_detail::diag_<OriginalMatrix> >
315 typedef qvm_detail::diag_<OriginalMatrix> this_vector;
316 typedef typename mat_traits<OriginalMatrix>::scalar_type scalar_type;
317 static int const dim=qvm_detail::diag_bool_dispatch<
318 mat_traits<OriginalMatrix>::rows,
319 mat_traits<OriginalMatrix>::cols,
320 mat_traits<OriginalMatrix>::rows<=mat_traits<OriginalMatrix>::cols>::value;
324 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
326 read_element( this_vector const & x )
328 BOOST_QVM_STATIC_ASSERT(I>=0);
329 BOOST_QVM_STATIC_ASSERT(I<dim);
330 return mat_traits<OriginalMatrix>::template read_element<I,I>(reinterpret_cast<OriginalMatrix const &>(x));
335 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
337 write_element( this_vector & x )
339 BOOST_QVM_STATIC_ASSERT(I>=0);
340 BOOST_QVM_STATIC_ASSERT(I<dim);
341 return mat_traits<OriginalMatrix>::template write_element<I,I>(reinterpret_cast<OriginalMatrix &>(x));
345 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
347 read_element_idx( int i, this_vector const & x )
349 BOOST_QVM_ASSERT(i>=0);
350 BOOST_QVM_ASSERT(i<dim);
351 return mat_traits<OriginalMatrix>::read_element_idx(i,i,reinterpret_cast<OriginalMatrix const &>(x));
355 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
357 write_element_idx( int i, this_vector & x )
359 BOOST_QVM_ASSERT(i>=0);
360 BOOST_QVM_ASSERT(i<dim);
361 return mat_traits<OriginalMatrix>::write_element_idx(i,i,reinterpret_cast<OriginalMatrix &>(x));
365 template <class OriginalMatrix,int D>
367 deduce_vec<qvm_detail::diag_<OriginalMatrix>,D>
369 typedef vec<typename mat_traits<OriginalMatrix>::scalar_type,D> type;
372 template <class OriginalMatrix,int D>
374 deduce_vec2<qvm_detail::diag_<OriginalMatrix>,qvm_detail::diag_<OriginalMatrix>,D>
376 typedef vec<typename mat_traits<OriginalMatrix>::scalar_type,D> type;
380 typename enable_if_c<
382 qvm_detail::diag_<A> const &>::type
383 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_TRIVIAL
386 return reinterpret_cast<typename qvm_detail::diag_<A> const &>(a);
390 typename enable_if_c<
392 qvm_detail::diag_<A> &>::type
393 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_TRIVIAL
396 return reinterpret_cast<typename qvm_detail::diag_<A> &>(a);
399 ////////////////////////////////////////////////
404 template <class OriginalMatrix>
408 translation_( translation_ const & );
414 operator=( translation_ const & x )
421 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_TRIVIAL
423 operator=( T const & x )
430 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_TRIVIAL
440 template <class OriginalMatrix>
442 vec_traits< qvm_detail::translation_<OriginalMatrix> >
444 typedef qvm_detail::translation_<OriginalMatrix> this_vector;
445 typedef typename mat_traits<OriginalMatrix>::scalar_type scalar_type;
446 static int const dim=mat_traits<OriginalMatrix>::rows-1;
447 BOOST_QVM_STATIC_ASSERT(mat_traits<OriginalMatrix>::rows==mat_traits<OriginalMatrix>::cols);
448 BOOST_QVM_STATIC_ASSERT(mat_traits<OriginalMatrix>::rows>=3);
452 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
454 read_element( this_vector const & x )
456 BOOST_QVM_STATIC_ASSERT(I>=0);
457 BOOST_QVM_STATIC_ASSERT(I<dim);
458 return mat_traits<OriginalMatrix>::template read_element<I,dim>(reinterpret_cast<OriginalMatrix const &>(x));
463 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
465 write_element( this_vector & x )
467 BOOST_QVM_STATIC_ASSERT(I>=0);
468 BOOST_QVM_STATIC_ASSERT(I<dim);
469 return mat_traits<OriginalMatrix>::template write_element<I,dim>(reinterpret_cast<OriginalMatrix &>(x));
473 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
475 read_element_idx( int i, this_vector const & x )
477 BOOST_QVM_ASSERT(i>=0);
478 BOOST_QVM_ASSERT(i<dim);
479 return mat_traits<OriginalMatrix>::read_element_idx(i,dim,reinterpret_cast<OriginalMatrix const &>(x));
483 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
485 write_element_idx( int i, this_vector & x )
487 BOOST_QVM_ASSERT(i>=0);
488 BOOST_QVM_ASSERT(i<dim);
489 return mat_traits<OriginalMatrix>::write_element_idx(i,dim,reinterpret_cast<OriginalMatrix &>(x));
493 template <class OriginalMatrix,int D>
495 deduce_vec<qvm_detail::translation_<OriginalMatrix>,D>
497 typedef vec<typename mat_traits<OriginalMatrix>::scalar_type,D> type;
500 template <class OriginalMatrix,int D>
502 deduce_vec2<qvm_detail::translation_<OriginalMatrix>,qvm_detail::translation_<OriginalMatrix>,D>
504 typedef vec<typename mat_traits<OriginalMatrix>::scalar_type,D> type;
508 typename enable_if_c<
509 is_mat<A>::value && mat_traits<A>::rows==mat_traits<A>::cols && mat_traits<A>::rows>=3,
510 qvm_detail::translation_<A> const &>::type
511 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_TRIVIAL
512 translation( A const & a )
514 return reinterpret_cast<typename qvm_detail::translation_<A> const &>(a);
518 typename enable_if_c<
519 is_mat<A>::value && mat_traits<A>::rows==mat_traits<A>::cols && mat_traits<A>::rows>=3,
520 qvm_detail::translation_<A> &>::type
521 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_TRIVIAL
524 return reinterpret_cast<typename qvm_detail::translation_<A> &>(a);