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_B3B8081A277711E09E007F2DDFD72085 7 #define BOOST_QVM_B3B8081A277711E09E007F2DDFD72085 8 9 #include <boost/qvm/deduce_mat.hpp> 10 #include <boost/qvm/static_assert.hpp> 11 #include <boost/qvm/assert.hpp> 12 13 namespace 14 boost 15 { 16 namespace 17 qvm 18 { 19 namespace 20 qvm_detail 21 { 22 template <class OriginalMatrix> 23 class 24 transposed_ 25 { 26 transposed_( transposed_ const & ); 27 transposed_ & operator=( transposed_ const & ); 28 ~transposed_(); 29 30 public: 31 32 template <class T> 33 BOOST_QVM_INLINE_TRIVIAL 34 transposed_ & operator =(T const & x)35 operator=( T const & x ) 36 { 37 assign(*this,x); 38 return *this; 39 } 40 41 template <class R> 42 BOOST_QVM_INLINE_TRIVIAL operator R() const43 operator R() const 44 { 45 R r; 46 assign(r,*this); 47 return r; 48 } 49 }; 50 } 51 52 template <class OriginalMatrix> 53 struct 54 mat_traits< qvm_detail::transposed_<OriginalMatrix> > 55 { 56 typedef typename mat_traits<OriginalMatrix>::scalar_type scalar_type; 57 typedef qvm_detail::transposed_<OriginalMatrix> this_matrix; 58 static int const rows=mat_traits<OriginalMatrix>::cols; 59 static int const cols=mat_traits<OriginalMatrix>::rows; 60 61 template <int Row,int Col> 62 static 63 BOOST_QVM_INLINE_CRITICAL 64 scalar_type read_elementboost::qvm::mat_traits65 read_element( this_matrix const & x ) 66 { 67 BOOST_QVM_STATIC_ASSERT(Row>=0); 68 BOOST_QVM_STATIC_ASSERT(Row<rows); 69 BOOST_QVM_STATIC_ASSERT(Col>=0); 70 BOOST_QVM_STATIC_ASSERT(Col<cols); 71 return mat_traits<OriginalMatrix>::template read_element<Col,Row>(reinterpret_cast<OriginalMatrix const &>(x)); 72 } 73 74 template <int Row,int Col> 75 static 76 BOOST_QVM_INLINE_CRITICAL 77 scalar_type & write_elementboost::qvm::mat_traits78 write_element( this_matrix & x ) 79 { 80 BOOST_QVM_STATIC_ASSERT(Row>=0); 81 BOOST_QVM_STATIC_ASSERT(Row<rows); 82 BOOST_QVM_STATIC_ASSERT(Col>=0); 83 BOOST_QVM_STATIC_ASSERT(Col<cols); 84 return mat_traits<OriginalMatrix>::template write_element<Col,Row>(reinterpret_cast<OriginalMatrix &>(x)); 85 } 86 87 static 88 BOOST_QVM_INLINE_CRITICAL 89 scalar_type read_element_idxboost::qvm::mat_traits90 read_element_idx( int row, int col, this_matrix const & x ) 91 { 92 BOOST_QVM_ASSERT(row>=0); 93 BOOST_QVM_ASSERT(row<rows); 94 BOOST_QVM_ASSERT(col>=0); 95 BOOST_QVM_ASSERT(col<cols); 96 return mat_traits<OriginalMatrix>::read_element_idx(col,row,reinterpret_cast<OriginalMatrix const &>(x)); 97 } 98 99 static 100 BOOST_QVM_INLINE_CRITICAL 101 scalar_type & write_element_idxboost::qvm::mat_traits102 write_element_idx( int row, int col, this_matrix & x ) 103 { 104 BOOST_QVM_ASSERT(row>=0); 105 BOOST_QVM_ASSERT(row<rows); 106 BOOST_QVM_ASSERT(col>=0); 107 BOOST_QVM_ASSERT(col<cols); 108 return mat_traits<OriginalMatrix>::write_element_idx(col,row,reinterpret_cast<OriginalMatrix &>(x)); 109 } 110 }; 111 112 template <class OriginalMatrix,int R,int C> 113 struct 114 deduce_mat<qvm_detail::transposed_<OriginalMatrix>,R,C> 115 { 116 typedef mat<typename mat_traits<OriginalMatrix>::scalar_type,R,C> type; 117 }; 118 119 template <class OriginalMatrix,int R,int C> 120 struct 121 deduce_mat2<qvm_detail::transposed_<OriginalMatrix>,qvm_detail::transposed_<OriginalMatrix>,R,C> 122 { 123 typedef mat<typename mat_traits<OriginalMatrix>::scalar_type,R,C> type; 124 }; 125 } 126 } 127 128 #endif 129