ICRS Eurobot 2013

Dependencies:   mbed mbed-rtos Servo QEI

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MatrixUnaryFunctions.h Source File

MatrixUnaryFunctions.h

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: MatrixUnaryFunctions.h,v 1.13 2007-06-23 15:58:58 opetzold Exp $
00022  */
00023 
00024 #ifndef TVMET_MATRIX_UNARY_FUNCTIONS_H
00025 #define TVMET_MATRIX_UNARY_FUNCTIONS_H
00026 
00027 namespace tvmet {
00028 
00029 
00030 /*********************************************************
00031  * PART I: DECLARATION
00032  *********************************************************/
00033 
00034 /*
00035  * unary_function(Matrix<T, Rows, Cols>)
00036  */
00037 #define TVMET_DECLARE_MACRO(NAME)                \
00038 template<class T, std::size_t Rows, std::size_t Cols>        \
00039 inline                                \
00040 XprMatrix<                            \
00041   XprUnOp<                            \
00042     Fcnl_##NAME<T>,                        \
00043     MatrixConstReference<T, Rows, Cols>                \
00044   >,                                \
00045   Rows, Cols                            \
00046 >                                \
00047 NAME(const Matrix<T, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
00048 
00049 TVMET_DECLARE_MACRO(abs)
00050 TVMET_DECLARE_MACRO(cbrt)
00051 TVMET_DECLARE_MACRO(ceil)
00052 TVMET_DECLARE_MACRO(floor)
00053 TVMET_DECLARE_MACRO(rint)
00054 TVMET_DECLARE_MACRO(sin)
00055 TVMET_DECLARE_MACRO(cos)
00056 TVMET_DECLARE_MACRO(tan)
00057 TVMET_DECLARE_MACRO(sinh)
00058 TVMET_DECLARE_MACRO(cosh)
00059 TVMET_DECLARE_MACRO(tanh)
00060 TVMET_DECLARE_MACRO(asin)
00061 TVMET_DECLARE_MACRO(acos)
00062 TVMET_DECLARE_MACRO(atan)
00063 TVMET_DECLARE_MACRO(exp)
00064 TVMET_DECLARE_MACRO(log)
00065 TVMET_DECLARE_MACRO(log10)
00066 TVMET_DECLARE_MACRO(sqrt)
00067 
00068 #if defined(TVMET_HAVE_IEEE_MATH)
00069 TVMET_DECLARE_MACRO(asinh)
00070 TVMET_DECLARE_MACRO(acosh)
00071 TVMET_DECLARE_MACRO(atanh)
00072 TVMET_DECLARE_MACRO(expm1)
00073 TVMET_DECLARE_MACRO(log1p)
00074 TVMET_DECLARE_MACRO(erf)
00075 TVMET_DECLARE_MACRO(erfc)
00076 TVMET_DECLARE_MACRO(j0)
00077 TVMET_DECLARE_MACRO(j1)
00078 TVMET_DECLARE_MACRO(y0)
00079 TVMET_DECLARE_MACRO(y1)
00080 TVMET_DECLARE_MACRO(lgamma)
00081 /** \todo isnan etc. - default return is only an int! */
00082 
00083 TVMET_DECLARE_MACRO(finite)
00084 #endif // defined(TVMET_HAVE_IEEE_MATH)
00085 
00086 #undef TVMET_DECLARE_MACRO
00087 
00088 
00089 /*
00090  * unary_function(Matrix<std::complex<T>, Rows, Cols>)
00091  */
00092 #if defined(TVMET_HAVE_COMPLEX)
00093 #define TVMET_DECLARE_MACRO(NAME)                        \
00094 template<class T, std::size_t Rows, std::size_t Cols>                \
00095 inline                                        \
00096 XprMatrix<                                    \
00097   XprUnOp<                                    \
00098     Fcnl_##NAME< std::complex<T> >,                        \
00099     MatrixConstReference<std::complex<T>, Rows, Cols>                \
00100   >,                                        \
00101   Rows, Cols                                    \
00102 >                                        \
00103 NAME(const Matrix<std::complex<T>, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
00104 
00105 TVMET_DECLARE_MACRO(real)
00106 TVMET_DECLARE_MACRO(imag)
00107 TVMET_DECLARE_MACRO(arg)
00108 TVMET_DECLARE_MACRO(norm)
00109 TVMET_DECLARE_MACRO(conj)
00110 
00111 #undef TVMET_DECLARE_MACRO
00112 
00113 #endif // defined(TVMET_HAVE_COMPLEX)
00114 
00115 
00116 /*********************************************************
00117  * PART II: IMPLEMENTATION
00118  *********************************************************/
00119 
00120 
00121 /*
00122  * unary_function(Matrix<T, Rows, Cols>)
00123  */
00124 #define TVMET_IMPLEMENT_MACRO(NAME)                    \
00125 template<class T, std::size_t Rows, std::size_t Cols>            \
00126 inline                                    \
00127 XprMatrix<                                \
00128   XprUnOp<                                \
00129     Fcnl_##NAME<T>,                            \
00130     MatrixConstReference<T, Rows, Cols>                    \
00131   >,                                    \
00132   Rows, Cols                                \
00133 >                                    \
00134 NAME(const Matrix<T, Rows, Cols>& rhs) {                \
00135   typedef XprUnOp<                            \
00136     Fcnl_##NAME<T>,                            \
00137     MatrixConstReference<T, Rows, Cols>                    \
00138   >                             expr_type;    \
00139   return XprMatrix<expr_type, Rows, Cols>(expr_type(rhs.const_ref()));    \
00140 }
00141 
00142 TVMET_IMPLEMENT_MACRO(abs)
00143 TVMET_IMPLEMENT_MACRO(cbrt)
00144 TVMET_IMPLEMENT_MACRO(ceil)
00145 TVMET_IMPLEMENT_MACRO(floor)
00146 TVMET_IMPLEMENT_MACRO(rint)
00147 TVMET_IMPLEMENT_MACRO(sin)
00148 TVMET_IMPLEMENT_MACRO(cos)
00149 TVMET_IMPLEMENT_MACRO(tan)
00150 TVMET_IMPLEMENT_MACRO(sinh)
00151 TVMET_IMPLEMENT_MACRO(cosh)
00152 TVMET_IMPLEMENT_MACRO(tanh)
00153 TVMET_IMPLEMENT_MACRO(asin)
00154 TVMET_IMPLEMENT_MACRO(acos)
00155 TVMET_IMPLEMENT_MACRO(atan)
00156 TVMET_IMPLEMENT_MACRO(exp)
00157 TVMET_IMPLEMENT_MACRO(log)
00158 TVMET_IMPLEMENT_MACRO(log10)
00159 TVMET_IMPLEMENT_MACRO(sqrt)
00160 
00161 #if defined(TVMET_HAVE_IEEE_MATH)
00162 TVMET_IMPLEMENT_MACRO(asinh)
00163 TVMET_IMPLEMENT_MACRO(acosh)
00164 TVMET_IMPLEMENT_MACRO(atanh)
00165 TVMET_IMPLEMENT_MACRO(expm1)
00166 TVMET_IMPLEMENT_MACRO(log1p)
00167 TVMET_IMPLEMENT_MACRO(erf)
00168 TVMET_IMPLEMENT_MACRO(erfc)
00169 TVMET_IMPLEMENT_MACRO(j0)
00170 TVMET_IMPLEMENT_MACRO(j1)
00171 TVMET_IMPLEMENT_MACRO(y0)
00172 TVMET_IMPLEMENT_MACRO(y1)
00173 TVMET_IMPLEMENT_MACRO(lgamma)
00174 /** \todo isnan etc. - default return is only an int! */
00175 
00176 TVMET_IMPLEMENT_MACRO(finite)
00177 #endif // defined(TVMET_HAVE_IEEE_MATH)
00178 
00179 #undef TVMET_IMPLEMENT_MACRO
00180 
00181 
00182 /*
00183  * unary_function(Matrix<std::complex<T>, Rows, Cols>)
00184  */
00185 #if defined(TVMET_HAVE_COMPLEX)
00186 #define TVMET_IMPLEMENT_MACRO(NAME)                    \
00187 template<class T, std::size_t Rows, std::size_t Cols>            \
00188 inline                                    \
00189 XprMatrix<                                \
00190   XprUnOp<                                \
00191     Fcnl_##NAME< std::complex<T> >,                    \
00192     MatrixConstReference<std::complex<T>, Rows, Cols>            \
00193   >,                                    \
00194   Rows, Cols                                \
00195 >                                    \
00196 NAME(const Matrix<std::complex<T>, Rows, Cols>& rhs) {            \
00197   typedef XprUnOp<                            \
00198     Fcnl_##NAME< std::complex<T> >,                    \
00199     MatrixConstReference<std::complex<T>, Rows, Cols>            \
00200   >                             expr_type;    \
00201   return XprMatrix<expr_type, Rows, Cols>(expr_type(rhs.const_ref()));    \
00202 }
00203 
00204 TVMET_IMPLEMENT_MACRO(real)
00205 TVMET_IMPLEMENT_MACRO(imag)
00206 TVMET_IMPLEMENT_MACRO(arg)
00207 TVMET_IMPLEMENT_MACRO(norm)
00208 TVMET_IMPLEMENT_MACRO(conj)
00209 
00210 #undef TVMET_IMPLEMENT_MACRO
00211 
00212 #endif // defined(TVMET_HAVE_COMPLEX)
00213 
00214 
00215 } // namespace tvmet
00216 
00217 #endif // TVMET_MATRIX_UNARY_FUNCTIONS_H
00218 
00219 // Local Variables:
00220 // mode:C++
00221 // tab-width:8
00222 // End: