class_ops.h

Go to the documentation of this file.
00001 /* -*- C++ -*- ------------------------------------------------------------
00002  
00003 Copyright (c) 2007 Jesse Anders and Demian Nave http://cmldev.net/
00004 
00005 The Configurable Math Library (CML) is distributed under the terms of the
00006 Boost Software License, v1.0 (see cml/LICENSE for details).
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 // XXX Horrible hack to turn off warnings about "not enough actual params"
00022 // for the macros below.
00023 #endif
00024 
00025 /* This is to circumvent the problem of commas in a macro argument.  It's
00026  * used to instantiate CML_ACCUMULATED_MATRIX_MULT:
00027  */
00028 #define TEMPLATED_MATRIX_MACRO matrix<E,AT,BO,L>
00029 
00030 /* XXX HACK!!! This is a hack to resize in the assign() functions only when
00031  * auto resizing is turned off.
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     /* This is overkill, but simplifies size checking: */               \
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     /* This is overkill, but simplifies size checking: */               \
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     /* This is overkill, but simplifies size checking: */               \
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     /* Verify that a promotion exists at compile time: */               \
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     /* Verify that a promotion exists at compile time: */               \
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 /* These should only be used for testing: */
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 // vim:ft=cpp

Generated on Sat Jul 18 19:35:22 2009 for CML 1.0 by  doxygen 1.5.9