File indexing completed on 2026-01-08 10:04:58
0001 #ifndef BOOST_QVM_DETAIL_TRANSP_IMPL_HPP_INCLUDED
0002 #define BOOST_QVM_DETAIL_TRANSP_IMPL_HPP_INCLUDED
0003
0004
0005
0006
0007
0008 #include <boost/qvm/deduce_mat.hpp>
0009 #include <boost/qvm/static_assert.hpp>
0010 #include <boost/qvm/assert.hpp>
0011
0012 namespace boost { namespace qvm {
0013
0014 namespace
0015 qvm_detail
0016 {
0017 template <class OriginalMatrix>
0018 class
0019 transposed_
0020 {
0021 transposed_( transposed_ const & );
0022 transposed_ & operator=( transposed_ const & );
0023 ~transposed_();
0024
0025 public:
0026
0027 template <class T>
0028 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_TRIVIAL
0029 transposed_ &
0030 operator=( T const & x )
0031 {
0032 assign(*this,x);
0033 return *this;
0034 }
0035
0036 template <class R
0037 #if __cplusplus >= 201103L
0038 , class = typename enable_if<is_mat<R> >::type
0039 #endif
0040 >
0041 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_TRIVIAL
0042 operator R() const
0043 {
0044 R r;
0045 assign(r,*this);
0046 return r;
0047 }
0048 };
0049
0050 template <class OriginalMatrix,bool WriteElementRef=mat_write_element_ref<OriginalMatrix>::value>
0051 struct transposed_write_traits;
0052
0053 template <class OriginalMatrix>
0054 struct
0055 transposed_write_traits<OriginalMatrix,true>
0056 {
0057 typedef typename mat_traits<OriginalMatrix>::scalar_type scalar_type;
0058 typedef transposed_<OriginalMatrix> this_matrix;
0059 static int const rows=mat_traits<OriginalMatrix>::cols;
0060 static int const cols=mat_traits<OriginalMatrix>::rows;
0061
0062 template <int Row,int Col>
0063 static
0064 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
0065 scalar_type &
0066 write_element( this_matrix & x )
0067 {
0068 BOOST_QVM_STATIC_ASSERT(Row>=0);
0069 BOOST_QVM_STATIC_ASSERT(Row<rows);
0070 BOOST_QVM_STATIC_ASSERT(Col>=0);
0071 BOOST_QVM_STATIC_ASSERT(Col<cols);
0072 return mat_traits<OriginalMatrix>::template write_element<Col,Row>(reinterpret_cast<OriginalMatrix &>(x));
0073 }
0074
0075 static
0076 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
0077 scalar_type &
0078 write_element_idx( int row, int col, this_matrix & x )
0079 {
0080 BOOST_QVM_ASSERT(row>=0);
0081 BOOST_QVM_ASSERT(row<rows);
0082 BOOST_QVM_ASSERT(col>=0);
0083 BOOST_QVM_ASSERT(col<cols);
0084 return mat_traits<OriginalMatrix>::write_element_idx(col,row,reinterpret_cast<OriginalMatrix &>(x));
0085 }
0086 };
0087
0088 template <class OriginalMatrix>
0089 struct
0090 transposed_write_traits<OriginalMatrix,false>
0091 {
0092 typedef typename mat_traits<OriginalMatrix>::scalar_type scalar_type;
0093 typedef transposed_<OriginalMatrix> this_matrix;
0094 static int const rows=mat_traits<OriginalMatrix>::cols;
0095 static int const cols=mat_traits<OriginalMatrix>::rows;
0096
0097 template <int Row,int Col>
0098 static
0099 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
0100 void
0101 write_element( this_matrix & x, scalar_type s )
0102 {
0103 BOOST_QVM_STATIC_ASSERT(Row>=0);
0104 BOOST_QVM_STATIC_ASSERT(Row<rows);
0105 BOOST_QVM_STATIC_ASSERT(Col>=0);
0106 BOOST_QVM_STATIC_ASSERT(Col<cols);
0107 mat_traits<OriginalMatrix>::template write_element<Col,Row>(reinterpret_cast<OriginalMatrix &>(x), s);
0108 }
0109
0110 static
0111 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
0112 void
0113 write_element_idx( int row, int col, this_matrix & x, scalar_type s )
0114 {
0115 BOOST_QVM_ASSERT(row>=0);
0116 BOOST_QVM_ASSERT(row<rows);
0117 BOOST_QVM_ASSERT(col>=0);
0118 BOOST_QVM_ASSERT(col<cols);
0119 mat_traits<OriginalMatrix>::write_element_idx(col,row,reinterpret_cast<OriginalMatrix &>(x), s);
0120 }
0121 };
0122 }
0123
0124 template <class OriginalMatrix>
0125 struct
0126 mat_traits< qvm_detail::transposed_<OriginalMatrix> >:
0127 qvm_detail::transposed_write_traits<OriginalMatrix>
0128 {
0129 typedef typename mat_traits<OriginalMatrix>::scalar_type scalar_type;
0130 typedef qvm_detail::transposed_<OriginalMatrix> this_matrix;
0131 static int const rows=mat_traits<OriginalMatrix>::cols;
0132 static int const cols=mat_traits<OriginalMatrix>::rows;
0133
0134 template <int Row,int Col>
0135 static
0136 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
0137 scalar_type
0138 read_element( this_matrix const & x )
0139 {
0140 BOOST_QVM_STATIC_ASSERT(Row>=0);
0141 BOOST_QVM_STATIC_ASSERT(Row<rows);
0142 BOOST_QVM_STATIC_ASSERT(Col>=0);
0143 BOOST_QVM_STATIC_ASSERT(Col<cols);
0144 return mat_traits<OriginalMatrix>::template read_element<Col,Row>(reinterpret_cast<OriginalMatrix const &>(x));
0145 }
0146
0147 static
0148 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
0149 scalar_type
0150 read_element_idx( int row, int col, this_matrix const & x )
0151 {
0152 BOOST_QVM_ASSERT(row>=0);
0153 BOOST_QVM_ASSERT(row<rows);
0154 BOOST_QVM_ASSERT(col>=0);
0155 BOOST_QVM_ASSERT(col<cols);
0156 return mat_traits<OriginalMatrix>::read_element_idx(col,row,reinterpret_cast<OriginalMatrix const &>(x));
0157 }
0158 };
0159
0160 template <class OriginalMatrix,int R,int C>
0161 struct
0162 deduce_mat<qvm_detail::transposed_<OriginalMatrix>,R,C>
0163 {
0164 typedef mat<typename mat_traits<OriginalMatrix>::scalar_type,R,C> type;
0165 };
0166
0167 template <class OriginalMatrix,int R,int C>
0168 struct
0169 deduce_mat2<qvm_detail::transposed_<OriginalMatrix>,qvm_detail::transposed_<OriginalMatrix>,R,C>
0170 {
0171 typedef mat<typename mat_traits<OriginalMatrix>::scalar_type,R,C> type;
0172 };
0173
0174 } }
0175
0176 #endif