00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef TVMET_VECTOR_EVAL_H
00025 #define TVMET_VECTOR_EVAL_H
00026
00027 namespace tvmet {
00028
00029
00030
00031
00032
00033
00034
00050 template<class E, std::size_t Sz>
00051 inline
00052 bool all_elements(const XprVector<E, Sz>& e) {
00053 return meta::Vector<Sz>::all_elements(e);
00054 }
00055
00056
00072 template<class E, std::size_t Sz>
00073 inline
00074 bool any_elements(const XprVector<E, Sz>& e) {
00075 return meta::Vector<Sz>::any_elements(e);
00076 }
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00094 template<class E1, class T2, class T3, std::size_t Sz>
00095 inline
00096 XprVector<
00097 XprEval<
00098 XprVector<E1, Sz>,
00099 VectorConstReference<T2, Sz>,
00100 VectorConstReference<T3, Sz>
00101 >,
00102 Sz
00103 >
00104 eval(const XprVector<E1, Sz>& e1, const Vector<T2, Sz>& v2, const Vector<T3, Sz>& v3) {
00105 typedef XprEval<
00106 XprVector<E1, Sz>,
00107 VectorConstReference<T2, Sz>,
00108 VectorConstReference<T3, Sz>
00109 > expr_type;
00110 return XprVector<expr_type, Sz>(
00111 expr_type(e1, v2.const_ref(), v3.const_ref()));
00112 }
00113
00114
00122 template<class E1, class T2, class E3, std::size_t Sz>
00123 inline
00124 XprVector<
00125 XprEval<
00126 XprVector<E1, Sz>,
00127 VectorConstReference<T2, Sz>,
00128 XprVector<E3, Sz>
00129 >,
00130 Sz
00131 >
00132 eval(const XprVector<E1, Sz>& e1, const Vector<T2, Sz>& v2, const XprVector<E3, Sz>& e3) {
00133 typedef XprEval<
00134 XprVector<E1, Sz>,
00135 VectorConstReference<T2, Sz>,
00136 XprVector<E3, Sz>
00137 > expr_type;
00138 return XprVector<expr_type, Sz>(
00139 expr_type(e1, v2.const_ref(), e3));
00140 }
00141
00142
00150 template<class E1, class E2, class T3, std::size_t Sz>
00151 inline
00152 XprVector<
00153 XprEval<
00154 XprVector<E1, Sz>,
00155 XprVector<E2, Sz>,
00156 VectorConstReference<T3, Sz>
00157 >,
00158 Sz
00159 >
00160 eval(const XprVector<E1, Sz>& e1, const XprVector<E2, Sz>& e2, const Vector<T3, Sz>& v3) {
00161 typedef XprEval<
00162 XprVector<E1, Sz>,
00163 XprVector<E2, Sz>,
00164 VectorConstReference<T3, Sz>
00165 > expr_type;
00166 return XprVector<expr_type, Sz>(
00167 expr_type(e1, e2, v3.const_ref()));
00168 }
00169
00170
00178 template<class E1, class E2, class E3, std::size_t Sz>
00179 inline
00180 XprVector<
00181 XprEval<
00182 XprVector<E1, Sz>,
00183 XprVector<E2, Sz>,
00184 XprVector<E3, Sz>
00185 >,
00186 Sz
00187 >
00188 eval(const XprVector<E1, Sz>& e1, const XprVector<E2, Sz>& e2, const XprVector<E3, Sz>& e3) {
00189 typedef XprEval<
00190 XprVector<E1, Sz>,
00191 XprVector<E2, Sz>,
00192 XprVector<E3, Sz>
00193 > expr_type;
00194 return XprVector<expr_type, Sz>(expr_type(e1, e2, e3));
00195 }
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205 #define TVMET_IMPLEMENT_MACRO(POD) \
00206 template<class E, std::size_t Sz> \
00207 inline \
00208 XprVector< \
00209 XprEval< \
00210 XprVector<E, Sz>, \
00211 XprLiteral< POD >, \
00212 XprLiteral< POD > \
00213 >, \
00214 Sz \
00215 > \
00216 eval(const XprVector<E, Sz>& e, POD x2, POD x3) { \
00217 typedef XprEval< \
00218 XprVector<E, Sz>, \
00219 XprLiteral< POD >, \
00220 XprLiteral< POD > \
00221 > expr_type; \
00222 return XprVector<expr_type, Sz>( \
00223 expr_type(e, XprLiteral< POD >(x2), XprLiteral< POD >(x3))); \
00224 } \
00225 \
00226 template<class E1, class E3, std::size_t Sz> \
00227 inline \
00228 XprVector< \
00229 XprEval< \
00230 XprVector<E1, Sz>, \
00231 XprLiteral< POD >, \
00232 XprVector<E3, Sz> \
00233 >, \
00234 Sz \
00235 > \
00236 eval(const XprVector<E1, Sz>& e1, POD x2, const XprVector<E3, Sz>& e3) { \
00237 typedef XprEval< \
00238 XprVector<E1, Sz>, \
00239 XprLiteral< POD >, \
00240 XprVector<E3, Sz> \
00241 > expr_type; \
00242 return XprVector<expr_type, Sz>( \
00243 expr_type(e1, XprLiteral< POD >(x2), e3)); \
00244 } \
00245 \
00246 template<class E1, class E2, std::size_t Sz> \
00247 inline \
00248 XprVector< \
00249 XprEval< \
00250 XprVector<E1, Sz>, \
00251 XprVector<E2, Sz>, \
00252 XprLiteral< POD > \
00253 >, \
00254 Sz \
00255 > \
00256 eval(const XprVector<E1, Sz>& e1, const XprVector<E2, Sz>& e2, POD x3) { \
00257 typedef XprEval< \
00258 XprVector<E1, Sz>, \
00259 XprVector<E2, Sz>, \
00260 XprLiteral< POD > \
00261 > expr_type; \
00262 return XprVector<expr_type, Sz>( \
00263 expr_type(e1, e2, XprLiteral< POD >(x3))); \
00264 }
00265
00266 TVMET_IMPLEMENT_MACRO(int)
00267
00268 #if defined(TVMET_HAVE_LONG_LONG)
00269 TVMET_IMPLEMENT_MACRO(long long int)
00270 #endif // defined(TVMET_HAVE_LONG_LONG)
00271
00272 TVMET_IMPLEMENT_MACRO(float)
00273 TVMET_IMPLEMENT_MACRO(double)
00274
00275 #if defined(TVMET_HAVE_LONG_DOUBLE)
00276 TVMET_IMPLEMENT_MACRO(long double)
00277 #endif // defined(TVMET_HAVE_LONG_DOUBLE)
00278
00279 #undef TVMET_IMPLEMENT_MACRO
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289 #if defined(TVMET_HAVE_COMPLEX)
00290
00291
00299 template<class E, std::size_t Sz, class T>
00300 inline
00301 XprVector<
00302 XprEval<
00303 XprVector<E, Sz>,
00304 XprLiteral< std::complex<T> >,
00305 XprLiteral< std::complex<T> >
00306 >,
00307 Sz
00308 >
00309 eval(const XprVector<E, Sz>& e, std::complex<T> z2, std::complex<T> z3) {
00310 typedef XprEval<
00311 XprVector<E, Sz>,
00312 XprLiteral< std::complex<T> >,
00313 XprLiteral< std::complex<T> >
00314 > expr_type;
00315 return XprVector<expr_type, Sz>(
00316 expr_type(e, XprLiteral< std::complex<T> >(z2), XprLiteral< std::complex<T> >(z3)));
00317 }
00318
00326 template<class E1, class E3, std::size_t Sz, class T>
00327 inline
00328 XprVector<
00329 XprEval<
00330 XprVector<E1, Sz>,
00331 XprLiteral< std::complex<T> >,
00332 XprVector<E3, Sz>
00333 >,
00334 Sz
00335 >
00336 eval(const XprVector<E1, Sz>& e1, std::complex<T> z2, const XprVector<E3, Sz>& e3) {
00337 typedef XprEval<
00338 XprVector<E1, Sz>,
00339 XprLiteral< std::complex<T> >,
00340 XprVector<E3, Sz>
00341 > expr_type;
00342 return XprVector<expr_type, Sz>(
00343 expr_type(e1, XprLiteral< std::complex<T> >(z2), e3));
00344 }
00345
00353 template<class E1, class E2, std::size_t Sz, class T>
00354 inline
00355 XprVector<
00356 XprEval<
00357 XprVector<E1, Sz>,
00358 XprVector<E2, Sz>,
00359 XprLiteral< std::complex<T> >
00360 >,
00361 Sz
00362 >
00363 eval(const XprVector<E1, Sz>& e1, const XprVector<E2, Sz>& e2, std::complex<T> z3) {
00364 typedef XprEval<
00365 XprVector<E1, Sz>,
00366 XprVector<E2, Sz>,
00367 XprLiteral< std::complex<T> >
00368 > expr_type;
00369 return XprVector<expr_type, Sz>(
00370 expr_type(e1, e2, XprLiteral< std::complex<T> >(z3)));
00371 }
00372 #endif // defined(TVMET_HAVE_COMPLEX)
00373
00374
00375 }
00376
00377 #endif // TVMET_VECTOR_EVAL_H
00378
00379
00380
00381
00382