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_XPR_VECTOR_BINARY_FUNCTIONS_H
00025 #define TVMET_XPR_VECTOR_BINARY_FUNCTIONS_H
00026
00027 namespace tvmet {
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #define TVMET_DECLARE_MACRO(NAME) \
00039 template<class E1, class E2, std::size_t Sz> \
00040 inline \
00041 XprVector< \
00042 XprBinOp< \
00043 Fcnl_##NAME<typename E1::value_type, typename E2::value_type>, \
00044 XprVector<E1, Sz>, \
00045 XprVector<E2, Sz> \
00046 >, \
00047 Sz \
00048 > \
00049 NAME(const XprVector<E1, Sz>& lhs, \
00050 const XprVector<E2, Sz>& rhs) TVMET_CXX_ALWAYS_INLINE;
00051
00052 TVMET_DECLARE_MACRO(atan2)
00053 TVMET_DECLARE_MACRO(fmod)
00054 TVMET_DECLARE_MACRO(pow)
00055 #if defined(TVMET_HAVE_DREM)
00056 TVMET_DECLARE_MACRO(drem)
00057 #endif
00058 #if defined(TVMET_HAVE_HYPOT)
00059 TVMET_DECLARE_MACRO(hypot)
00060 #endif
00061 #if defined(TVMET_HAVE_JN)
00062 TVMET_DECLARE_MACRO(jn)
00063 #endif
00064 #if defined(TVMET_HAVE_YN)
00065 TVMET_DECLARE_MACRO(yn)
00066 #endif
00067
00068 #undef TVMET_DECLARE_MACRO
00069
00070
00071
00072
00073
00074 #define TVMET_DECLARE_MACRO(NAME, TP) \
00075 template<class E, std::size_t Sz> \
00076 inline \
00077 XprVector< \
00078 XprBinOp< \
00079 Fcnl_##NAME<typename E::value_type, TP >, \
00080 XprVector<E, Sz>, \
00081 XprLiteral< TP > \
00082 >, \
00083 Sz \
00084 > \
00085 NAME(const XprVector<E, Sz>& lhs, \
00086 TP rhs) TVMET_CXX_ALWAYS_INLINE;
00087
00088 TVMET_DECLARE_MACRO(atan2, int)
00089 TVMET_DECLARE_MACRO(fmod, int)
00090 TVMET_DECLARE_MACRO(pow, int)
00091 #if defined(TVMET_HAVE_DREM)
00092 TVMET_DECLARE_MACRO(drem, int)
00093 #endif
00094 #if defined(TVMET_HAVE_HYPOT)
00095 TVMET_DECLARE_MACRO(hypot, int)
00096 #endif
00097 #if defined(TVMET_HAVE_JN)
00098 TVMET_DECLARE_MACRO(jn, int)
00099 #endif
00100 #if defined(TVMET_HAVE_YN)
00101 TVMET_DECLARE_MACRO(yn, int)
00102 #endif
00103
00104
00105 #if defined(TVMET_HAVE_LONG_LONG)
00106 TVMET_DECLARE_MACRO(atan2, long long int)
00107 TVMET_DECLARE_MACRO(fmod, long long int)
00108 TVMET_DECLARE_MACRO(pow, long long int)
00109 #if defined(TVMET_HAVE_DREM)
00110 TVMET_DECLARE_MACRO(drem, long long int)
00111 #endif
00112 #if defined(TVMET_HAVE_HYPOT)
00113 TVMET_DECLARE_MACRO(hypot, long long int)
00114 #endif
00115 #if defined(TVMET_HAVE_JN)
00116 TVMET_DECLARE_MACRO(jn, long long int)
00117 #endif
00118 #if defined(TVMET_HAVE_YN)
00119 TVMET_DECLARE_MACRO(yn, long long int)
00120 #endif
00121 #endif // defined(TVMET_HAVE_LONG_LONG)
00122
00123
00124 TVMET_DECLARE_MACRO(atan2, float)
00125 TVMET_DECLARE_MACRO(fmod, float)
00126 TVMET_DECLARE_MACRO(pow, float)
00127 #if defined(TVMET_HAVE_DREM)
00128 TVMET_DECLARE_MACRO(drem, float)
00129 #endif
00130 #if defined(TVMET_HAVE_HYPOT)
00131 TVMET_DECLARE_MACRO(hypot, float)
00132 #endif
00133 #if defined(TVMET_HAVE_JN)
00134 TVMET_DECLARE_MACRO(jn, float)
00135 #endif
00136 #if defined(TVMET_HAVE_YN)
00137 TVMET_DECLARE_MACRO(yn, float)
00138 #endif
00139
00140
00141 TVMET_DECLARE_MACRO(atan2, double)
00142 TVMET_DECLARE_MACRO(fmod, double)
00143 TVMET_DECLARE_MACRO(pow, double)
00144 #if defined(TVMET_HAVE_DREM)
00145 TVMET_DECLARE_MACRO(drem, double)
00146 #endif
00147 #if defined(TVMET_HAVE_HYPOT)
00148 TVMET_DECLARE_MACRO(hypot, double)
00149 #endif
00150 #if defined(TVMET_HAVE_JN)
00151 TVMET_DECLARE_MACRO(jn, double)
00152 #endif
00153 #if defined(TVMET_HAVE_YN)
00154 TVMET_DECLARE_MACRO(yn, double)
00155 #endif
00156
00157
00158 #if defined(TVMET_HAVE_LONG_DOUBLE)
00159 TVMET_DECLARE_MACRO(atan2, long double)
00160 TVMET_DECLARE_MACRO(fmod, long double)
00161 TVMET_DECLARE_MACRO(pow, long double)
00162 #if defined(TVMET_HAVE_DREM)
00163 TVMET_DECLARE_MACRO(drem, long double)
00164 #endif
00165 #if defined(TVMET_HAVE_HYPOT)
00166 TVMET_DECLARE_MACRO(hypot, long double)
00167 #endif
00168 #if defined(TVMET_HAVE_JN)
00169 TVMET_DECLARE_MACRO(jn, long double)
00170 #endif
00171 #if defined(TVMET_HAVE_YN)
00172 TVMET_DECLARE_MACRO(yn, long double)
00173 #endif
00174 #endif // defined(TVMET_HAVE_LONG_DOUBLE)
00175
00176 #undef TVMET_DECLARE_MACRO
00177
00178
00179 #if defined(TVMET_HAVE_COMPLEX)
00180
00181
00182
00183 #define TVMET_DECLARE_MACRO(NAME) \
00184 template<class E, std::size_t Sz, class T> \
00185 inline \
00186 XprVector< \
00187 XprBinOp< \
00188 Fcnl_##NAME<typename E::value_type, std::complex<T> >, \
00189 XprVector<E, Sz>, \
00190 XprLiteral< std::complex<T> > \
00191 >, \
00192 Sz \
00193 > \
00194 NAME(const XprVector<E, Sz>& lhs, \
00195 const std::complex<T>& rhs) TVMET_CXX_ALWAYS_INLINE;
00196
00197 TVMET_DECLARE_MACRO(atan2)
00198 TVMET_DECLARE_MACRO(fmod)
00199 TVMET_DECLARE_MACRO(pow)
00200 #if defined(TVMET_HAVE_DREM)
00201 TVMET_DECLARE_MACRO(drem)
00202 #endif
00203 #if defined(TVMET_HAVE_HYPOT)
00204 TVMET_DECLARE_MACRO(hypot)
00205 #endif
00206 #if defined(TVMET_HAVE_JN)
00207 TVMET_DECLARE_MACRO(jn)
00208 #endif
00209 #if defined(TVMET_HAVE_YN)
00210 TVMET_DECLARE_MACRO(yn)
00211 #endif
00212
00213 #undef TVMET_DECLARE_MACRO
00214
00215 #endif // defined(TVMET_HAVE_COMPLEX)
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226 #define TVMET_IMPLEMENT_MACRO(NAME) \
00227 template<class E1, class E2, std::size_t Sz> \
00228 inline \
00229 XprVector< \
00230 XprBinOp< \
00231 Fcnl_##NAME<typename E1::value_type, typename E2::value_type>, \
00232 XprVector<E1, Sz>, \
00233 XprVector<E2, Sz> \
00234 >, \
00235 Sz \
00236 > \
00237 NAME(const XprVector<E1, Sz>& lhs, const XprVector<E2, Sz>& rhs) { \
00238 typedef XprBinOp< \
00239 Fcnl_##NAME<typename E1::value_type, typename E2::value_type>, \
00240 XprVector<E1, Sz>, \
00241 XprVector<E2, Sz> \
00242 > expr_type; \
00243 return XprVector<expr_type, Sz>( \
00244 expr_type(lhs, rhs)); \
00245 }
00246
00247 TVMET_IMPLEMENT_MACRO(atan2)
00248 TVMET_IMPLEMENT_MACRO(fmod)
00249 TVMET_IMPLEMENT_MACRO(pow)
00250 #if defined(TVMET_HAVE_DREM)
00251 TVMET_IMPLEMENT_MACRO(drem)
00252 #endif
00253 #if defined(TVMET_HAVE_HYPOT)
00254 TVMET_IMPLEMENT_MACRO(hypot)
00255 #endif
00256 #if defined(TVMET_HAVE_JN)
00257 TVMET_IMPLEMENT_MACRO(jn)
00258 #endif
00259 #if defined(TVMET_HAVE_YN)
00260 TVMET_IMPLEMENT_MACRO(yn)
00261 #endif
00262
00263 #undef TVMET_IMPLEMENT_MACRO
00264
00265
00266
00267
00268
00269 #define TVMET_IMPLEMENT_MACRO(NAME, TP) \
00270 template<class E, std::size_t Sz> \
00271 inline \
00272 XprVector< \
00273 XprBinOp< \
00274 Fcnl_##NAME<typename E::value_type, TP >, \
00275 XprVector<E, Sz>, \
00276 XprLiteral< TP > \
00277 >, \
00278 Sz \
00279 > \
00280 NAME(const XprVector<E, Sz>& lhs, TP rhs) { \
00281 typedef XprBinOp< \
00282 Fcnl_##NAME<typename E::value_type, TP >, \
00283 XprVector<E, Sz>, \
00284 XprLiteral< TP > \
00285 > expr_type; \
00286 return XprVector<expr_type, Sz>( \
00287 expr_type(lhs, XprLiteral< TP >(rhs))); \
00288 }
00289
00290 TVMET_IMPLEMENT_MACRO(atan2, int)
00291 TVMET_IMPLEMENT_MACRO(fmod, int)
00292 TVMET_IMPLEMENT_MACRO(pow, int)
00293 #if defined(TVMET_HAVE_DREM)
00294 TVMET_IMPLEMENT_MACRO(drem, int)
00295 #endif
00296 #if defined(TVMET_HAVE_HYPOT)
00297 TVMET_IMPLEMENT_MACRO(hypot, int)
00298 #endif
00299 #if defined(TVMET_HAVE_JN)
00300 TVMET_IMPLEMENT_MACRO(jn, int)
00301 #endif
00302 #if defined(TVMET_HAVE_YN)
00303 TVMET_IMPLEMENT_MACRO(yn, int)
00304 #endif
00305
00306
00307 #if defined(TVMET_HAVE_LONG_LONG)
00308 TVMET_IMPLEMENT_MACRO(atan2, long long int)
00309 TVMET_IMPLEMENT_MACRO(fmod, long long int)
00310 TVMET_IMPLEMENT_MACRO(pow, long long int)
00311 #if defined(TVMET_HAVE_DREM)
00312 TVMET_IMPLEMENT_MACRO(drem, long long int)
00313 #endif
00314 #if defined(TVMET_HAVE_HYPOT)
00315 TVMET_IMPLEMENT_MACRO(hypot, long long int)
00316 #endif
00317 #if defined(TVMET_HAVE_JN)
00318 TVMET_IMPLEMENT_MACRO(jn, long long int)
00319 #endif
00320 #if defined(TVMET_HAVE_YN)
00321 TVMET_IMPLEMENT_MACRO(yn, long long int)
00322 #endif
00323 #endif // defined(TVMET_HAVE_LONG_LONG)
00324
00325
00326 TVMET_IMPLEMENT_MACRO(atan2, float)
00327 TVMET_IMPLEMENT_MACRO(fmod, float)
00328 TVMET_IMPLEMENT_MACRO(pow, float)
00329 #if defined(TVMET_HAVE_DREM)
00330 TVMET_IMPLEMENT_MACRO(drem, float)
00331 #endif
00332 #if defined(TVMET_HAVE_HYPOT)
00333 TVMET_IMPLEMENT_MACRO(hypot, float)
00334 #endif
00335 #if defined(TVMET_HAVE_JN)
00336 TVMET_IMPLEMENT_MACRO(jn, float)
00337 #endif
00338 #if defined(TVMET_HAVE_YN)
00339 TVMET_IMPLEMENT_MACRO(yn, float)
00340 #endif
00341
00342
00343 TVMET_IMPLEMENT_MACRO(atan2, double)
00344 TVMET_IMPLEMENT_MACRO(fmod, double)
00345 TVMET_IMPLEMENT_MACRO(pow, double)
00346 #if defined(TVMET_HAVE_DREM)
00347 TVMET_IMPLEMENT_MACRO(drem, double)
00348 #endif
00349 #if defined(TVMET_HAVE_HYPOT)
00350 TVMET_IMPLEMENT_MACRO(hypot, double)
00351 #endif
00352 #if defined(TVMET_HAVE_JN)
00353 TVMET_IMPLEMENT_MACRO(jn, double)
00354 #endif
00355 #if defined(TVMET_HAVE_YN)
00356 TVMET_IMPLEMENT_MACRO(yn, double)
00357 #endif
00358
00359
00360 #if defined(TVMET_HAVE_LONG_DOUBLE)
00361 TVMET_IMPLEMENT_MACRO(atan2, long double)
00362 TVMET_IMPLEMENT_MACRO(fmod, long double)
00363 TVMET_IMPLEMENT_MACRO(pow, long double)
00364 #if defined(TVMET_HAVE_DREM)
00365 TVMET_IMPLEMENT_MACRO(drem, long double)
00366 #endif
00367 #if defined(TVMET_HAVE_HYPOT)
00368 TVMET_IMPLEMENT_MACRO(hypot, long double)
00369 #endif
00370 #if defined(TVMET_HAVE_JN)
00371 TVMET_IMPLEMENT_MACRO(jn, long double)
00372 #endif
00373 #if defined(TVMET_HAVE_YN)
00374 TVMET_IMPLEMENT_MACRO(yn, long double)
00375 #endif
00376 #endif // defined(TVMET_HAVE_LONG_DOUBLE)
00377
00378 #undef TVMET_IMPLEMENT_MACRO
00379
00380
00381 #if defined(TVMET_HAVE_COMPLEX)
00382
00383
00384
00385 #define TVMET_IMPLEMENT_MACRO(NAME) \
00386 template<class E, std::size_t Sz, class T> \
00387 inline \
00388 XprVector< \
00389 XprBinOp< \
00390 Fcnl_##NAME<typename E::value_type, std::complex<T> >, \
00391 XprVector<E, Sz>, \
00392 XprLiteral< std::complex<T> > \
00393 >, \
00394 Sz \
00395 > \
00396 NAME(const XprVector<E, Sz>& lhs, const std::complex<T>& rhs) { \
00397 typedef XprBinOp< \
00398 Fcnl_##NAME<typename E::value_type, std::complex<T> >, \
00399 XprVector<E, Sz>, \
00400 XprLiteral< std::complex<T> > \
00401 > expr_type; \
00402 return XprVector<expr_type, Sz>( \
00403 expr_type(lhs, XprLiteral< std::complex<T> >(rhs))); \
00404 }
00405
00406 TVMET_IMPLEMENT_MACRO(atan2)
00407 TVMET_IMPLEMENT_MACRO(drem)
00408 TVMET_IMPLEMENT_MACRO(fmod)
00409 TVMET_IMPLEMENT_MACRO(hypot)
00410 TVMET_IMPLEMENT_MACRO(jn)
00411 TVMET_IMPLEMENT_MACRO(yn)
00412 TVMET_IMPLEMENT_MACRO(pow)
00413
00414 #undef TVMET_IMPLEMENT_MACRO
00415
00416 #endif // defined(TVMET_HAVE_COMPLEX)
00417
00418
00419 }
00420
00421 #endif // TVMET_XPR_VECTOR_BINARY_FUNCTIONS_H
00422
00423
00424
00425
00426