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  *-----------------------------------------------------------------------*/
00013 #ifndef vector_class_ops_h
00014 #define vector_class_ops_h
00015 
00016 #if defined(_MSC_VER) && _MSC_VER < 1400
00017 #pragma warning(disable:4003)
00018 // XXX Horrible hack to turn off warnings about "not enough actual params"
00019 // for the macros below.
00020 #endif
00021 
00022 /* XXX HACK!!! This is a hack to resize in the assign() functions only when
00023  * auto resizing is turned off.
00024  */
00025 #if !defined(CML_VECTOR_RESIZE_ON_ASSIGNMENT)
00026 #define _DO_VECTOR_SET_RESIZE(_N_)  cml::et::detail::Resize(*this,_N_)
00027 #else
00028 #define _DO_VECTOR_SET_RESIZE(_N_)
00029 #endif
00030 
00032 #define CML_ASSIGN_VEC_2                                                \
00033 vector_type&                                                            \
00034 set(ELEMENT_ARG_TYPE e0, ELEMENT_ARG_TYPE e1) {                         \
00035     _DO_VECTOR_SET_RESIZE(2);                                           \
00036     /* This is overkill, but simplifies size checking: */               \
00037     value_type v[] = {e0,e1};                                           \
00038     typedef et::OpAssign<Element,Element> OpT;                          \
00039     cml::vector< const value_type, external<2> > src(v);                \
00040     et::UnrollAssignment<OpT>(*this,src);                               \
00041     return *this;                                                       \
00042 }
00043 
00045 #define CML_ASSIGN_VEC_3                                                \
00046 vector_type&                                                            \
00047 set(                                                                    \
00048         ELEMENT_ARG_TYPE e0,                                            \
00049         ELEMENT_ARG_TYPE e1,                                            \
00050         ELEMENT_ARG_TYPE e2                                             \
00051         )                                                               \
00052 {                                                                       \
00053     _DO_VECTOR_SET_RESIZE(3);                                           \
00054     /* This is overkill, but simplifies size checking: */               \
00055     value_type v[] = {e0,e1,e2};                                        \
00056     typedef et::OpAssign<Element,Element> OpT;                          \
00057     cml::vector< const value_type, external<3> > src(v);                \
00058     et::UnrollAssignment<OpT>(*this,src);                               \
00059     return *this;                                                       \
00060 }
00061 
00063 #define CML_ASSIGN_VEC_4                                                \
00064 vector_type&                                                            \
00065 set(                                                                    \
00066         ELEMENT_ARG_TYPE e0,                                            \
00067         ELEMENT_ARG_TYPE e1,                                            \
00068         ELEMENT_ARG_TYPE e2,                                            \
00069         ELEMENT_ARG_TYPE e3                                             \
00070         )                                                               \
00071 {                                                                       \
00072     _DO_VECTOR_SET_RESIZE(4);                                           \
00073     /* This is overkill, but simplifies size checking: */               \
00074     value_type v[] = {e0,e1,e2,e3};                                     \
00075     typedef et::OpAssign<Element,Element> OpT;                          \
00076     cml::vector< const value_type, external<4> > src(v);                \
00077     et::UnrollAssignment<OpT>(*this,src);                               \
00078     return *this;                                                       \
00079 }
00080 
00081 
00083 #define CML_CONSTRUCT_VEC_2(_add_)                                      \
00084 vector(ELEMENT_ARG_TYPE e0, ELEMENT_ARG_TYPE e1) _add_ {                \
00085     set(e0,e1);                                                         \
00086 }
00087 
00089 #define CML_CONSTRUCT_VEC_3(_add_)                                      \
00090 vector(                                                                 \
00091         ELEMENT_ARG_TYPE e0,                                            \
00092         ELEMENT_ARG_TYPE e1,                                            \
00093         ELEMENT_ARG_TYPE e2                                             \
00094         ) _add_                                                         \
00095 {                                                                       \
00096     set(e0,e1,e2);                                                      \
00097 }
00098 
00100 #define CML_CONSTRUCT_VEC_4(_add_)                                      \
00101 vector(                                                                 \
00102         ELEMENT_ARG_TYPE e0,                                            \
00103         ELEMENT_ARG_TYPE e1,                                            \
00104         ELEMENT_ARG_TYPE e2,                                            \
00105         ELEMENT_ARG_TYPE e3                                             \
00106         ) _add_                                                         \
00107 {                                                                       \
00108     set(e0,e1,e2,e3);                                                   \
00109 }
00110 
00112 #define CML_CONSTRUCT_FROM_SUBVEC(_add_)                                \
00113 vector(                                                                 \
00114         const subvector_type& s,                                        \
00115         ELEMENT_ARG_TYPE e                                              \
00116         ) _add_                                                         \
00117 {                                                                       \
00118     _DO_VECTOR_SET_RESIZE(s.size()+1);                                  \
00119     for(size_t i = 0; i < s.size(); ++ i)                               \
00120         (*this)[i] = s[i];                                              \
00121     (*this)[s.size()] = e;                                              \
00122 }
00123 
00125 #define CML_VEC_COPY_FROM_FIXED_ARRAY(_N_,_add_)                        \
00126 vector(const value_type v[_N_]) _add_ {                                 \
00127     typedef et::OpAssign<Element,Element> OpT;                          \
00128     cml::vector< const value_type, external<_N_> > src(v);              \
00129     et::UnrollAssignment<OpT>(*this,src);                               \
00130 }
00131 
00133 #define CML_VEC_COPY_FROM_ARRAY(_add_)                                  \
00134 vector(const value_type* const v, size_t N) _add_ {                     \
00135     typedef et::OpAssign<Element,Element> OpT;                          \
00136     cml::vector<const value_type, external<> > src(v,N);                \
00137     et::UnrollAssignment<OpT>(*this,src);                               \
00138 }
00139 
00145 #define CML_VEC_COPY_FROM_VECTYPE(_add_)                                \
00146 vector(const vector_type& v) _add_ {                                    \
00147     typedef et::OpAssign<Element,Element> OpT;                          \
00148     et::UnrollAssignment<OpT>(*this,v);                                 \
00149 }
00150 
00155 #define CML_VEC_COPY_FROM_VEC                                           \
00156 template<typename E, class AT>                                          \
00157 vector(const vector<E,AT>& m) {                                         \
00158     typedef et::OpAssign<Element,E> OpT;                                \
00159     et::UnrollAssignment<OpT>(*this,m);                                 \
00160 }
00161 
00166 #define CML_VEC_COPY_FROM_VECXPR                                        \
00167 template<class XprT>                                                    \
00168 vector(VECXPR_ARG_TYPE e) {                                             \
00169     /* Verify that a promotion exists at compile time: */               \
00170     typedef typename et::VectorPromote<                                 \
00171         vector_type, typename XprT::result_type>::type result_type;     \
00172     typedef typename XprT::value_type src_value_type;                   \
00173     typedef et::OpAssign<Element,src_value_type> OpT;                   \
00174     et::UnrollAssignment<OpT>(*this,e);                                 \
00175 }
00176 
00181 #define CML_VEC_ASSIGN_FROM_VECTYPE                                     \
00182 vector_type& operator=(const vector_type& v) {                          \
00183     typedef et::OpAssign<Element,Element> OpT;                          \
00184     et::UnrollAssignment<OpT>(*this,v);                                 \
00185     return *this;                                                       \
00186 }
00187 
00195 #define CML_VEC_ASSIGN_FROM_VEC(_op_, _op_name_)                        \
00196 template<typename E, class AT> vector_type&                             \
00197 operator _op_ (const cml::vector<E,AT>& m) {                            \
00198     typedef _op_name_ <Element,E> OpT;                                  \
00199     cml::et::UnrollAssignment<OpT>(*this,m);                            \
00200     return *this;                                                       \
00201 }
00202 
00208 #define CML_VEC_ASSIGN_FROM_VECXPR(_op_, _op_name_)                     \
00209 template<class XprT> vector_type&                                       \
00210 operator _op_ (VECXPR_ARG_TYPE e) {                                     \
00211     /* Verify that a promotion exists at compile time: */               \
00212     typedef typename et::VectorPromote<                                 \
00213         vector_type, typename XprT::result_type>::type result_type;     \
00214     typedef typename XprT::value_type src_value_type;                   \
00215     typedef _op_name_ <Element,src_value_type> OpT;                     \
00216     cml::et::UnrollAssignment<OpT>(*this,e);                            \
00217     return *this;                                                       \
00218 }
00219 
00228 #define CML_VEC_ASSIGN_FROM_SCALAR(_op_, _op_name_)                     \
00229 vector_type& operator _op_ (ELEMENT_ARG_TYPE s) {                       \
00230     typedef _op_name_ <Element,Element> OpT;                            \
00231     cml::et::UnrollAssignment<OpT>(*this,s);                            \
00232     return *this;                                                       \
00233 }
00234 
00235 #endif
00236 
00237 // -------------------------------------------------------------------------
00238 // vim:ft=cpp

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