00001
00002
00003
00004
00005
00006
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
00019
00020 #endif
00021
00022
00023
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 \
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 \
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 \
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 \
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 \
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