Eurobot2012_Secondary

Fork of Eurobot_2012_Secondary by Shuto Naruse

Committer:
narshu
Date:
Wed Oct 17 22:25:31 2012 +0000
Revision:
1:cc2a9eb0bd55
Commit before publishing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
narshu 1:cc2a9eb0bd55 1 /*
narshu 1:cc2a9eb0bd55 2 * Tiny Vector Matrix Library
narshu 1:cc2a9eb0bd55 3 * Dense Vector Matrix Libary of Tiny size using Expression Templates
narshu 1:cc2a9eb0bd55 4 *
narshu 1:cc2a9eb0bd55 5 * Copyright (C) 2001 - 2007 Olaf Petzold <opetzold@users.sourceforge.net>
narshu 1:cc2a9eb0bd55 6 *
narshu 1:cc2a9eb0bd55 7 * This library is free software; you can redistribute it and/or
narshu 1:cc2a9eb0bd55 8 * modify it under the terms of the GNU lesser General Public
narshu 1:cc2a9eb0bd55 9 * License as published by the Free Software Foundation; either
narshu 1:cc2a9eb0bd55 10 * version 2.1 of the License, or (at your option) any later version.
narshu 1:cc2a9eb0bd55 11 *
narshu 1:cc2a9eb0bd55 12 * This library is distributed in the hope that it will be useful,
narshu 1:cc2a9eb0bd55 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
narshu 1:cc2a9eb0bd55 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
narshu 1:cc2a9eb0bd55 15 * lesser General Public License for more details.
narshu 1:cc2a9eb0bd55 16 *
narshu 1:cc2a9eb0bd55 17 * You should have received a copy of the GNU lesser General Public
narshu 1:cc2a9eb0bd55 18 * License along with this library; if not, write to the Free Software
narshu 1:cc2a9eb0bd55 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
narshu 1:cc2a9eb0bd55 20 *
narshu 1:cc2a9eb0bd55 21 * $Id: MatrixOperators.h,v 1.23 2007-06-23 15:59:00 opetzold Exp $
narshu 1:cc2a9eb0bd55 22 */
narshu 1:cc2a9eb0bd55 23
narshu 1:cc2a9eb0bd55 24 #ifndef TVMET_XPR_MATRIX_OPERATORS_H
narshu 1:cc2a9eb0bd55 25 #define TVMET_XPR_MATRIX_OPERATORS_H
narshu 1:cc2a9eb0bd55 26
narshu 1:cc2a9eb0bd55 27 namespace tvmet {
narshu 1:cc2a9eb0bd55 28
narshu 1:cc2a9eb0bd55 29
narshu 1:cc2a9eb0bd55 30 /*********************************************************
narshu 1:cc2a9eb0bd55 31 * PART I: DECLARATION
narshu 1:cc2a9eb0bd55 32 *********************************************************/
narshu 1:cc2a9eb0bd55 33
narshu 1:cc2a9eb0bd55 34
narshu 1:cc2a9eb0bd55 35 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 1:cc2a9eb0bd55 36 * Matrix arithmetic operators implemented by functions
narshu 1:cc2a9eb0bd55 37 * add, sub, mul and div
narshu 1:cc2a9eb0bd55 38 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 1:cc2a9eb0bd55 39
narshu 1:cc2a9eb0bd55 40
narshu 1:cc2a9eb0bd55 41 /*
narshu 1:cc2a9eb0bd55 42 * operator(const XprMatrix<E1, Rows1, Cols1>& lhs, const XprMatrix<E2, Cols1,Cols2>& rhs)
narshu 1:cc2a9eb0bd55 43 *
narshu 1:cc2a9eb0bd55 44 * Note: operations +,-,*,/ are per se element wise. Further more,
narshu 1:cc2a9eb0bd55 45 * element wise operations make sense only for matrices of the same
narshu 1:cc2a9eb0bd55 46 * size [varg].
narshu 1:cc2a9eb0bd55 47 */
narshu 1:cc2a9eb0bd55 48 #define TVMET_DECLARE_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 49 template<class E1, std::size_t Rows1, std::size_t Cols1, \
narshu 1:cc2a9eb0bd55 50 class E2> \
narshu 1:cc2a9eb0bd55 51 XprMatrix< \
narshu 1:cc2a9eb0bd55 52 XprBinOp< \
narshu 1:cc2a9eb0bd55 53 Fcnl_##NAME<typename E1::value_type, typename E2::value_type>, \
narshu 1:cc2a9eb0bd55 54 XprMatrix<E1, Rows1, Cols1>, \
narshu 1:cc2a9eb0bd55 55 XprMatrix<E2, Rows1, Cols1> \
narshu 1:cc2a9eb0bd55 56 >, \
narshu 1:cc2a9eb0bd55 57 Rows1, Cols1 \
narshu 1:cc2a9eb0bd55 58 > \
narshu 1:cc2a9eb0bd55 59 operator OP (const XprMatrix<E1, Rows1, Cols1>& lhs, \
narshu 1:cc2a9eb0bd55 60 const XprMatrix<E2, Rows1, Cols1>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 1:cc2a9eb0bd55 61
narshu 1:cc2a9eb0bd55 62 TVMET_DECLARE_MACRO(add, +) // per se element wise
narshu 1:cc2a9eb0bd55 63 TVMET_DECLARE_MACRO(sub, -) // per se element wise
narshu 1:cc2a9eb0bd55 64 namespace element_wise {
narshu 1:cc2a9eb0bd55 65 TVMET_DECLARE_MACRO(mul, *) // see as prod()
narshu 1:cc2a9eb0bd55 66 TVMET_DECLARE_MACRO(div, /) // not defined for matrizes, must be element_wise
narshu 1:cc2a9eb0bd55 67 }
narshu 1:cc2a9eb0bd55 68 #undef TVMET_DECLARE_MACRO
narshu 1:cc2a9eb0bd55 69
narshu 1:cc2a9eb0bd55 70
narshu 1:cc2a9eb0bd55 71 /*
narshu 1:cc2a9eb0bd55 72 * operator(XprMatrix<E, Rows, Cols>, POD)
narshu 1:cc2a9eb0bd55 73 * operator(POD, XprMatrix<E, Rows, Cols>)
narshu 1:cc2a9eb0bd55 74 * Note: operations +,-,*,/ are per se element wise
narshu 1:cc2a9eb0bd55 75 */
narshu 1:cc2a9eb0bd55 76 #define TVMET_DECLARE_MACRO(NAME, OP, POD) \
narshu 1:cc2a9eb0bd55 77 template<class E, std::size_t Rows, std::size_t Cols> \
narshu 1:cc2a9eb0bd55 78 XprMatrix< \
narshu 1:cc2a9eb0bd55 79 XprBinOp< \
narshu 1:cc2a9eb0bd55 80 Fcnl_##NAME<typename E::value_type, POD >, \
narshu 1:cc2a9eb0bd55 81 XprMatrix<E, Rows, Cols>, \
narshu 1:cc2a9eb0bd55 82 XprLiteral< POD > \
narshu 1:cc2a9eb0bd55 83 >, \
narshu 1:cc2a9eb0bd55 84 Rows, Cols \
narshu 1:cc2a9eb0bd55 85 > \
narshu 1:cc2a9eb0bd55 86 operator OP (const XprMatrix<E, Rows, Cols>& lhs, \
narshu 1:cc2a9eb0bd55 87 POD rhs) TVMET_CXX_ALWAYS_INLINE; \
narshu 1:cc2a9eb0bd55 88 \
narshu 1:cc2a9eb0bd55 89 template<class E,std::size_t Rows, std::size_t Cols> \
narshu 1:cc2a9eb0bd55 90 XprMatrix< \
narshu 1:cc2a9eb0bd55 91 XprBinOp< \
narshu 1:cc2a9eb0bd55 92 Fcnl_##NAME<POD, typename E::value_type>, \
narshu 1:cc2a9eb0bd55 93 XprLiteral< POD >, \
narshu 1:cc2a9eb0bd55 94 XprMatrix<E, Rows, Cols> \
narshu 1:cc2a9eb0bd55 95 >, \
narshu 1:cc2a9eb0bd55 96 Rows, Cols \
narshu 1:cc2a9eb0bd55 97 > \
narshu 1:cc2a9eb0bd55 98 operator OP (POD lhs, \
narshu 1:cc2a9eb0bd55 99 const XprMatrix<E, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 1:cc2a9eb0bd55 100
narshu 1:cc2a9eb0bd55 101 TVMET_DECLARE_MACRO(add, +, int)
narshu 1:cc2a9eb0bd55 102 TVMET_DECLARE_MACRO(sub, -, int)
narshu 1:cc2a9eb0bd55 103 TVMET_DECLARE_MACRO(mul, *, int)
narshu 1:cc2a9eb0bd55 104 TVMET_DECLARE_MACRO(div, /, int)
narshu 1:cc2a9eb0bd55 105
narshu 1:cc2a9eb0bd55 106 #if defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 107 TVMET_DECLARE_MACRO(add, +, long long int)
narshu 1:cc2a9eb0bd55 108 TVMET_DECLARE_MACRO(sub, -, long long int)
narshu 1:cc2a9eb0bd55 109 TVMET_DECLARE_MACRO(mul, *, long long int)
narshu 1:cc2a9eb0bd55 110 TVMET_DECLARE_MACRO(div, /, long long int)
narshu 1:cc2a9eb0bd55 111 #endif // defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 112
narshu 1:cc2a9eb0bd55 113 TVMET_DECLARE_MACRO(add, +, float)
narshu 1:cc2a9eb0bd55 114 TVMET_DECLARE_MACRO(sub, -, float)
narshu 1:cc2a9eb0bd55 115 TVMET_DECLARE_MACRO(mul, *, float)
narshu 1:cc2a9eb0bd55 116 TVMET_DECLARE_MACRO(div, /, float)
narshu 1:cc2a9eb0bd55 117
narshu 1:cc2a9eb0bd55 118 TVMET_DECLARE_MACRO(add, +, double)
narshu 1:cc2a9eb0bd55 119 TVMET_DECLARE_MACRO(sub, -, double)
narshu 1:cc2a9eb0bd55 120 TVMET_DECLARE_MACRO(mul, *, double)
narshu 1:cc2a9eb0bd55 121 TVMET_DECLARE_MACRO(div, /, double)
narshu 1:cc2a9eb0bd55 122
narshu 1:cc2a9eb0bd55 123 #if defined(TVMET_HAVE_LONG_DOUBLE)
narshu 1:cc2a9eb0bd55 124 TVMET_DECLARE_MACRO(add, +, long double)
narshu 1:cc2a9eb0bd55 125 TVMET_DECLARE_MACRO(sub, -, long double)
narshu 1:cc2a9eb0bd55 126 TVMET_DECLARE_MACRO(mul, *, long double)
narshu 1:cc2a9eb0bd55 127 TVMET_DECLARE_MACRO(div, /, long double)
narshu 1:cc2a9eb0bd55 128 #endif // defined(TVMET_HAVE_LONG_DOUBLE)
narshu 1:cc2a9eb0bd55 129
narshu 1:cc2a9eb0bd55 130 #undef TVMET_DECLARE_MACRO
narshu 1:cc2a9eb0bd55 131
narshu 1:cc2a9eb0bd55 132
narshu 1:cc2a9eb0bd55 133 #if defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 134 /*
narshu 1:cc2a9eb0bd55 135 * operator(XprMatrix<E, Rows, Cols>, complex<>)
narshu 1:cc2a9eb0bd55 136 * operator(complex<>, XprMatrix<E, Rows, Cols>)
narshu 1:cc2a9eb0bd55 137 * Note: operations +,-,*,/ are per se element wise
narshu 1:cc2a9eb0bd55 138 * \todo type promotion
narshu 1:cc2a9eb0bd55 139 */
narshu 1:cc2a9eb0bd55 140 #define TVMET_DECLARE_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 141 template<class E, std::size_t Rows, std::size_t Cols, class T> \
narshu 1:cc2a9eb0bd55 142 XprMatrix< \
narshu 1:cc2a9eb0bd55 143 XprBinOp< \
narshu 1:cc2a9eb0bd55 144 Fcnl_##NAME<typename E::value_type, std::complex<T> >, \
narshu 1:cc2a9eb0bd55 145 XprMatrix<E, Rows, Cols>, \
narshu 1:cc2a9eb0bd55 146 XprLiteral< std::complex<T> > \
narshu 1:cc2a9eb0bd55 147 >, \
narshu 1:cc2a9eb0bd55 148 Rows, Cols \
narshu 1:cc2a9eb0bd55 149 > \
narshu 1:cc2a9eb0bd55 150 operator OP (const XprMatrix<E, Rows, Cols>& lhs, \
narshu 1:cc2a9eb0bd55 151 const std::complex<T>& rhs) TVMET_CXX_ALWAYS_INLINE; \
narshu 1:cc2a9eb0bd55 152 \
narshu 1:cc2a9eb0bd55 153 template<class E, std::size_t Rows, std::size_t Cols, class T> \
narshu 1:cc2a9eb0bd55 154 XprMatrix< \
narshu 1:cc2a9eb0bd55 155 XprBinOp< \
narshu 1:cc2a9eb0bd55 156 Fcnl_##NAME<std::complex<T>, typename E::value_type>, \
narshu 1:cc2a9eb0bd55 157 XprLiteral< std::complex<T> >, \
narshu 1:cc2a9eb0bd55 158 XprMatrix<E, Rows, Cols> \
narshu 1:cc2a9eb0bd55 159 >, \
narshu 1:cc2a9eb0bd55 160 Rows, Cols \
narshu 1:cc2a9eb0bd55 161 > \
narshu 1:cc2a9eb0bd55 162 operator OP (const std::complex<T>& lhs, \
narshu 1:cc2a9eb0bd55 163 const XprMatrix<E, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 1:cc2a9eb0bd55 164
narshu 1:cc2a9eb0bd55 165 TVMET_DECLARE_MACRO(add, +)
narshu 1:cc2a9eb0bd55 166 TVMET_DECLARE_MACRO(sub, -)
narshu 1:cc2a9eb0bd55 167 TVMET_DECLARE_MACRO(mul, *)
narshu 1:cc2a9eb0bd55 168 TVMET_DECLARE_MACRO(div, /)
narshu 1:cc2a9eb0bd55 169
narshu 1:cc2a9eb0bd55 170 #undef TVMET_DECLARE_MACRO
narshu 1:cc2a9eb0bd55 171
narshu 1:cc2a9eb0bd55 172 #endif // defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 173
narshu 1:cc2a9eb0bd55 174
narshu 1:cc2a9eb0bd55 175 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 1:cc2a9eb0bd55 176 * matrix specific operator*() = prod() operations
narshu 1:cc2a9eb0bd55 177 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 1:cc2a9eb0bd55 178
narshu 1:cc2a9eb0bd55 179
narshu 1:cc2a9eb0bd55 180 /**
narshu 1:cc2a9eb0bd55 181 * \fn operator*(const XprMatrix<E1, Rows1, Cols1>& lhs, const XprMatrix<E2, Cols1, Cols2>& rhs)
narshu 1:cc2a9eb0bd55 182 * \brief Evaluate the product of two XprMatrix.
narshu 1:cc2a9eb0bd55 183 * \ingroup _binary_operator
narshu 1:cc2a9eb0bd55 184 * \sa prod(XprMatrix<E1, Rows1, Cols1> lhs, XprMatrix<E2, Cols1, Cols2> rhs)
narshu 1:cc2a9eb0bd55 185 */
narshu 1:cc2a9eb0bd55 186 template<class E1, std::size_t Rows1, std::size_t Cols1,
narshu 1:cc2a9eb0bd55 187 class E2, std::size_t Cols2>
narshu 1:cc2a9eb0bd55 188 XprMatrix<
narshu 1:cc2a9eb0bd55 189 XprMMProduct<
narshu 1:cc2a9eb0bd55 190 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
narshu 1:cc2a9eb0bd55 191 XprMatrix<E2, Cols1, Cols2>, Cols2 // M2(Cols1, Cols2)
narshu 1:cc2a9eb0bd55 192 >,
narshu 1:cc2a9eb0bd55 193 Rows1, Cols2
narshu 1:cc2a9eb0bd55 194 >
narshu 1:cc2a9eb0bd55 195 operator*(const XprMatrix<E1, Rows1, Cols1>& lhs,
narshu 1:cc2a9eb0bd55 196 const XprMatrix<E2, Cols1, Cols2>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 1:cc2a9eb0bd55 197
narshu 1:cc2a9eb0bd55 198
narshu 1:cc2a9eb0bd55 199 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 1:cc2a9eb0bd55 200 * matrix-vector specific prod( ... ) operators
narshu 1:cc2a9eb0bd55 201 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 1:cc2a9eb0bd55 202
narshu 1:cc2a9eb0bd55 203
narshu 1:cc2a9eb0bd55 204 /**
narshu 1:cc2a9eb0bd55 205 * \fn operator*(const XprMatrix<E1, Rows, Cols>& lhs, const XprVector<E2, Cols>& rhs)
narshu 1:cc2a9eb0bd55 206 * \brief Evaluate the product of XprMatrix and XprVector.
narshu 1:cc2a9eb0bd55 207 * \ingroup _binary_operator
narshu 1:cc2a9eb0bd55 208 * \sa prod(XprMatrix<E1, Rows, Cols> lhs, XprVector<E2, Cols> rhs)
narshu 1:cc2a9eb0bd55 209 */
narshu 1:cc2a9eb0bd55 210 template<class E1, std::size_t Rows, std::size_t Cols,
narshu 1:cc2a9eb0bd55 211 class E2>
narshu 1:cc2a9eb0bd55 212 XprVector<
narshu 1:cc2a9eb0bd55 213 XprMVProduct<
narshu 1:cc2a9eb0bd55 214 XprMatrix<E1, Rows, Cols>, Rows, Cols,
narshu 1:cc2a9eb0bd55 215 XprVector<E2, Cols>
narshu 1:cc2a9eb0bd55 216 >,
narshu 1:cc2a9eb0bd55 217 Rows
narshu 1:cc2a9eb0bd55 218 >
narshu 1:cc2a9eb0bd55 219 operator*(const XprMatrix<E1, Rows, Cols>& lhs,
narshu 1:cc2a9eb0bd55 220 const XprVector<E2, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 1:cc2a9eb0bd55 221
narshu 1:cc2a9eb0bd55 222
narshu 1:cc2a9eb0bd55 223 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 1:cc2a9eb0bd55 224 * Matrix integer and compare operators
narshu 1:cc2a9eb0bd55 225 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 1:cc2a9eb0bd55 226
narshu 1:cc2a9eb0bd55 227
narshu 1:cc2a9eb0bd55 228 /*
narshu 1:cc2a9eb0bd55 229 * operator(XprMatrix<>, XprMatrix<>)
narshu 1:cc2a9eb0bd55 230 * Note: operations are per se element wise
narshu 1:cc2a9eb0bd55 231 */
narshu 1:cc2a9eb0bd55 232 #define TVMET_DECLARE_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 233 template<class E1, std::size_t Rows, std::size_t Cols, \
narshu 1:cc2a9eb0bd55 234 class E2> \
narshu 1:cc2a9eb0bd55 235 XprMatrix< \
narshu 1:cc2a9eb0bd55 236 XprBinOp< \
narshu 1:cc2a9eb0bd55 237 Fcnl_##NAME<typename E1::value_type, typename E2::value_type>, \
narshu 1:cc2a9eb0bd55 238 XprMatrix<E1, Rows, Cols>, \
narshu 1:cc2a9eb0bd55 239 XprMatrix<E2, Rows, Cols> \
narshu 1:cc2a9eb0bd55 240 >, \
narshu 1:cc2a9eb0bd55 241 Rows, Cols \
narshu 1:cc2a9eb0bd55 242 > \
narshu 1:cc2a9eb0bd55 243 operator OP (const XprMatrix<E1, Rows, Cols>& lhs, \
narshu 1:cc2a9eb0bd55 244 const XprMatrix<E2, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 1:cc2a9eb0bd55 245
narshu 1:cc2a9eb0bd55 246 // integer operators only, e.g used on double you will get an error
narshu 1:cc2a9eb0bd55 247 namespace element_wise {
narshu 1:cc2a9eb0bd55 248 TVMET_DECLARE_MACRO(mod, %)
narshu 1:cc2a9eb0bd55 249 TVMET_DECLARE_MACRO(bitxor, ^)
narshu 1:cc2a9eb0bd55 250 TVMET_DECLARE_MACRO(bitand, &)
narshu 1:cc2a9eb0bd55 251 TVMET_DECLARE_MACRO(bitor, |)
narshu 1:cc2a9eb0bd55 252 TVMET_DECLARE_MACRO(shl, <<)
narshu 1:cc2a9eb0bd55 253 TVMET_DECLARE_MACRO(shr, >>)
narshu 1:cc2a9eb0bd55 254 }
narshu 1:cc2a9eb0bd55 255
narshu 1:cc2a9eb0bd55 256 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 257 TVMET_DECLARE_MACRO(greater, >)
narshu 1:cc2a9eb0bd55 258 TVMET_DECLARE_MACRO(less, <)
narshu 1:cc2a9eb0bd55 259 TVMET_DECLARE_MACRO(greater_eq, >=)
narshu 1:cc2a9eb0bd55 260 TVMET_DECLARE_MACRO(less_eq, <=)
narshu 1:cc2a9eb0bd55 261 TVMET_DECLARE_MACRO(eq, ==)
narshu 1:cc2a9eb0bd55 262 TVMET_DECLARE_MACRO(not_eq, !=)
narshu 1:cc2a9eb0bd55 263 TVMET_DECLARE_MACRO(and, &&)
narshu 1:cc2a9eb0bd55 264 TVMET_DECLARE_MACRO(or, ||)
narshu 1:cc2a9eb0bd55 265
narshu 1:cc2a9eb0bd55 266 #undef TVMET_DECLARE_MACRO
narshu 1:cc2a9eb0bd55 267
narshu 1:cc2a9eb0bd55 268
narshu 1:cc2a9eb0bd55 269 #if defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 270 /*
narshu 1:cc2a9eb0bd55 271 * operator(XprMatrix<E, Rows, Cols>, std::complex<>)
narshu 1:cc2a9eb0bd55 272 * operator(std::complex<>, XprMatrix<E, Rows, Cols>)
narshu 1:cc2a9eb0bd55 273 * Note: - per se element wise
narshu 1:cc2a9eb0bd55 274 * - bit ops on complex<int> doesn't make sense, stay away
narshu 1:cc2a9eb0bd55 275 * \todo type promotion
narshu 1:cc2a9eb0bd55 276 */
narshu 1:cc2a9eb0bd55 277 #define TVMET_DECLARE_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 278 template<class E, std::size_t Rows, std::size_t Cols, class T> \
narshu 1:cc2a9eb0bd55 279 XprMatrix< \
narshu 1:cc2a9eb0bd55 280 XprBinOp< \
narshu 1:cc2a9eb0bd55 281 Fcnl_##NAME<typename E::value_type, std::complex<T> >, \
narshu 1:cc2a9eb0bd55 282 XprMatrix<E, Rows, Cols>, \
narshu 1:cc2a9eb0bd55 283 XprLiteral< std::complex<T> > \
narshu 1:cc2a9eb0bd55 284 >, \
narshu 1:cc2a9eb0bd55 285 Rows, Cols \
narshu 1:cc2a9eb0bd55 286 > \
narshu 1:cc2a9eb0bd55 287 operator OP (const XprMatrix<E, Rows, Cols>& lhs, \
narshu 1:cc2a9eb0bd55 288 const std::complex<T>& rhs) TVMET_CXX_ALWAYS_INLINE; \
narshu 1:cc2a9eb0bd55 289 \
narshu 1:cc2a9eb0bd55 290 template<class E, std::size_t Rows, std::size_t Cols, class T> \
narshu 1:cc2a9eb0bd55 291 XprMatrix< \
narshu 1:cc2a9eb0bd55 292 XprBinOp< \
narshu 1:cc2a9eb0bd55 293 Fcnl_##NAME<std::complex<T>, typename E::value_type>, \
narshu 1:cc2a9eb0bd55 294 XprLiteral< std::complex<T> >, \
narshu 1:cc2a9eb0bd55 295 XprMatrix<E, Rows, Cols> \
narshu 1:cc2a9eb0bd55 296 >, \
narshu 1:cc2a9eb0bd55 297 Rows, Cols \
narshu 1:cc2a9eb0bd55 298 > \
narshu 1:cc2a9eb0bd55 299 operator OP (const std::complex<T>& lhs, \
narshu 1:cc2a9eb0bd55 300 const XprMatrix<E, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 1:cc2a9eb0bd55 301
narshu 1:cc2a9eb0bd55 302 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 303 TVMET_DECLARE_MACRO(greater, >)
narshu 1:cc2a9eb0bd55 304 TVMET_DECLARE_MACRO(less, <)
narshu 1:cc2a9eb0bd55 305 TVMET_DECLARE_MACRO(greater_eq, >=)
narshu 1:cc2a9eb0bd55 306 TVMET_DECLARE_MACRO(less_eq, <=)
narshu 1:cc2a9eb0bd55 307 TVMET_DECLARE_MACRO(eq, ==)
narshu 1:cc2a9eb0bd55 308 TVMET_DECLARE_MACRO(not_eq, !=)
narshu 1:cc2a9eb0bd55 309 TVMET_DECLARE_MACRO(and, &&)
narshu 1:cc2a9eb0bd55 310 TVMET_DECLARE_MACRO(or, ||)
narshu 1:cc2a9eb0bd55 311
narshu 1:cc2a9eb0bd55 312 #undef TVMET_DECLARE_MACRO
narshu 1:cc2a9eb0bd55 313
narshu 1:cc2a9eb0bd55 314 #endif // defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 315
narshu 1:cc2a9eb0bd55 316
narshu 1:cc2a9eb0bd55 317 /*
narshu 1:cc2a9eb0bd55 318 * operator(XprMatrix<E, Rows, Cols>, POD)
narshu 1:cc2a9eb0bd55 319 * operator(POD, XprMatrix<E, Rows, Cols>)
narshu 1:cc2a9eb0bd55 320 * Note: operations are per se element wise
narshu 1:cc2a9eb0bd55 321 */
narshu 1:cc2a9eb0bd55 322 #define TVMET_DECLARE_MACRO(NAME, OP, TP) \
narshu 1:cc2a9eb0bd55 323 template<class E, std::size_t Rows, std::size_t Cols> \
narshu 1:cc2a9eb0bd55 324 XprMatrix< \
narshu 1:cc2a9eb0bd55 325 XprBinOp< \
narshu 1:cc2a9eb0bd55 326 Fcnl_##NAME<typename E::value_type, TP >, \
narshu 1:cc2a9eb0bd55 327 XprMatrix<E, Rows, Cols>, \
narshu 1:cc2a9eb0bd55 328 XprLiteral< TP > \
narshu 1:cc2a9eb0bd55 329 >, \
narshu 1:cc2a9eb0bd55 330 Rows, Cols \
narshu 1:cc2a9eb0bd55 331 > \
narshu 1:cc2a9eb0bd55 332 operator OP (const XprMatrix<E, Rows, Cols>& lhs, \
narshu 1:cc2a9eb0bd55 333 TP rhs) TVMET_CXX_ALWAYS_INLINE; \
narshu 1:cc2a9eb0bd55 334 \
narshu 1:cc2a9eb0bd55 335 template<class E, std::size_t Rows, std::size_t Cols> \
narshu 1:cc2a9eb0bd55 336 XprMatrix< \
narshu 1:cc2a9eb0bd55 337 XprBinOp< \
narshu 1:cc2a9eb0bd55 338 Fcnl_##NAME<TP, typename E::value_type>, \
narshu 1:cc2a9eb0bd55 339 XprLiteral< TP >, \
narshu 1:cc2a9eb0bd55 340 XprMatrix<E, Rows, Cols> \
narshu 1:cc2a9eb0bd55 341 >, \
narshu 1:cc2a9eb0bd55 342 Rows, Cols \
narshu 1:cc2a9eb0bd55 343 > \
narshu 1:cc2a9eb0bd55 344 operator OP (TP lhs, \
narshu 1:cc2a9eb0bd55 345 const XprMatrix<E, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 1:cc2a9eb0bd55 346
narshu 1:cc2a9eb0bd55 347 // integer operators only, e.g used on double you will get an error
narshu 1:cc2a9eb0bd55 348 namespace element_wise {
narshu 1:cc2a9eb0bd55 349 TVMET_DECLARE_MACRO(mod, %, int)
narshu 1:cc2a9eb0bd55 350 TVMET_DECLARE_MACRO(bitxor, ^, int)
narshu 1:cc2a9eb0bd55 351 TVMET_DECLARE_MACRO(bitand, &, int)
narshu 1:cc2a9eb0bd55 352 TVMET_DECLARE_MACRO(bitor, |, int)
narshu 1:cc2a9eb0bd55 353 TVMET_DECLARE_MACRO(shl, <<, int)
narshu 1:cc2a9eb0bd55 354 TVMET_DECLARE_MACRO(shr, >>, int)
narshu 1:cc2a9eb0bd55 355 }
narshu 1:cc2a9eb0bd55 356
narshu 1:cc2a9eb0bd55 357 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 358 TVMET_DECLARE_MACRO(greater, >, int)
narshu 1:cc2a9eb0bd55 359 TVMET_DECLARE_MACRO(less, <, int)
narshu 1:cc2a9eb0bd55 360 TVMET_DECLARE_MACRO(greater_eq, >=, int)
narshu 1:cc2a9eb0bd55 361 TVMET_DECLARE_MACRO(less_eq, <=, int)
narshu 1:cc2a9eb0bd55 362 TVMET_DECLARE_MACRO(eq, ==, int)
narshu 1:cc2a9eb0bd55 363 TVMET_DECLARE_MACRO(not_eq, !=, int)
narshu 1:cc2a9eb0bd55 364 TVMET_DECLARE_MACRO(and, &&, int)
narshu 1:cc2a9eb0bd55 365 TVMET_DECLARE_MACRO(or, ||, int)
narshu 1:cc2a9eb0bd55 366
narshu 1:cc2a9eb0bd55 367 #if defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 368 // integer operators only
narshu 1:cc2a9eb0bd55 369 namespace element_wise {
narshu 1:cc2a9eb0bd55 370 TVMET_DECLARE_MACRO(mod, %, long long int)
narshu 1:cc2a9eb0bd55 371 TVMET_DECLARE_MACRO(bitxor, ^, long long int)
narshu 1:cc2a9eb0bd55 372 TVMET_DECLARE_MACRO(bitand, &, long long int)
narshu 1:cc2a9eb0bd55 373 TVMET_DECLARE_MACRO(bitor, |, long long int)
narshu 1:cc2a9eb0bd55 374 TVMET_DECLARE_MACRO(shl, <<, long long int)
narshu 1:cc2a9eb0bd55 375 TVMET_DECLARE_MACRO(shr, >>, long long int)
narshu 1:cc2a9eb0bd55 376 }
narshu 1:cc2a9eb0bd55 377
narshu 1:cc2a9eb0bd55 378 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 379 TVMET_DECLARE_MACRO(greater, >, long long int)
narshu 1:cc2a9eb0bd55 380 TVMET_DECLARE_MACRO(less, <, long long int)
narshu 1:cc2a9eb0bd55 381 TVMET_DECLARE_MACRO(greater_eq, >=, long long int)
narshu 1:cc2a9eb0bd55 382 TVMET_DECLARE_MACRO(less_eq, <=, long long int)
narshu 1:cc2a9eb0bd55 383 TVMET_DECLARE_MACRO(eq, ==, long long int)
narshu 1:cc2a9eb0bd55 384 TVMET_DECLARE_MACRO(not_eq, !=, long long int)
narshu 1:cc2a9eb0bd55 385 TVMET_DECLARE_MACRO(and, &&, long long int)
narshu 1:cc2a9eb0bd55 386 TVMET_DECLARE_MACRO(or, ||, long long int)
narshu 1:cc2a9eb0bd55 387 #endif // defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 388
narshu 1:cc2a9eb0bd55 389 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 390 TVMET_DECLARE_MACRO(greater, >, float)
narshu 1:cc2a9eb0bd55 391 TVMET_DECLARE_MACRO(less, <, float)
narshu 1:cc2a9eb0bd55 392 TVMET_DECLARE_MACRO(greater_eq, >=, float)
narshu 1:cc2a9eb0bd55 393 TVMET_DECLARE_MACRO(less_eq, <=, float)
narshu 1:cc2a9eb0bd55 394 TVMET_DECLARE_MACRO(eq, ==, float)
narshu 1:cc2a9eb0bd55 395 TVMET_DECLARE_MACRO(not_eq, !=, float)
narshu 1:cc2a9eb0bd55 396 TVMET_DECLARE_MACRO(and, &&, float)
narshu 1:cc2a9eb0bd55 397 TVMET_DECLARE_MACRO(or, ||, float)
narshu 1:cc2a9eb0bd55 398
narshu 1:cc2a9eb0bd55 399 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 400 TVMET_DECLARE_MACRO(greater, >, double)
narshu 1:cc2a9eb0bd55 401 TVMET_DECLARE_MACRO(less, <, double)
narshu 1:cc2a9eb0bd55 402 TVMET_DECLARE_MACRO(greater_eq, >=, double)
narshu 1:cc2a9eb0bd55 403 TVMET_DECLARE_MACRO(less_eq, <=, double)
narshu 1:cc2a9eb0bd55 404 TVMET_DECLARE_MACRO(eq, ==, double)
narshu 1:cc2a9eb0bd55 405 TVMET_DECLARE_MACRO(not_eq, !=, double)
narshu 1:cc2a9eb0bd55 406 TVMET_DECLARE_MACRO(and, &&, double)
narshu 1:cc2a9eb0bd55 407 TVMET_DECLARE_MACRO(or, ||, double)
narshu 1:cc2a9eb0bd55 408
narshu 1:cc2a9eb0bd55 409 #if defined(TVMET_HAVE_LONG_DOUBLE)
narshu 1:cc2a9eb0bd55 410 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 411 TVMET_DECLARE_MACRO(greater, >, long double)
narshu 1:cc2a9eb0bd55 412 TVMET_DECLARE_MACRO(less, <, long double)
narshu 1:cc2a9eb0bd55 413 TVMET_DECLARE_MACRO(greater_eq, >=, long double)
narshu 1:cc2a9eb0bd55 414 TVMET_DECLARE_MACRO(less_eq, <=, long double)
narshu 1:cc2a9eb0bd55 415 TVMET_DECLARE_MACRO(eq, ==, long double)
narshu 1:cc2a9eb0bd55 416 TVMET_DECLARE_MACRO(not_eq, !=, long double)
narshu 1:cc2a9eb0bd55 417 TVMET_DECLARE_MACRO(and, &&, long double)
narshu 1:cc2a9eb0bd55 418 TVMET_DECLARE_MACRO(or, ||, long double)
narshu 1:cc2a9eb0bd55 419 #endif // defined(TVMET_HAVE_LONG_DOUBLE)
narshu 1:cc2a9eb0bd55 420
narshu 1:cc2a9eb0bd55 421 #undef TVMET_DECLARE_MACRO
narshu 1:cc2a9eb0bd55 422
narshu 1:cc2a9eb0bd55 423
narshu 1:cc2a9eb0bd55 424 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 1:cc2a9eb0bd55 425 * global unary operators
narshu 1:cc2a9eb0bd55 426 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 1:cc2a9eb0bd55 427
narshu 1:cc2a9eb0bd55 428
narshu 1:cc2a9eb0bd55 429 /*
narshu 1:cc2a9eb0bd55 430 * unary_operator(const XprMatrix<E, Rows, Cols>& m)
narshu 1:cc2a9eb0bd55 431 * Note: per se element wise
narshu 1:cc2a9eb0bd55 432 */
narshu 1:cc2a9eb0bd55 433 #define TVMET_DECLARE_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 434 template <class E, std::size_t Rows, std::size_t Cols> \
narshu 1:cc2a9eb0bd55 435 XprMatrix< \
narshu 1:cc2a9eb0bd55 436 XprUnOp< \
narshu 1:cc2a9eb0bd55 437 Fcnl_##NAME<typename E::value_type>, \
narshu 1:cc2a9eb0bd55 438 XprMatrix<E, Rows, Cols> \
narshu 1:cc2a9eb0bd55 439 >, \
narshu 1:cc2a9eb0bd55 440 Rows, Cols \
narshu 1:cc2a9eb0bd55 441 > \
narshu 1:cc2a9eb0bd55 442 operator OP (const XprMatrix<E, Rows, Cols>& m) TVMET_CXX_ALWAYS_INLINE;
narshu 1:cc2a9eb0bd55 443
narshu 1:cc2a9eb0bd55 444 TVMET_DECLARE_MACRO(not, !)
narshu 1:cc2a9eb0bd55 445 TVMET_DECLARE_MACRO(compl, ~)
narshu 1:cc2a9eb0bd55 446 TVMET_DECLARE_MACRO(neg, -)
narshu 1:cc2a9eb0bd55 447
narshu 1:cc2a9eb0bd55 448 #undef TVMET_DECLARE_MACRO
narshu 1:cc2a9eb0bd55 449
narshu 1:cc2a9eb0bd55 450
narshu 1:cc2a9eb0bd55 451 /*********************************************************
narshu 1:cc2a9eb0bd55 452 * PART II: IMPLEMENTATION
narshu 1:cc2a9eb0bd55 453 *********************************************************/
narshu 1:cc2a9eb0bd55 454
narshu 1:cc2a9eb0bd55 455
narshu 1:cc2a9eb0bd55 456
narshu 1:cc2a9eb0bd55 457 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 1:cc2a9eb0bd55 458 * Matrix arithmetic operators implemented by functions
narshu 1:cc2a9eb0bd55 459 * add, sub, mul and div
narshu 1:cc2a9eb0bd55 460 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 1:cc2a9eb0bd55 461
narshu 1:cc2a9eb0bd55 462
narshu 1:cc2a9eb0bd55 463 /*
narshu 1:cc2a9eb0bd55 464 * operator(const XprMatrix<E1, Rows1, Cols1>& lhs, const XprMatrix<E2, Cols1,Cols2>& rhs)
narshu 1:cc2a9eb0bd55 465 *
narshu 1:cc2a9eb0bd55 466 * Note: operations +,-,*,/ are per se element wise. Further more,
narshu 1:cc2a9eb0bd55 467 * element wise operations make sense only for matrices of the same
narshu 1:cc2a9eb0bd55 468 * size [varg].
narshu 1:cc2a9eb0bd55 469 */
narshu 1:cc2a9eb0bd55 470 #define TVMET_IMPLEMENT_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 471 template<class E1, std::size_t Rows1, std::size_t Cols1, \
narshu 1:cc2a9eb0bd55 472 class E2> \
narshu 1:cc2a9eb0bd55 473 inline \
narshu 1:cc2a9eb0bd55 474 XprMatrix< \
narshu 1:cc2a9eb0bd55 475 XprBinOp< \
narshu 1:cc2a9eb0bd55 476 Fcnl_##NAME<typename E1::value_type, typename E2::value_type>, \
narshu 1:cc2a9eb0bd55 477 XprMatrix<E1, Rows1, Cols1>, \
narshu 1:cc2a9eb0bd55 478 XprMatrix<E2, Rows1, Cols1> \
narshu 1:cc2a9eb0bd55 479 >, \
narshu 1:cc2a9eb0bd55 480 Rows1, Cols1 \
narshu 1:cc2a9eb0bd55 481 > \
narshu 1:cc2a9eb0bd55 482 operator OP (const XprMatrix<E1, Rows1, Cols1>& lhs, \
narshu 1:cc2a9eb0bd55 483 const XprMatrix<E2, Rows1, Cols1>& rhs) { \
narshu 1:cc2a9eb0bd55 484 return NAME (lhs, rhs); \
narshu 1:cc2a9eb0bd55 485 }
narshu 1:cc2a9eb0bd55 486
narshu 1:cc2a9eb0bd55 487 TVMET_IMPLEMENT_MACRO(add, +) // per se element wise
narshu 1:cc2a9eb0bd55 488 TVMET_IMPLEMENT_MACRO(sub, -) // per se element wise
narshu 1:cc2a9eb0bd55 489 namespace element_wise {
narshu 1:cc2a9eb0bd55 490 TVMET_IMPLEMENT_MACRO(mul, *) // see as prod()
narshu 1:cc2a9eb0bd55 491 TVMET_IMPLEMENT_MACRO(div, /) // not defined for matrizes, must be element_wise
narshu 1:cc2a9eb0bd55 492 }
narshu 1:cc2a9eb0bd55 493 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 494
narshu 1:cc2a9eb0bd55 495
narshu 1:cc2a9eb0bd55 496 /*
narshu 1:cc2a9eb0bd55 497 * operator(XprMatrix<E, Rows, Cols>, POD)
narshu 1:cc2a9eb0bd55 498 * operator(POD, XprMatrix<E, Rows, Cols>)
narshu 1:cc2a9eb0bd55 499 * Note: operations +,-,*,/ are per se element wise
narshu 1:cc2a9eb0bd55 500 */
narshu 1:cc2a9eb0bd55 501 #define TVMET_IMPLEMENT_MACRO(NAME, OP, POD) \
narshu 1:cc2a9eb0bd55 502 template<class E, std::size_t Rows, std::size_t Cols> \
narshu 1:cc2a9eb0bd55 503 inline \
narshu 1:cc2a9eb0bd55 504 XprMatrix< \
narshu 1:cc2a9eb0bd55 505 XprBinOp< \
narshu 1:cc2a9eb0bd55 506 Fcnl_##NAME<typename E::value_type, POD >, \
narshu 1:cc2a9eb0bd55 507 XprMatrix<E, Rows, Cols>, \
narshu 1:cc2a9eb0bd55 508 XprLiteral< POD > \
narshu 1:cc2a9eb0bd55 509 >, \
narshu 1:cc2a9eb0bd55 510 Rows, Cols \
narshu 1:cc2a9eb0bd55 511 > \
narshu 1:cc2a9eb0bd55 512 operator OP (const XprMatrix<E, Rows, Cols>& lhs, POD rhs) { \
narshu 1:cc2a9eb0bd55 513 return NAME (lhs, rhs); \
narshu 1:cc2a9eb0bd55 514 } \
narshu 1:cc2a9eb0bd55 515 \
narshu 1:cc2a9eb0bd55 516 template<class E,std::size_t Rows, std::size_t Cols> \
narshu 1:cc2a9eb0bd55 517 inline \
narshu 1:cc2a9eb0bd55 518 XprMatrix< \
narshu 1:cc2a9eb0bd55 519 XprBinOp< \
narshu 1:cc2a9eb0bd55 520 Fcnl_##NAME<POD, typename E::value_type>, \
narshu 1:cc2a9eb0bd55 521 XprLiteral< POD >, \
narshu 1:cc2a9eb0bd55 522 XprMatrix<E, Rows, Cols> \
narshu 1:cc2a9eb0bd55 523 >, \
narshu 1:cc2a9eb0bd55 524 Rows, Cols \
narshu 1:cc2a9eb0bd55 525 > \
narshu 1:cc2a9eb0bd55 526 operator OP (POD lhs, const XprMatrix<E, Rows, Cols>& rhs) { \
narshu 1:cc2a9eb0bd55 527 return NAME (lhs, rhs); \
narshu 1:cc2a9eb0bd55 528 }
narshu 1:cc2a9eb0bd55 529
narshu 1:cc2a9eb0bd55 530 TVMET_IMPLEMENT_MACRO(add, +, int)
narshu 1:cc2a9eb0bd55 531 TVMET_IMPLEMENT_MACRO(sub, -, int)
narshu 1:cc2a9eb0bd55 532 TVMET_IMPLEMENT_MACRO(mul, *, int)
narshu 1:cc2a9eb0bd55 533 TVMET_IMPLEMENT_MACRO(div, /, int)
narshu 1:cc2a9eb0bd55 534
narshu 1:cc2a9eb0bd55 535 #if defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 536 TVMET_IMPLEMENT_MACRO(add, +, long long int)
narshu 1:cc2a9eb0bd55 537 TVMET_IMPLEMENT_MACRO(sub, -, long long int)
narshu 1:cc2a9eb0bd55 538 TVMET_IMPLEMENT_MACRO(mul, *, long long int)
narshu 1:cc2a9eb0bd55 539 TVMET_IMPLEMENT_MACRO(div, /, long long int)
narshu 1:cc2a9eb0bd55 540 #endif // defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 541
narshu 1:cc2a9eb0bd55 542 TVMET_IMPLEMENT_MACRO(add, +, float)
narshu 1:cc2a9eb0bd55 543 TVMET_IMPLEMENT_MACRO(sub, -, float)
narshu 1:cc2a9eb0bd55 544 TVMET_IMPLEMENT_MACRO(mul, *, float)
narshu 1:cc2a9eb0bd55 545 TVMET_IMPLEMENT_MACRO(div, /, float)
narshu 1:cc2a9eb0bd55 546
narshu 1:cc2a9eb0bd55 547 TVMET_IMPLEMENT_MACRO(add, +, double)
narshu 1:cc2a9eb0bd55 548 TVMET_IMPLEMENT_MACRO(sub, -, double)
narshu 1:cc2a9eb0bd55 549 TVMET_IMPLEMENT_MACRO(mul, *, double)
narshu 1:cc2a9eb0bd55 550 TVMET_IMPLEMENT_MACRO(div, /, double)
narshu 1:cc2a9eb0bd55 551
narshu 1:cc2a9eb0bd55 552 #if defined(TVMET_HAVE_LONG_DOUBLE)
narshu 1:cc2a9eb0bd55 553 TVMET_IMPLEMENT_MACRO(add, +, long double)
narshu 1:cc2a9eb0bd55 554 TVMET_IMPLEMENT_MACRO(sub, -, long double)
narshu 1:cc2a9eb0bd55 555 TVMET_IMPLEMENT_MACRO(mul, *, long double)
narshu 1:cc2a9eb0bd55 556 TVMET_IMPLEMENT_MACRO(div, /, long double)
narshu 1:cc2a9eb0bd55 557 #endif // defined(TVMET_HAVE_LONG_DOUBLE)
narshu 1:cc2a9eb0bd55 558
narshu 1:cc2a9eb0bd55 559 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 560
narshu 1:cc2a9eb0bd55 561
narshu 1:cc2a9eb0bd55 562 #if defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 563 /*
narshu 1:cc2a9eb0bd55 564 * operator(XprMatrix<E, Rows, Cols>, complex<>)
narshu 1:cc2a9eb0bd55 565 * operator(complex<>, XprMatrix<E, Rows, Cols>)
narshu 1:cc2a9eb0bd55 566 * Note: operations +,-,*,/ are per se element wise
narshu 1:cc2a9eb0bd55 567 * \todo type promotion
narshu 1:cc2a9eb0bd55 568 */
narshu 1:cc2a9eb0bd55 569 #define TVMET_IMPLEMENT_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 570 template<class E, std::size_t Rows, std::size_t Cols, class T> \
narshu 1:cc2a9eb0bd55 571 inline \
narshu 1:cc2a9eb0bd55 572 XprMatrix< \
narshu 1:cc2a9eb0bd55 573 XprBinOp< \
narshu 1:cc2a9eb0bd55 574 Fcnl_##NAME<typename E::value_type, std::complex<T> >, \
narshu 1:cc2a9eb0bd55 575 XprMatrix<E, Rows, Cols>, \
narshu 1:cc2a9eb0bd55 576 XprLiteral< std::complex<T> > \
narshu 1:cc2a9eb0bd55 577 >, \
narshu 1:cc2a9eb0bd55 578 Rows, Cols \
narshu 1:cc2a9eb0bd55 579 > \
narshu 1:cc2a9eb0bd55 580 operator OP (const XprMatrix<E, Rows, Cols>& lhs, \
narshu 1:cc2a9eb0bd55 581 const std::complex<T>& rhs) { \
narshu 1:cc2a9eb0bd55 582 return NAME (lhs, rhs); \
narshu 1:cc2a9eb0bd55 583 } \
narshu 1:cc2a9eb0bd55 584 \
narshu 1:cc2a9eb0bd55 585 template<class E, std::size_t Rows, std::size_t Cols, class T> \
narshu 1:cc2a9eb0bd55 586 inline \
narshu 1:cc2a9eb0bd55 587 XprMatrix< \
narshu 1:cc2a9eb0bd55 588 XprBinOp< \
narshu 1:cc2a9eb0bd55 589 Fcnl_##NAME<std::complex<T>, typename E::value_type>, \
narshu 1:cc2a9eb0bd55 590 XprLiteral< std::complex<T> >, \
narshu 1:cc2a9eb0bd55 591 XprMatrix<E, Rows, Cols> \
narshu 1:cc2a9eb0bd55 592 >, \
narshu 1:cc2a9eb0bd55 593 Rows, Cols \
narshu 1:cc2a9eb0bd55 594 > \
narshu 1:cc2a9eb0bd55 595 operator OP (const std::complex<T>& lhs, \
narshu 1:cc2a9eb0bd55 596 const XprMatrix<E, Rows, Cols>& rhs) { \
narshu 1:cc2a9eb0bd55 597 return NAME (lhs, rhs); \
narshu 1:cc2a9eb0bd55 598 }
narshu 1:cc2a9eb0bd55 599
narshu 1:cc2a9eb0bd55 600 TVMET_IMPLEMENT_MACRO(add, +)
narshu 1:cc2a9eb0bd55 601 TVMET_IMPLEMENT_MACRO(sub, -)
narshu 1:cc2a9eb0bd55 602 TVMET_IMPLEMENT_MACRO(mul, *)
narshu 1:cc2a9eb0bd55 603 TVMET_IMPLEMENT_MACRO(div, /)
narshu 1:cc2a9eb0bd55 604
narshu 1:cc2a9eb0bd55 605 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 606
narshu 1:cc2a9eb0bd55 607 #endif // defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 608
narshu 1:cc2a9eb0bd55 609
narshu 1:cc2a9eb0bd55 610 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 1:cc2a9eb0bd55 611 * matrix specific operator*() = prod() operations
narshu 1:cc2a9eb0bd55 612 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 1:cc2a9eb0bd55 613
narshu 1:cc2a9eb0bd55 614
narshu 1:cc2a9eb0bd55 615 /**
narshu 1:cc2a9eb0bd55 616 * \fn operator*(const XprMatrix<E1, Rows1, Cols1>& lhs, const XprMatrix<E2, Cols1, Cols2>& rhs)
narshu 1:cc2a9eb0bd55 617 * \brief Evaluate the product of two XprMatrix.
narshu 1:cc2a9eb0bd55 618 * \ingroup _binary_operator
narshu 1:cc2a9eb0bd55 619 * \sa prod(XprMatrix<E1, Rows1, Cols1> lhs, XprMatrix<E2, Cols1, Cols2> rhs)
narshu 1:cc2a9eb0bd55 620 */
narshu 1:cc2a9eb0bd55 621 template<class E1, std::size_t Rows1, std::size_t Cols1,
narshu 1:cc2a9eb0bd55 622 class E2, std::size_t Cols2>
narshu 1:cc2a9eb0bd55 623 inline
narshu 1:cc2a9eb0bd55 624 XprMatrix<
narshu 1:cc2a9eb0bd55 625 XprMMProduct<
narshu 1:cc2a9eb0bd55 626 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
narshu 1:cc2a9eb0bd55 627 XprMatrix<E2, Cols1, Cols2>, Cols2 // M2(Cols1, Cols2)
narshu 1:cc2a9eb0bd55 628 >,
narshu 1:cc2a9eb0bd55 629 Rows1, Cols2
narshu 1:cc2a9eb0bd55 630 >
narshu 1:cc2a9eb0bd55 631 operator*(const XprMatrix<E1, Rows1, Cols1>& lhs, const XprMatrix<E2, Cols1, Cols2>& rhs) {
narshu 1:cc2a9eb0bd55 632 return prod(lhs, rhs);
narshu 1:cc2a9eb0bd55 633 }
narshu 1:cc2a9eb0bd55 634
narshu 1:cc2a9eb0bd55 635
narshu 1:cc2a9eb0bd55 636 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 1:cc2a9eb0bd55 637 * matrix-vector specific prod( ... ) operators
narshu 1:cc2a9eb0bd55 638 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 1:cc2a9eb0bd55 639
narshu 1:cc2a9eb0bd55 640
narshu 1:cc2a9eb0bd55 641 /**
narshu 1:cc2a9eb0bd55 642 * \fn operator*(const XprMatrix<E1, Rows, Cols>& lhs, const XprVector<E2, Cols>& rhs)
narshu 1:cc2a9eb0bd55 643 * \brief Evaluate the product of XprMatrix and XprVector.
narshu 1:cc2a9eb0bd55 644 * \ingroup _binary_operator
narshu 1:cc2a9eb0bd55 645 * \sa prod(XprMatrix<E1, Rows, Cols> lhs, XprVector<E2, Cols> rhs)
narshu 1:cc2a9eb0bd55 646 */
narshu 1:cc2a9eb0bd55 647 template<class E1, std::size_t Rows, std::size_t Cols,
narshu 1:cc2a9eb0bd55 648 class E2>
narshu 1:cc2a9eb0bd55 649 inline
narshu 1:cc2a9eb0bd55 650 XprVector<
narshu 1:cc2a9eb0bd55 651 XprMVProduct<
narshu 1:cc2a9eb0bd55 652 XprMatrix<E1, Rows, Cols>, Rows, Cols,
narshu 1:cc2a9eb0bd55 653 XprVector<E2, Cols>
narshu 1:cc2a9eb0bd55 654 >,
narshu 1:cc2a9eb0bd55 655 Rows
narshu 1:cc2a9eb0bd55 656 >
narshu 1:cc2a9eb0bd55 657 operator*(const XprMatrix<E1, Rows, Cols>& lhs, const XprVector<E2, Cols>& rhs) {
narshu 1:cc2a9eb0bd55 658 return prod(lhs, rhs);
narshu 1:cc2a9eb0bd55 659 }
narshu 1:cc2a9eb0bd55 660
narshu 1:cc2a9eb0bd55 661
narshu 1:cc2a9eb0bd55 662 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 1:cc2a9eb0bd55 663 * Matrix integer and compare operators
narshu 1:cc2a9eb0bd55 664 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 1:cc2a9eb0bd55 665
narshu 1:cc2a9eb0bd55 666
narshu 1:cc2a9eb0bd55 667 /*
narshu 1:cc2a9eb0bd55 668 * operator(XprMatrix<>, XprMatrix<>)
narshu 1:cc2a9eb0bd55 669 * Note: operations are per se element wise
narshu 1:cc2a9eb0bd55 670 */
narshu 1:cc2a9eb0bd55 671 #define TVMET_IMPLEMENT_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 672 template<class E1, std::size_t Rows, std::size_t Cols, \
narshu 1:cc2a9eb0bd55 673 class E2> \
narshu 1:cc2a9eb0bd55 674 inline \
narshu 1:cc2a9eb0bd55 675 XprMatrix< \
narshu 1:cc2a9eb0bd55 676 XprBinOp< \
narshu 1:cc2a9eb0bd55 677 Fcnl_##NAME<typename E1::value_type, typename E2::value_type>, \
narshu 1:cc2a9eb0bd55 678 XprMatrix<E1, Rows, Cols>, \
narshu 1:cc2a9eb0bd55 679 XprMatrix<E2, Rows, Cols> \
narshu 1:cc2a9eb0bd55 680 >, \
narshu 1:cc2a9eb0bd55 681 Rows, Cols \
narshu 1:cc2a9eb0bd55 682 > \
narshu 1:cc2a9eb0bd55 683 operator OP (const XprMatrix<E1, Rows, Cols>& lhs, \
narshu 1:cc2a9eb0bd55 684 const XprMatrix<E2, Rows, Cols>& rhs) { \
narshu 1:cc2a9eb0bd55 685 typedef XprBinOp< \
narshu 1:cc2a9eb0bd55 686 Fcnl_##NAME<typename E1::value_type, typename E2::value_type>, \
narshu 1:cc2a9eb0bd55 687 XprMatrix<E1, Rows, Cols>, \
narshu 1:cc2a9eb0bd55 688 XprMatrix<E2, Rows, Cols> \
narshu 1:cc2a9eb0bd55 689 > expr_type; \
narshu 1:cc2a9eb0bd55 690 return XprMatrix<expr_type, Rows, Cols>(expr_type(lhs, rhs)); \
narshu 1:cc2a9eb0bd55 691 }
narshu 1:cc2a9eb0bd55 692
narshu 1:cc2a9eb0bd55 693 // integer operators only, e.g used on double you will get an error
narshu 1:cc2a9eb0bd55 694 namespace element_wise {
narshu 1:cc2a9eb0bd55 695 TVMET_IMPLEMENT_MACRO(mod, %)
narshu 1:cc2a9eb0bd55 696 TVMET_IMPLEMENT_MACRO(bitxor, ^)
narshu 1:cc2a9eb0bd55 697 TVMET_IMPLEMENT_MACRO(bitand, &)
narshu 1:cc2a9eb0bd55 698 TVMET_IMPLEMENT_MACRO(bitor, |)
narshu 1:cc2a9eb0bd55 699 TVMET_IMPLEMENT_MACRO(shl, <<)
narshu 1:cc2a9eb0bd55 700 TVMET_IMPLEMENT_MACRO(shr, >>)
narshu 1:cc2a9eb0bd55 701 }
narshu 1:cc2a9eb0bd55 702
narshu 1:cc2a9eb0bd55 703 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 704 TVMET_IMPLEMENT_MACRO(greater, >)
narshu 1:cc2a9eb0bd55 705 TVMET_IMPLEMENT_MACRO(less, <)
narshu 1:cc2a9eb0bd55 706 TVMET_IMPLEMENT_MACRO(greater_eq, >=)
narshu 1:cc2a9eb0bd55 707 TVMET_IMPLEMENT_MACRO(less_eq, <=)
narshu 1:cc2a9eb0bd55 708 TVMET_IMPLEMENT_MACRO(eq, ==)
narshu 1:cc2a9eb0bd55 709 TVMET_IMPLEMENT_MACRO(not_eq, !=)
narshu 1:cc2a9eb0bd55 710 TVMET_IMPLEMENT_MACRO(and, &&)
narshu 1:cc2a9eb0bd55 711 TVMET_IMPLEMENT_MACRO(or, ||)
narshu 1:cc2a9eb0bd55 712
narshu 1:cc2a9eb0bd55 713 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 714
narshu 1:cc2a9eb0bd55 715
narshu 1:cc2a9eb0bd55 716 #if defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 717 /*
narshu 1:cc2a9eb0bd55 718 * operator(XprMatrix<E, Rows, Cols>, std::complex<>)
narshu 1:cc2a9eb0bd55 719 * operator(std::complex<>, XprMatrix<E, Rows, Cols>)
narshu 1:cc2a9eb0bd55 720 * Note: - per se element wise
narshu 1:cc2a9eb0bd55 721 * - bit ops on complex<int> doesn't make sense, stay away
narshu 1:cc2a9eb0bd55 722 * \todo type promotion
narshu 1:cc2a9eb0bd55 723 */
narshu 1:cc2a9eb0bd55 724 #define TVMET_IMPLEMENT_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 725 template<class E, std::size_t Rows, std::size_t Cols, class T> \
narshu 1:cc2a9eb0bd55 726 inline \
narshu 1:cc2a9eb0bd55 727 XprMatrix< \
narshu 1:cc2a9eb0bd55 728 XprBinOp< \
narshu 1:cc2a9eb0bd55 729 Fcnl_##NAME<typename E::value_type, std::complex<T> >, \
narshu 1:cc2a9eb0bd55 730 XprMatrix<E, Rows, Cols>, \
narshu 1:cc2a9eb0bd55 731 XprLiteral< std::complex<T> > \
narshu 1:cc2a9eb0bd55 732 >, \
narshu 1:cc2a9eb0bd55 733 Rows, Cols \
narshu 1:cc2a9eb0bd55 734 > \
narshu 1:cc2a9eb0bd55 735 operator OP (const XprMatrix<E, Rows, Cols>& lhs, \
narshu 1:cc2a9eb0bd55 736 const std::complex<T>& rhs) { \
narshu 1:cc2a9eb0bd55 737 typedef XprBinOp< \
narshu 1:cc2a9eb0bd55 738 Fcnl_##NAME<typename E::value_type, std::complex<T> >, \
narshu 1:cc2a9eb0bd55 739 XprMatrix<E, Rows, Cols>, \
narshu 1:cc2a9eb0bd55 740 XprLiteral< std::complex<T> > \
narshu 1:cc2a9eb0bd55 741 > expr_type; \
narshu 1:cc2a9eb0bd55 742 return XprMatrix<expr_type, Rows, Cols>( \
narshu 1:cc2a9eb0bd55 743 expr_type(lhs, XprLiteral< std::complex<T> >(rhs))); \
narshu 1:cc2a9eb0bd55 744 } \
narshu 1:cc2a9eb0bd55 745 \
narshu 1:cc2a9eb0bd55 746 template<class E, std::size_t Rows, std::size_t Cols, class T> \
narshu 1:cc2a9eb0bd55 747 inline \
narshu 1:cc2a9eb0bd55 748 XprMatrix< \
narshu 1:cc2a9eb0bd55 749 XprBinOp< \
narshu 1:cc2a9eb0bd55 750 Fcnl_##NAME<std::complex<T>, typename E::value_type>, \
narshu 1:cc2a9eb0bd55 751 XprLiteral< std::complex<T> >, \
narshu 1:cc2a9eb0bd55 752 XprMatrix<E, Rows, Cols> \
narshu 1:cc2a9eb0bd55 753 >, \
narshu 1:cc2a9eb0bd55 754 Rows, Cols \
narshu 1:cc2a9eb0bd55 755 > \
narshu 1:cc2a9eb0bd55 756 operator OP (const std::complex<T>& lhs, \
narshu 1:cc2a9eb0bd55 757 const XprMatrix<E, Rows, Cols>& rhs) { \
narshu 1:cc2a9eb0bd55 758 typedef XprBinOp< \
narshu 1:cc2a9eb0bd55 759 Fcnl_##NAME< std::complex<T>, typename E::value_type>, \
narshu 1:cc2a9eb0bd55 760 XprLiteral< std::complex<T> >, \
narshu 1:cc2a9eb0bd55 761 XprMatrix<E, Rows, Cols> \
narshu 1:cc2a9eb0bd55 762 > expr_type; \
narshu 1:cc2a9eb0bd55 763 return XprMatrix<expr_type, Rows, Cols>( \
narshu 1:cc2a9eb0bd55 764 expr_type(XprLiteral< std::complex<T> >(lhs), rhs)); \
narshu 1:cc2a9eb0bd55 765 }
narshu 1:cc2a9eb0bd55 766
narshu 1:cc2a9eb0bd55 767 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 768 TVMET_IMPLEMENT_MACRO(greater, >)
narshu 1:cc2a9eb0bd55 769 TVMET_IMPLEMENT_MACRO(less, <)
narshu 1:cc2a9eb0bd55 770 TVMET_IMPLEMENT_MACRO(greater_eq, >=)
narshu 1:cc2a9eb0bd55 771 TVMET_IMPLEMENT_MACRO(less_eq, <=)
narshu 1:cc2a9eb0bd55 772 TVMET_IMPLEMENT_MACRO(eq, ==)
narshu 1:cc2a9eb0bd55 773 TVMET_IMPLEMENT_MACRO(not_eq, !=)
narshu 1:cc2a9eb0bd55 774 TVMET_IMPLEMENT_MACRO(and, &&)
narshu 1:cc2a9eb0bd55 775 TVMET_IMPLEMENT_MACRO(or, ||)
narshu 1:cc2a9eb0bd55 776
narshu 1:cc2a9eb0bd55 777 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 778
narshu 1:cc2a9eb0bd55 779 #endif // defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 780
narshu 1:cc2a9eb0bd55 781
narshu 1:cc2a9eb0bd55 782 /*
narshu 1:cc2a9eb0bd55 783 * operator(XprMatrix<E, Rows, Cols>, POD)
narshu 1:cc2a9eb0bd55 784 * operator(POD, XprMatrix<E, Rows, Cols>)
narshu 1:cc2a9eb0bd55 785 * Note: operations are per se element wise
narshu 1:cc2a9eb0bd55 786 */
narshu 1:cc2a9eb0bd55 787 #define TVMET_IMPLEMENT_MACRO(NAME, OP, TP) \
narshu 1:cc2a9eb0bd55 788 template<class E, std::size_t Rows, std::size_t Cols> \
narshu 1:cc2a9eb0bd55 789 inline \
narshu 1:cc2a9eb0bd55 790 XprMatrix< \
narshu 1:cc2a9eb0bd55 791 XprBinOp< \
narshu 1:cc2a9eb0bd55 792 Fcnl_##NAME<typename E::value_type, TP >, \
narshu 1:cc2a9eb0bd55 793 XprMatrix<E, Rows, Cols>, \
narshu 1:cc2a9eb0bd55 794 XprLiteral< TP > \
narshu 1:cc2a9eb0bd55 795 >, \
narshu 1:cc2a9eb0bd55 796 Rows, Cols \
narshu 1:cc2a9eb0bd55 797 > \
narshu 1:cc2a9eb0bd55 798 operator OP (const XprMatrix<E, Rows, Cols>& lhs, TP rhs) { \
narshu 1:cc2a9eb0bd55 799 typedef XprBinOp< \
narshu 1:cc2a9eb0bd55 800 Fcnl_##NAME<typename E::value_type, TP >, \
narshu 1:cc2a9eb0bd55 801 XprMatrix<E, Rows, Cols>, \
narshu 1:cc2a9eb0bd55 802 XprLiteral< TP > \
narshu 1:cc2a9eb0bd55 803 > expr_type; \
narshu 1:cc2a9eb0bd55 804 return XprMatrix<expr_type, Rows, Cols>( \
narshu 1:cc2a9eb0bd55 805 expr_type(lhs, XprLiteral< TP >(rhs))); \
narshu 1:cc2a9eb0bd55 806 } \
narshu 1:cc2a9eb0bd55 807 \
narshu 1:cc2a9eb0bd55 808 template<class E, std::size_t Rows, std::size_t Cols> \
narshu 1:cc2a9eb0bd55 809 inline \
narshu 1:cc2a9eb0bd55 810 XprMatrix< \
narshu 1:cc2a9eb0bd55 811 XprBinOp< \
narshu 1:cc2a9eb0bd55 812 Fcnl_##NAME<TP, typename E::value_type>, \
narshu 1:cc2a9eb0bd55 813 XprLiteral< TP >, \
narshu 1:cc2a9eb0bd55 814 XprMatrix<E, Rows, Cols> \
narshu 1:cc2a9eb0bd55 815 >, \
narshu 1:cc2a9eb0bd55 816 Rows, Cols \
narshu 1:cc2a9eb0bd55 817 > \
narshu 1:cc2a9eb0bd55 818 operator OP (TP lhs, const XprMatrix<E, Rows, Cols>& rhs) { \
narshu 1:cc2a9eb0bd55 819 typedef XprBinOp< \
narshu 1:cc2a9eb0bd55 820 Fcnl_##NAME< TP, typename E::value_type>, \
narshu 1:cc2a9eb0bd55 821 XprLiteral< TP >, \
narshu 1:cc2a9eb0bd55 822 XprMatrix<E, Rows, Cols> \
narshu 1:cc2a9eb0bd55 823 > expr_type; \
narshu 1:cc2a9eb0bd55 824 return XprMatrix<expr_type, Rows, Cols>( \
narshu 1:cc2a9eb0bd55 825 expr_type(XprLiteral< TP >(lhs), rhs)); \
narshu 1:cc2a9eb0bd55 826 }
narshu 1:cc2a9eb0bd55 827
narshu 1:cc2a9eb0bd55 828
narshu 1:cc2a9eb0bd55 829 // integer operators only, e.g used on double you will get an error
narshu 1:cc2a9eb0bd55 830 namespace element_wise {
narshu 1:cc2a9eb0bd55 831 TVMET_IMPLEMENT_MACRO(mod, %, int)
narshu 1:cc2a9eb0bd55 832 TVMET_IMPLEMENT_MACRO(bitxor, ^, int)
narshu 1:cc2a9eb0bd55 833 TVMET_IMPLEMENT_MACRO(bitand, &, int)
narshu 1:cc2a9eb0bd55 834 TVMET_IMPLEMENT_MACRO(bitor, |, int)
narshu 1:cc2a9eb0bd55 835 TVMET_IMPLEMENT_MACRO(shl, <<, int)
narshu 1:cc2a9eb0bd55 836 TVMET_IMPLEMENT_MACRO(shr, >>, int)
narshu 1:cc2a9eb0bd55 837 }
narshu 1:cc2a9eb0bd55 838
narshu 1:cc2a9eb0bd55 839 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 840 TVMET_IMPLEMENT_MACRO(greater, >, int)
narshu 1:cc2a9eb0bd55 841 TVMET_IMPLEMENT_MACRO(less, <, int)
narshu 1:cc2a9eb0bd55 842 TVMET_IMPLEMENT_MACRO(greater_eq, >=, int)
narshu 1:cc2a9eb0bd55 843 TVMET_IMPLEMENT_MACRO(less_eq, <=, int)
narshu 1:cc2a9eb0bd55 844 TVMET_IMPLEMENT_MACRO(eq, ==, int)
narshu 1:cc2a9eb0bd55 845 TVMET_IMPLEMENT_MACRO(not_eq, !=, int)
narshu 1:cc2a9eb0bd55 846 TVMET_IMPLEMENT_MACRO(and, &&, int)
narshu 1:cc2a9eb0bd55 847 TVMET_IMPLEMENT_MACRO(or, ||, int)
narshu 1:cc2a9eb0bd55 848
narshu 1:cc2a9eb0bd55 849 #if defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 850 // integer operators only
narshu 1:cc2a9eb0bd55 851 namespace element_wise {
narshu 1:cc2a9eb0bd55 852 TVMET_IMPLEMENT_MACRO(mod, %, long long int)
narshu 1:cc2a9eb0bd55 853 TVMET_IMPLEMENT_MACRO(bitxor, ^, long long int)
narshu 1:cc2a9eb0bd55 854 TVMET_IMPLEMENT_MACRO(bitand, &, long long int)
narshu 1:cc2a9eb0bd55 855 TVMET_IMPLEMENT_MACRO(bitor, |, long long int)
narshu 1:cc2a9eb0bd55 856 TVMET_IMPLEMENT_MACRO(shl, <<, long long int)
narshu 1:cc2a9eb0bd55 857 TVMET_IMPLEMENT_MACRO(shr, >>, long long int)
narshu 1:cc2a9eb0bd55 858 }
narshu 1:cc2a9eb0bd55 859
narshu 1:cc2a9eb0bd55 860 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 861 TVMET_IMPLEMENT_MACRO(greater, >, long long int)
narshu 1:cc2a9eb0bd55 862 TVMET_IMPLEMENT_MACRO(less, <, long long int)
narshu 1:cc2a9eb0bd55 863 TVMET_IMPLEMENT_MACRO(greater_eq, >=, long long int)
narshu 1:cc2a9eb0bd55 864 TVMET_IMPLEMENT_MACRO(less_eq, <=, long long int)
narshu 1:cc2a9eb0bd55 865 TVMET_IMPLEMENT_MACRO(eq, ==, long long int)
narshu 1:cc2a9eb0bd55 866 TVMET_IMPLEMENT_MACRO(not_eq, !=, long long int)
narshu 1:cc2a9eb0bd55 867 TVMET_IMPLEMENT_MACRO(and, &&, long long int)
narshu 1:cc2a9eb0bd55 868 TVMET_IMPLEMENT_MACRO(or, ||, long long int)
narshu 1:cc2a9eb0bd55 869 #endif // defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 870
narshu 1:cc2a9eb0bd55 871 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 872 TVMET_IMPLEMENT_MACRO(greater, >, float)
narshu 1:cc2a9eb0bd55 873 TVMET_IMPLEMENT_MACRO(less, <, float)
narshu 1:cc2a9eb0bd55 874 TVMET_IMPLEMENT_MACRO(greater_eq, >=, float)
narshu 1:cc2a9eb0bd55 875 TVMET_IMPLEMENT_MACRO(less_eq, <=, float)
narshu 1:cc2a9eb0bd55 876 TVMET_IMPLEMENT_MACRO(eq, ==, float)
narshu 1:cc2a9eb0bd55 877 TVMET_IMPLEMENT_MACRO(not_eq, !=, float)
narshu 1:cc2a9eb0bd55 878 TVMET_IMPLEMENT_MACRO(and, &&, float)
narshu 1:cc2a9eb0bd55 879 TVMET_IMPLEMENT_MACRO(or, ||, float)
narshu 1:cc2a9eb0bd55 880
narshu 1:cc2a9eb0bd55 881 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 882 TVMET_IMPLEMENT_MACRO(greater, >, double)
narshu 1:cc2a9eb0bd55 883 TVMET_IMPLEMENT_MACRO(less, <, double)
narshu 1:cc2a9eb0bd55 884 TVMET_IMPLEMENT_MACRO(greater_eq, >=, double)
narshu 1:cc2a9eb0bd55 885 TVMET_IMPLEMENT_MACRO(less_eq, <=, double)
narshu 1:cc2a9eb0bd55 886 TVMET_IMPLEMENT_MACRO(eq, ==, double)
narshu 1:cc2a9eb0bd55 887 TVMET_IMPLEMENT_MACRO(not_eq, !=, double)
narshu 1:cc2a9eb0bd55 888 TVMET_IMPLEMENT_MACRO(and, &&, double)
narshu 1:cc2a9eb0bd55 889 TVMET_IMPLEMENT_MACRO(or, ||, double)
narshu 1:cc2a9eb0bd55 890
narshu 1:cc2a9eb0bd55 891 #if defined(TVMET_HAVE_LONG_DOUBLE)
narshu 1:cc2a9eb0bd55 892 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 893 TVMET_IMPLEMENT_MACRO(greater, >, long double)
narshu 1:cc2a9eb0bd55 894 TVMET_IMPLEMENT_MACRO(less, <, long double)
narshu 1:cc2a9eb0bd55 895 TVMET_IMPLEMENT_MACRO(greater_eq, >=, long double)
narshu 1:cc2a9eb0bd55 896 TVMET_IMPLEMENT_MACRO(less_eq, <=, long double)
narshu 1:cc2a9eb0bd55 897 TVMET_IMPLEMENT_MACRO(eq, ==, long double)
narshu 1:cc2a9eb0bd55 898 TVMET_IMPLEMENT_MACRO(not_eq, !=, long double)
narshu 1:cc2a9eb0bd55 899 TVMET_IMPLEMENT_MACRO(and, &&, long double)
narshu 1:cc2a9eb0bd55 900 TVMET_IMPLEMENT_MACRO(or, ||, long double)
narshu 1:cc2a9eb0bd55 901 #endif // defined(TVMET_HAVE_LONG_DOUBLE)
narshu 1:cc2a9eb0bd55 902
narshu 1:cc2a9eb0bd55 903 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 904
narshu 1:cc2a9eb0bd55 905
narshu 1:cc2a9eb0bd55 906 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 1:cc2a9eb0bd55 907 * global unary operators
narshu 1:cc2a9eb0bd55 908 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 1:cc2a9eb0bd55 909
narshu 1:cc2a9eb0bd55 910
narshu 1:cc2a9eb0bd55 911 /*
narshu 1:cc2a9eb0bd55 912 * unary_operator(const XprMatrix<E, Rows, Cols>& m)
narshu 1:cc2a9eb0bd55 913 * Note: per se element wise
narshu 1:cc2a9eb0bd55 914 */
narshu 1:cc2a9eb0bd55 915 #define TVMET_IMPLEMENT_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 916 template <class E, std::size_t Rows, std::size_t Cols> \
narshu 1:cc2a9eb0bd55 917 inline \
narshu 1:cc2a9eb0bd55 918 XprMatrix< \
narshu 1:cc2a9eb0bd55 919 XprUnOp< \
narshu 1:cc2a9eb0bd55 920 Fcnl_##NAME<typename E::value_type>, \
narshu 1:cc2a9eb0bd55 921 XprMatrix<E, Rows, Cols> \
narshu 1:cc2a9eb0bd55 922 >, \
narshu 1:cc2a9eb0bd55 923 Rows, Cols \
narshu 1:cc2a9eb0bd55 924 > \
narshu 1:cc2a9eb0bd55 925 operator OP (const XprMatrix<E, Rows, Cols>& m) { \
narshu 1:cc2a9eb0bd55 926 typedef XprUnOp< \
narshu 1:cc2a9eb0bd55 927 Fcnl_##NAME<typename E::value_type>, \
narshu 1:cc2a9eb0bd55 928 XprMatrix<E, Rows, Cols> \
narshu 1:cc2a9eb0bd55 929 > expr_type; \
narshu 1:cc2a9eb0bd55 930 return XprMatrix<expr_type, Rows, Cols>(expr_type(m)); \
narshu 1:cc2a9eb0bd55 931 }
narshu 1:cc2a9eb0bd55 932
narshu 1:cc2a9eb0bd55 933 TVMET_IMPLEMENT_MACRO(not, !)
narshu 1:cc2a9eb0bd55 934 TVMET_IMPLEMENT_MACRO(compl, ~)
narshu 1:cc2a9eb0bd55 935 TVMET_IMPLEMENT_MACRO(neg, -)
narshu 1:cc2a9eb0bd55 936
narshu 1:cc2a9eb0bd55 937 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 938
narshu 1:cc2a9eb0bd55 939
narshu 1:cc2a9eb0bd55 940 } // namespace tvmet
narshu 1:cc2a9eb0bd55 941
narshu 1:cc2a9eb0bd55 942 #endif // TVMET_XPR_MATRIX_OPERATORS_H
narshu 1:cc2a9eb0bd55 943
narshu 1:cc2a9eb0bd55 944 // Local Variables:
narshu 1:cc2a9eb0bd55 945 // mode:C++
narshu 1:cc2a9eb0bd55 946 // tab-width:8
narshu 1:cc2a9eb0bd55 947 // End: