00001
00002
00003
00004
00005
00006
00007
00008
00016 #ifndef matrix_class_ops_h
00017 #define matrix_class_ops_h
00018
00019 #if defined(_MSC_VER) && _MSC_VER < 1400
00020 #pragma warning(disable:4003)
00021
00022
00023 #endif
00024
00025
00026
00027
00028 #define TEMPLATED_MATRIX_MACRO matrix<E,AT,BO,L>
00029
00030
00031
00032
00033 #if !defined(CML_MATRIX_RESIZE_ON_ASSIGNMENT)
00034 #define _DO_MATRIX_SET_RESIZE(_R_,_C_) cml::et::detail::Resize(*this,_R_,_C_)
00035 #else
00036 #define _DO_MATRIX_SET_RESIZE(_R_,_C_)
00037 #endif
00038
00043 #define CML_ASSIGN_MAT_22 \
00044 matrix_type& \
00045 set( \
00046 ELEMENT_ARG_TYPE e00, ELEMENT_ARG_TYPE e01, \
00047 ELEMENT_ARG_TYPE e10, ELEMENT_ARG_TYPE e11 \
00048 ) \
00049 { \
00050 _DO_MATRIX_SET_RESIZE(2,2); \
00051 \
00052 value_type v[2][2] = {{e00,e01},{e10,e11}}; \
00053 typedef et::OpAssign<Element,Element> OpT; \
00054 typedef const value_type element; \
00055 cml::matrix<element, external<2,2>, basis_orient, row_major> \
00056 src(&v[0][0]); \
00057 et::UnrollAssignment<OpT>(*this,src); \
00058 return *this; \
00059 }
00060
00065 #define CML_ASSIGN_MAT_33 \
00066 matrix_type& \
00067 set( \
00068 ELEMENT_ARG_TYPE e00, ELEMENT_ARG_TYPE e01, ELEMENT_ARG_TYPE e02, \
00069 ELEMENT_ARG_TYPE e10, ELEMENT_ARG_TYPE e11, ELEMENT_ARG_TYPE e12, \
00070 ELEMENT_ARG_TYPE e20, ELEMENT_ARG_TYPE e21, ELEMENT_ARG_TYPE e22 \
00071 ) \
00072 { \
00073 _DO_MATRIX_SET_RESIZE(3,3); \
00074 \
00075 value_type v[3][3] = { \
00076 {e00,e01,e02}, \
00077 {e10,e11,e12}, \
00078 {e20,e21,e22} \
00079 }; \
00080 typedef et::OpAssign<Element,Element> OpT; \
00081 typedef const value_type element; \
00082 cml::matrix<element, external<3,3>, basis_orient, row_major> \
00083 src(&v[0][0]); \
00084 et::UnrollAssignment<OpT>(*this,src); \
00085 return *this; \
00086 }
00087
00092 #define CML_ASSIGN_MAT_44 \
00093 matrix_type& \
00094 set( \
00095 ELEMENT_ARG_TYPE e00, ELEMENT_ARG_TYPE e01, \
00096 ELEMENT_ARG_TYPE e02, ELEMENT_ARG_TYPE e03, \
00097 ELEMENT_ARG_TYPE e10, ELEMENT_ARG_TYPE e11, \
00098 ELEMENT_ARG_TYPE e12, ELEMENT_ARG_TYPE e13, \
00099 ELEMENT_ARG_TYPE e20, ELEMENT_ARG_TYPE e21, \
00100 ELEMENT_ARG_TYPE e22, ELEMENT_ARG_TYPE e23, \
00101 ELEMENT_ARG_TYPE e30, ELEMENT_ARG_TYPE e31, \
00102 ELEMENT_ARG_TYPE e32, ELEMENT_ARG_TYPE e33 \
00103 ) \
00104 { \
00105 _DO_MATRIX_SET_RESIZE(4,4); \
00106 \
00107 value_type v[4][4] = { \
00108 {e00,e01,e02,e03}, \
00109 {e10,e11,e12,e13}, \
00110 {e20,e21,e22,e23}, \
00111 {e30,e31,e32,e33} \
00112 }; \
00113 typedef et::OpAssign<Element,Element> OpT; \
00114 typedef const value_type element; \
00115 cml::matrix<element, external<4,4>, basis_orient, row_major> \
00116 src(&v[0][0]); \
00117 et::UnrollAssignment<OpT>(*this,src); \
00118 return *this; \
00119 }
00120
00125 #define CML_CONSTRUCT_MAT_22 \
00126 matrix( \
00127 ELEMENT_ARG_TYPE e00, ELEMENT_ARG_TYPE e01, \
00128 ELEMENT_ARG_TYPE e10, ELEMENT_ARG_TYPE e11 \
00129 ) \
00130 { \
00131 set( \
00132 e00,e01, \
00133 e10,e11 \
00134 ); \
00135 }
00136
00141 #define CML_CONSTRUCT_MAT_33 \
00142 matrix( \
00143 ELEMENT_ARG_TYPE e00, ELEMENT_ARG_TYPE e01, ELEMENT_ARG_TYPE e02, \
00144 ELEMENT_ARG_TYPE e10, ELEMENT_ARG_TYPE e11, ELEMENT_ARG_TYPE e12, \
00145 ELEMENT_ARG_TYPE e20, ELEMENT_ARG_TYPE e21, ELEMENT_ARG_TYPE e22 \
00146 ) \
00147 { \
00148 set( \
00149 e00,e01,e02, \
00150 e10,e11,e12, \
00151 e20,e21,e22 \
00152 ); \
00153 }
00154
00159 #define CML_CONSTRUCT_MAT_44 \
00160 matrix( \
00161 ELEMENT_ARG_TYPE e00, ELEMENT_ARG_TYPE e01, \
00162 ELEMENT_ARG_TYPE e02, ELEMENT_ARG_TYPE e03, \
00163 ELEMENT_ARG_TYPE e10, ELEMENT_ARG_TYPE e11, \
00164 ELEMENT_ARG_TYPE e12, ELEMENT_ARG_TYPE e13, \
00165 ELEMENT_ARG_TYPE e20, ELEMENT_ARG_TYPE e21, \
00166 ELEMENT_ARG_TYPE e22, ELEMENT_ARG_TYPE e23, \
00167 ELEMENT_ARG_TYPE e30, ELEMENT_ARG_TYPE e31, \
00168 ELEMENT_ARG_TYPE e32, ELEMENT_ARG_TYPE e33 \
00169 ) \
00170 { \
00171 set( \
00172 e00,e01,e02,e03, \
00173 e10,e11,e12,e13, \
00174 e20,e21,e22,e23, \
00175 e30,e31,e32,e33 \
00176 ); \
00177 }
00178
00180 #define CML_MAT_COPY_FROM_FIXED_ARRAY(_R_,_C_) \
00181 matrix(const value_type m[_R_][_C_]) { \
00182 typedef et::OpAssign<Element,Element> OpT; \
00183 cml::matrix<const value_type, external<_R_,_C_>, \
00184 basis_orient, row_major> src(&m[0][0]); \
00185 et::UnrollAssignment<OpT>(*this,src); \
00186 }
00187
00189 #define CML_MAT_COPY_FROM_ARRAY(_add_) \
00190 matrix(const value_type* const v, size_t R, size_t C) _add_ { \
00191 typedef et::OpAssign<Element,Element> OpT; \
00192 cml::matrix<value_type, external<>, basis_orient, \
00193 row_major > src(const_cast<value_type*>(v),R,C); \
00194 et::UnrollAssignment<OpT>(*this,src); \
00195 }
00196
00202 #define CML_MAT_COPY_FROM_MATTYPE \
00203 matrix(const matrix_type& m) : array_type() { \
00204 typedef et::OpAssign <Element,Element> OpT; \
00205 et::UnrollAssignment<OpT>(*this,m); \
00206 }
00207
00212 #define CML_MAT_COPY_FROM_MAT \
00213 template<typename E, class AT, typename BO, typename L> \
00214 matrix(const TEMPLATED_MATRIX_MACRO& m) { \
00215 typedef et::OpAssign <Element,E> OpT; \
00216 et::UnrollAssignment<OpT>(*this,m); \
00217 }
00218
00220 #define CML_MAT_COPY_FROM_MATXPR \
00221 template<class XprT> \
00222 matrix(MATXPR_ARG_TYPE e) { \
00223 \
00224 typedef typename et::MatrixPromote< \
00225 matrix_type, typename XprT::result_type>::type result_type; \
00226 typedef typename XprT::value_type src_value_type; \
00227 typedef et::OpAssign <Element,src_value_type> OpT; \
00228 et::UnrollAssignment<OpT>(*this,e); \
00229 }
00230
00231 #if defined(CML_USE_GENERATED_MATRIX_ASSIGN_OP)
00232 #define CML_MAT_ASSIGN_FROM_MATTYPE
00233 #else
00234
00244 #define CML_MAT_ASSIGN_FROM_MATTYPE \
00245 matrix_type& operator=(const matrix_type& m) { \
00246 typedef et::OpAssign<Element,Element> OpT; \
00247 et::UnrollAssignment<OpT>(*this,m); \
00248 return *this; \
00249 }
00250 #endif
00251
00252
00260 #define CML_MAT_ASSIGN_FROM_MAT(_op_, _op_name_) \
00261 template<typename E, class AT, typename BO, typename L> matrix_type& \
00262 operator _op_ (const TEMPLATED_MATRIX_MACRO& m) { \
00263 typedef _op_name_ <Element,E> OpT; \
00264 et::UnrollAssignment<OpT>(*this,m); \
00265 return *this; \
00266 }
00267
00273 #define CML_MAT_ASSIGN_FROM_MATXPR(_op_, _op_name_) \
00274 template<class XprT> matrix_type& \
00275 operator _op_ (MATXPR_ARG_TYPE e) { \
00276 \
00277 typedef typename et::MatrixPromote< \
00278 matrix_type, typename XprT::result_type>::type result_type; \
00279 typedef typename XprT::value_type src_value_type; \
00280 typedef _op_name_ <Element,src_value_type> OpT; \
00281 et::UnrollAssignment<OpT>(*this,e); \
00282 return *this; \
00283 }
00284
00293 #define CML_MAT_ASSIGN_FROM_SCALAR(_op_, _op_name_) \
00294 matrix_type& operator _op_ (ELEMENT_ARG_TYPE s) { \
00295 typedef _op_name_ <Element,value_type> OpT; \
00296 et::UnrollAssignment<OpT>(*this,s); \
00297 return *this; \
00298 }
00299
00300
00305 #define CML_ACCUMULATED_MATRIX_MULT(_arg_type_) \
00306 matrix_type& operator*=(_arg_type_ m) { \
00307 typedef typename et::MatrixPromote< \
00308 matrix_type, _arg_type_>::type result_type; \
00309 cml::et::CheckedSquare(*this, typename result_type::size_tag()); \
00310 return (*this = (*this)*m); \
00311 }
00312
00313
00314
00315 #define CML_MATRIX_BRACE_OPERATORS \
00316 template<class Matrix> struct row_ref { \
00317 typedef typename Matrix::reference reference; \
00318 reference operator[](size_t col) { return m(row,col); } \
00319 Matrix& m; \
00320 size_t row; \
00321 }; \
00322 \
00323 template<class Matrix> struct const_row_ref { \
00324 typedef typename Matrix::const_reference const_reference; \
00325 const_reference operator[](size_t col) const { return m(row,col); } \
00326 const Matrix& m; \
00327 size_t row; \
00328 }; \
00329 \
00330 row_ref<matrix_type> operator[](size_t row) { \
00331 row_ref<matrix_type> ref = { *this, row }; return ref; \
00332 } \
00333 \
00334 const_row_ref<matrix_type> operator[](size_t row) const { \
00335 const_row_ref<matrix_type> ref = { *this, row }; return ref; \
00336 }
00337
00338 #endif
00339
00340
00341