SourceForge Logo Tiny Vector Matrix library using Expression Templates Sourceforge Project Page

include/tvmet/xpr/VectorBinaryFunctions.h
Go to the documentation of this file.
00001 /*
00002  * Tiny Vector Matrix Library
00003  * Dense Vector Matrix Libary of Tiny size using Expression Templates
00004  *
00005  * Copyright (C) 2001 - 2007 Olaf Petzold <opetzold@users.sourceforge.net>
00006  *
00007  * This library is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2.1 of the License, or (at your option) any later version.
00011  *
00012  * This library is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with this library; if not, write to the Free Software
00019  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00020  *
00021  * $Id: VectorBinaryFunctions.h,v 1.13 2008/02/08 19:13:26 opetzold Exp $
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  * PART I: DECLARATION
00032  *********************************************************/
00033 
00034 
00035 /*
00036  * binary_function(XprVector<E1, Sz>, XprVector<E2, Sz>)
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  * binary_function(XprVector<E, Sz>, POD)
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  * binary_function(XprVector<E, Sz>, std::complex<>)
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  * PART II: IMPLEMENTATION
00220  *********************************************************/
00221 
00222 
00223 /*
00224  * binary_function(XprVector<E1, Sz>, XprVector<E2, Sz>)
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  * binary_function(XprVector<E, Sz>, POD)
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  * binary_function(XprVector<E, Sz>, std::complex<>)
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 } // namespace tvmet
00420 
00421 #endif // TVMET_XPR_VECTOR_BINARY_FUNCTIONS_H
00422 
00423 // Local Variables:
00424 // mode:C++
00425 // tab-width:8
00426 // End:
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Defines

Author: