This is the Tiny Vector Matrix Expression Templates library found at http://tvmet.sourceforge.net. It is the fastest and most compact matrix lib out there (for < 10x10 matricies). I have done some minor tweaks to make it compile for mbed. For examples and hints on how to use, see: http://tvmet.sourceforge.net/usage.html

Dependents:   Eurobot_2012_Secondary

Committer:
madcowswe
Date:
Wed Mar 28 15:53:45 2012 +0000
Revision:
0:feb4117d16d8

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
madcowswe 0:feb4117d16d8 1 /*
madcowswe 0:feb4117d16d8 2 * Tiny Vector Matrix Library
madcowswe 0:feb4117d16d8 3 * Dense Vector Matrix Libary of Tiny size using Expression Templates
madcowswe 0:feb4117d16d8 4 *
madcowswe 0:feb4117d16d8 5 * Copyright (C) 2001 - 2007 Olaf Petzold <opetzold@users.sourceforge.net>
madcowswe 0:feb4117d16d8 6 *
madcowswe 0:feb4117d16d8 7 * This library is free software; you can redistribute it and/or
madcowswe 0:feb4117d16d8 8 * modify it under the terms of the GNU lesser General Public
madcowswe 0:feb4117d16d8 9 * License as published by the Free Software Foundation; either
madcowswe 0:feb4117d16d8 10 * version 2.1 of the License, or (at your option) any later version.
madcowswe 0:feb4117d16d8 11 *
madcowswe 0:feb4117d16d8 12 * This library is distributed in the hope that it will be useful,
madcowswe 0:feb4117d16d8 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
madcowswe 0:feb4117d16d8 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
madcowswe 0:feb4117d16d8 15 * lesser General Public License for more details.
madcowswe 0:feb4117d16d8 16 *
madcowswe 0:feb4117d16d8 17 * You should have received a copy of the GNU lesser General Public
madcowswe 0:feb4117d16d8 18 * License along with this library; if not, write to the Free Software
madcowswe 0:feb4117d16d8 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
madcowswe 0:feb4117d16d8 20 *
madcowswe 0:feb4117d16d8 21 * $Id: MatrixOperators.h,v 1.37 2007-06-23 15:58:58 opetzold Exp $
madcowswe 0:feb4117d16d8 22 */
madcowswe 0:feb4117d16d8 23
madcowswe 0:feb4117d16d8 24 #ifndef TVMET_MATRIX_OPERATORS_H
madcowswe 0:feb4117d16d8 25 #define TVMET_MATRIX_OPERATORS_H
madcowswe 0:feb4117d16d8 26
madcowswe 0:feb4117d16d8 27 namespace tvmet {
madcowswe 0:feb4117d16d8 28
madcowswe 0:feb4117d16d8 29
madcowswe 0:feb4117d16d8 30 /*********************************************************
madcowswe 0:feb4117d16d8 31 * PART I: DECLARATION
madcowswe 0:feb4117d16d8 32 *********************************************************/
madcowswe 0:feb4117d16d8 33
madcowswe 0:feb4117d16d8 34
madcowswe 0:feb4117d16d8 35 template<class T, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 36 std::ostream& operator<<(std::ostream& os,
madcowswe 0:feb4117d16d8 37 const Matrix<T, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 38
madcowswe 0:feb4117d16d8 39
madcowswe 0:feb4117d16d8 40 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 41 * Member operators (arithmetic and bit ops)
madcowswe 0:feb4117d16d8 42 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 43
madcowswe 0:feb4117d16d8 44
madcowswe 0:feb4117d16d8 45 /*
madcowswe 0:feb4117d16d8 46 * update_operator(Matrix<T1, Rows, Cols>, Matrix<T2, Rows, Cols>)
madcowswe 0:feb4117d16d8 47 * update_operator(Matrix<T1, Rows, Cols>, XprMatrix<E, Rows, Cols> rhs)
madcowswe 0:feb4117d16d8 48 * Note: per se element wise
madcowswe 0:feb4117d16d8 49 * \todo: the operator*= can have element wise mul oder product, decide!
madcowswe 0:feb4117d16d8 50 */
madcowswe 0:feb4117d16d8 51 #define TVMET_DECLARE_MACRO(NAME, OP) \
madcowswe 0:feb4117d16d8 52 template<class T1, class T2, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 53 Matrix<T1, Rows, Cols>& \
madcowswe 0:feb4117d16d8 54 operator OP (Matrix<T1, Rows, Cols>& lhs, \
madcowswe 0:feb4117d16d8 55 const Matrix<T2, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE; \
madcowswe 0:feb4117d16d8 56 \
madcowswe 0:feb4117d16d8 57 template<class T, class E, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 58 Matrix<T, Rows, Cols>& \
madcowswe 0:feb4117d16d8 59 operator OP (Matrix<T, Rows, Cols>& lhs, \
madcowswe 0:feb4117d16d8 60 const XprMatrix<E, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 61
madcowswe 0:feb4117d16d8 62 TVMET_DECLARE_MACRO(add_eq, +=) // per se element wise
madcowswe 0:feb4117d16d8 63 TVMET_DECLARE_MACRO(sub_eq, -=) // per se element wise
madcowswe 0:feb4117d16d8 64 namespace element_wise {
madcowswe 0:feb4117d16d8 65 TVMET_DECLARE_MACRO(mul_eq, *=) // see note
madcowswe 0:feb4117d16d8 66 TVMET_DECLARE_MACRO(div_eq, /=) // not defined for vectors
madcowswe 0:feb4117d16d8 67 }
madcowswe 0:feb4117d16d8 68
madcowswe 0:feb4117d16d8 69 // integer operators only, e.g used on double you wil get an error
madcowswe 0:feb4117d16d8 70 namespace element_wise {
madcowswe 0:feb4117d16d8 71 TVMET_DECLARE_MACRO(mod_eq, %=)
madcowswe 0:feb4117d16d8 72 TVMET_DECLARE_MACRO(xor_eq, ^=)
madcowswe 0:feb4117d16d8 73 TVMET_DECLARE_MACRO(and_eq, &=)
madcowswe 0:feb4117d16d8 74 TVMET_DECLARE_MACRO(or_eq, |=)
madcowswe 0:feb4117d16d8 75 TVMET_DECLARE_MACRO(shl_eq, <<=)
madcowswe 0:feb4117d16d8 76 TVMET_DECLARE_MACRO(shr_eq, >>=)
madcowswe 0:feb4117d16d8 77 }
madcowswe 0:feb4117d16d8 78
madcowswe 0:feb4117d16d8 79 #undef TVMET_DECLARE_MACRO
madcowswe 0:feb4117d16d8 80
madcowswe 0:feb4117d16d8 81
madcowswe 0:feb4117d16d8 82 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 83 * Matrix arithmetic operators implemented by functions
madcowswe 0:feb4117d16d8 84 * add, sub, mul and div
madcowswe 0:feb4117d16d8 85 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 86
madcowswe 0:feb4117d16d8 87
madcowswe 0:feb4117d16d8 88 /*
madcowswe 0:feb4117d16d8 89 * operator(Matrix<T1, Rows, Cols>, Matrix<T2, Rows, Cols>)
madcowswe 0:feb4117d16d8 90 * operator(XprMatrix<E, Rows, Cols>, Matrix<T, Rows, Cols>)
madcowswe 0:feb4117d16d8 91 * operator(Matrix<T, Rows, Cols>, XprMatrix<E, Rows, Cols>)
madcowswe 0:feb4117d16d8 92 * Note: per se element wise
madcowswe 0:feb4117d16d8 93 */
madcowswe 0:feb4117d16d8 94 #define TVMET_DECLARE_MACRO(NAME, OP) \
madcowswe 0:feb4117d16d8 95 template<class T1, class T2, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 96 XprMatrix< \
madcowswe 0:feb4117d16d8 97 XprBinOp< \
madcowswe 0:feb4117d16d8 98 Fcnl_##NAME<T1, T2>, \
madcowswe 0:feb4117d16d8 99 MatrixConstReference<T1, Rows, Cols>, \
madcowswe 0:feb4117d16d8 100 MatrixConstReference<T2, Rows, Cols> \
madcowswe 0:feb4117d16d8 101 >, \
madcowswe 0:feb4117d16d8 102 Rows, Cols \
madcowswe 0:feb4117d16d8 103 > \
madcowswe 0:feb4117d16d8 104 operator OP (const Matrix<T1, Rows, Cols>& lhs, \
madcowswe 0:feb4117d16d8 105 const Matrix<T2, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE; \
madcowswe 0:feb4117d16d8 106 \
madcowswe 0:feb4117d16d8 107 template<class E, class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 108 XprMatrix< \
madcowswe 0:feb4117d16d8 109 XprBinOp< \
madcowswe 0:feb4117d16d8 110 Fcnl_##NAME<typename E::value_type, T>, \
madcowswe 0:feb4117d16d8 111 XprMatrix<E, Rows, Cols>, \
madcowswe 0:feb4117d16d8 112 MatrixConstReference<T, Rows, Cols> \
madcowswe 0:feb4117d16d8 113 >, \
madcowswe 0:feb4117d16d8 114 Rows, Cols \
madcowswe 0:feb4117d16d8 115 > \
madcowswe 0:feb4117d16d8 116 operator OP (const XprMatrix<E, Rows, Cols>& lhs, \
madcowswe 0:feb4117d16d8 117 const Matrix<T, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE; \
madcowswe 0:feb4117d16d8 118 \
madcowswe 0:feb4117d16d8 119 template<class T, class E, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 120 XprMatrix< \
madcowswe 0:feb4117d16d8 121 XprBinOp< \
madcowswe 0:feb4117d16d8 122 Fcnl_##NAME<typename E::value_type, T>, \
madcowswe 0:feb4117d16d8 123 MatrixConstReference<T, Rows, Cols>, \
madcowswe 0:feb4117d16d8 124 XprMatrix<E, Rows, Cols> \
madcowswe 0:feb4117d16d8 125 >, \
madcowswe 0:feb4117d16d8 126 Rows, Cols \
madcowswe 0:feb4117d16d8 127 > \
madcowswe 0:feb4117d16d8 128 operator OP (const Matrix<T, Rows, Cols>& lhs, \
madcowswe 0:feb4117d16d8 129 const XprMatrix<E, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 130
madcowswe 0:feb4117d16d8 131 TVMET_DECLARE_MACRO(add, +) // per se element wise
madcowswe 0:feb4117d16d8 132 TVMET_DECLARE_MACRO(sub, -) // per se element wise
madcowswe 0:feb4117d16d8 133 namespace element_wise {
madcowswe 0:feb4117d16d8 134 TVMET_DECLARE_MACRO(mul, *) // see as prod()
madcowswe 0:feb4117d16d8 135 TVMET_DECLARE_MACRO(div, /) // not defined for matrizes
madcowswe 0:feb4117d16d8 136 }
madcowswe 0:feb4117d16d8 137 #undef TVMET_DECLARE_MACRO
madcowswe 0:feb4117d16d8 138
madcowswe 0:feb4117d16d8 139
madcowswe 0:feb4117d16d8 140 /*
madcowswe 0:feb4117d16d8 141 * operator(Matrix<T, Rows, Cols>, POD)
madcowswe 0:feb4117d16d8 142 * operator(POD, Matrix<T, Rows, Cols>)
madcowswe 0:feb4117d16d8 143 * Note: operations +,-,*,/ are per se element wise
madcowswe 0:feb4117d16d8 144 */
madcowswe 0:feb4117d16d8 145 #define TVMET_DECLARE_MACRO(NAME, OP, POD) \
madcowswe 0:feb4117d16d8 146 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 147 XprMatrix< \
madcowswe 0:feb4117d16d8 148 XprBinOp< \
madcowswe 0:feb4117d16d8 149 Fcnl_##NAME<T, POD >, \
madcowswe 0:feb4117d16d8 150 MatrixConstReference<T, Rows, Cols>, \
madcowswe 0:feb4117d16d8 151 XprLiteral<POD > \
madcowswe 0:feb4117d16d8 152 >, \
madcowswe 0:feb4117d16d8 153 Rows, Cols \
madcowswe 0:feb4117d16d8 154 > \
madcowswe 0:feb4117d16d8 155 operator OP (const Matrix<T, Rows, Cols>& lhs, \
madcowswe 0:feb4117d16d8 156 POD rhs) TVMET_CXX_ALWAYS_INLINE; \
madcowswe 0:feb4117d16d8 157 \
madcowswe 0:feb4117d16d8 158 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 159 XprMatrix< \
madcowswe 0:feb4117d16d8 160 XprBinOp< \
madcowswe 0:feb4117d16d8 161 Fcnl_##NAME< POD, T>, \
madcowswe 0:feb4117d16d8 162 XprLiteral< POD >, \
madcowswe 0:feb4117d16d8 163 MatrixConstReference<T, Rows, Cols> \
madcowswe 0:feb4117d16d8 164 >, \
madcowswe 0:feb4117d16d8 165 Rows, Cols \
madcowswe 0:feb4117d16d8 166 > \
madcowswe 0:feb4117d16d8 167 operator OP (POD lhs, \
madcowswe 0:feb4117d16d8 168 const Matrix<T, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 169
madcowswe 0:feb4117d16d8 170 TVMET_DECLARE_MACRO(add, +, int)
madcowswe 0:feb4117d16d8 171 TVMET_DECLARE_MACRO(sub, -, int)
madcowswe 0:feb4117d16d8 172 TVMET_DECLARE_MACRO(mul, *, int)
madcowswe 0:feb4117d16d8 173 TVMET_DECLARE_MACRO(div, /, int)
madcowswe 0:feb4117d16d8 174
madcowswe 0:feb4117d16d8 175 #if defined(TVMET_HAVE_LONG_LONG)
madcowswe 0:feb4117d16d8 176 TVMET_DECLARE_MACRO(add, +, long long int)
madcowswe 0:feb4117d16d8 177 TVMET_DECLARE_MACRO(sub, -, long long int)
madcowswe 0:feb4117d16d8 178 TVMET_DECLARE_MACRO(mul, *, long long int)
madcowswe 0:feb4117d16d8 179 TVMET_DECLARE_MACRO(div, /, long long int)
madcowswe 0:feb4117d16d8 180 #endif // defined(TVMET_HAVE_LONG_LONG)
madcowswe 0:feb4117d16d8 181
madcowswe 0:feb4117d16d8 182 TVMET_DECLARE_MACRO(add, +, float)
madcowswe 0:feb4117d16d8 183 TVMET_DECLARE_MACRO(sub, -, float)
madcowswe 0:feb4117d16d8 184 TVMET_DECLARE_MACRO(mul, *, float)
madcowswe 0:feb4117d16d8 185 TVMET_DECLARE_MACRO(div, /, float)
madcowswe 0:feb4117d16d8 186
madcowswe 0:feb4117d16d8 187 TVMET_DECLARE_MACRO(add, +, double)
madcowswe 0:feb4117d16d8 188 TVMET_DECLARE_MACRO(sub, -, double)
madcowswe 0:feb4117d16d8 189 TVMET_DECLARE_MACRO(mul, *, double)
madcowswe 0:feb4117d16d8 190 TVMET_DECLARE_MACRO(div, /, double)
madcowswe 0:feb4117d16d8 191
madcowswe 0:feb4117d16d8 192 #if defined(TVMET_HAVE_LONG_DOUBLE)
madcowswe 0:feb4117d16d8 193 TVMET_DECLARE_MACRO(add, +, long double)
madcowswe 0:feb4117d16d8 194 TVMET_DECLARE_MACRO(sub, -, long double)
madcowswe 0:feb4117d16d8 195 TVMET_DECLARE_MACRO(mul, *, long double)
madcowswe 0:feb4117d16d8 196 TVMET_DECLARE_MACRO(div, /, long double)
madcowswe 0:feb4117d16d8 197 #endif // defined(TVMET_HAVE_LONG_DOUBLE)
madcowswe 0:feb4117d16d8 198
madcowswe 0:feb4117d16d8 199 #undef TVMET_DECLARE_MACRO
madcowswe 0:feb4117d16d8 200
madcowswe 0:feb4117d16d8 201
madcowswe 0:feb4117d16d8 202 #if defined(TVMET_HAVE_COMPLEX)
madcowswe 0:feb4117d16d8 203 /*
madcowswe 0:feb4117d16d8 204 * operator(Matrix<T, Rows, Cols>, complex<T>)
madcowswe 0:feb4117d16d8 205 * operator(complex<T>, Matrix<T, Rows, Cols>)
madcowswe 0:feb4117d16d8 206 * Note: operations +,-,*,/ are per se element wise
madcowswe 0:feb4117d16d8 207 * \todo type promotion
madcowswe 0:feb4117d16d8 208 */
madcowswe 0:feb4117d16d8 209 #define TVMET_DECLARE_MACRO(NAME, OP) \
madcowswe 0:feb4117d16d8 210 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 211 XprMatrix< \
madcowswe 0:feb4117d16d8 212 XprBinOp< \
madcowswe 0:feb4117d16d8 213 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 214 MatrixConstReference< std::complex<T>, Rows, Cols>, \
madcowswe 0:feb4117d16d8 215 XprLiteral<std::complex<T> > \
madcowswe 0:feb4117d16d8 216 >, \
madcowswe 0:feb4117d16d8 217 Rows, Cols \
madcowswe 0:feb4117d16d8 218 > \
madcowswe 0:feb4117d16d8 219 operator OP (const Matrix< std::complex<T>, Rows, Cols>& lhs, \
madcowswe 0:feb4117d16d8 220 const std::complex<T>& rhs) TVMET_CXX_ALWAYS_INLINE; \
madcowswe 0:feb4117d16d8 221 \
madcowswe 0:feb4117d16d8 222 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 223 XprMatrix< \
madcowswe 0:feb4117d16d8 224 XprBinOp< \
madcowswe 0:feb4117d16d8 225 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 226 XprLiteral< std::complex<T> >, \
madcowswe 0:feb4117d16d8 227 MatrixConstReference< std::complex<T>, Rows, Cols> \
madcowswe 0:feb4117d16d8 228 >, \
madcowswe 0:feb4117d16d8 229 Rows, Cols \
madcowswe 0:feb4117d16d8 230 > \
madcowswe 0:feb4117d16d8 231 operator OP (const std::complex<T>& lhs, \
madcowswe 0:feb4117d16d8 232 const Matrix< std::complex<T>, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 233
madcowswe 0:feb4117d16d8 234 TVMET_DECLARE_MACRO(add, +)
madcowswe 0:feb4117d16d8 235 TVMET_DECLARE_MACRO(sub, -)
madcowswe 0:feb4117d16d8 236 TVMET_DECLARE_MACRO(mul, *)
madcowswe 0:feb4117d16d8 237 TVMET_DECLARE_MACRO(div, /)
madcowswe 0:feb4117d16d8 238
madcowswe 0:feb4117d16d8 239 #undef TVMET_DECLARE_MACRO
madcowswe 0:feb4117d16d8 240
madcowswe 0:feb4117d16d8 241 #endif // defined(TVMET_HAVE_COMPLEX)
madcowswe 0:feb4117d16d8 242
madcowswe 0:feb4117d16d8 243
madcowswe 0:feb4117d16d8 244 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 245 * matrix specific operator*() = prod() operations
madcowswe 0:feb4117d16d8 246 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 247
madcowswe 0:feb4117d16d8 248
madcowswe 0:feb4117d16d8 249 template<class T1, std::size_t Rows1, std::size_t Cols1,
madcowswe 0:feb4117d16d8 250 class T2, std::size_t Cols2>
madcowswe 0:feb4117d16d8 251 XprMatrix<
madcowswe 0:feb4117d16d8 252 XprMMProduct<
madcowswe 0:feb4117d16d8 253 MatrixConstReference<T1, Rows1, Cols1>, Rows1, Cols1,
madcowswe 0:feb4117d16d8 254 MatrixConstReference<T2, Cols1, Cols2>, Cols2
madcowswe 0:feb4117d16d8 255 >,
madcowswe 0:feb4117d16d8 256 Rows1, Cols2
madcowswe 0:feb4117d16d8 257 >
madcowswe 0:feb4117d16d8 258 operator*(const Matrix<T1, Rows1, Cols1>& lhs,
madcowswe 0:feb4117d16d8 259 const Matrix<T2, Cols1, Cols2>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 260
madcowswe 0:feb4117d16d8 261
madcowswe 0:feb4117d16d8 262 template<class E1, std::size_t Rows1, std::size_t Cols1,
madcowswe 0:feb4117d16d8 263 class T2, std::size_t Cols2>
madcowswe 0:feb4117d16d8 264 XprMatrix<
madcowswe 0:feb4117d16d8 265 XprMMProduct<
madcowswe 0:feb4117d16d8 266 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1,
madcowswe 0:feb4117d16d8 267 MatrixConstReference<T2, Cols1, Cols2>, Cols2
madcowswe 0:feb4117d16d8 268 >,
madcowswe 0:feb4117d16d8 269 Rows1, Cols2
madcowswe 0:feb4117d16d8 270 >
madcowswe 0:feb4117d16d8 271 operator*(const XprMatrix<E1, Rows1, Cols1>& lhs,
madcowswe 0:feb4117d16d8 272 const Matrix<T2, Cols1, Cols2>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 273
madcowswe 0:feb4117d16d8 274
madcowswe 0:feb4117d16d8 275 template<class T1, std::size_t Rows1, std::size_t Cols1,
madcowswe 0:feb4117d16d8 276 class E2, std::size_t Cols2>
madcowswe 0:feb4117d16d8 277 XprMatrix<
madcowswe 0:feb4117d16d8 278 XprMMProduct<
madcowswe 0:feb4117d16d8 279 MatrixConstReference<T1, Rows1, Cols1>, Rows1, Cols1,
madcowswe 0:feb4117d16d8 280 XprMatrix<E2, Cols1, Cols2>, Cols2
madcowswe 0:feb4117d16d8 281 >,
madcowswe 0:feb4117d16d8 282 Rows1, Cols2
madcowswe 0:feb4117d16d8 283 >
madcowswe 0:feb4117d16d8 284 operator*(const Matrix<T1, Rows1, Cols1>& lhs,
madcowswe 0:feb4117d16d8 285 const XprMatrix<E2, Cols1, Cols2>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 286
madcowswe 0:feb4117d16d8 287
madcowswe 0:feb4117d16d8 288 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 289 * matrix-vector specific prod( ... ) operators
madcowswe 0:feb4117d16d8 290 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 291
madcowswe 0:feb4117d16d8 292
madcowswe 0:feb4117d16d8 293 template<class T1, std::size_t Rows, std::size_t Cols, class T2>
madcowswe 0:feb4117d16d8 294 XprVector<
madcowswe 0:feb4117d16d8 295 XprMVProduct<
madcowswe 0:feb4117d16d8 296 MatrixConstReference<T1, Rows, Cols>, Rows, Cols,
madcowswe 0:feb4117d16d8 297 VectorConstReference<T2, Cols>
madcowswe 0:feb4117d16d8 298 >,
madcowswe 0:feb4117d16d8 299 Rows
madcowswe 0:feb4117d16d8 300 >
madcowswe 0:feb4117d16d8 301 operator*(const Matrix<T1, Rows, Cols>& lhs,
madcowswe 0:feb4117d16d8 302 const Vector<T2, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 303
madcowswe 0:feb4117d16d8 304
madcowswe 0:feb4117d16d8 305 template<class T1, class E2, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 306 XprVector<
madcowswe 0:feb4117d16d8 307 XprMVProduct<
madcowswe 0:feb4117d16d8 308 MatrixConstReference<T1, Rows, Cols>, Rows, Cols,
madcowswe 0:feb4117d16d8 309 XprVector<E2, Cols>
madcowswe 0:feb4117d16d8 310 >,
madcowswe 0:feb4117d16d8 311 Rows
madcowswe 0:feb4117d16d8 312 >
madcowswe 0:feb4117d16d8 313 operator*(const Matrix<T1, Rows, Cols>& lhs,
madcowswe 0:feb4117d16d8 314 const XprVector<E2, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 315
madcowswe 0:feb4117d16d8 316
madcowswe 0:feb4117d16d8 317 template<class E1, class T2, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 318 XprVector<
madcowswe 0:feb4117d16d8 319 XprMVProduct<
madcowswe 0:feb4117d16d8 320 XprMatrix<E1, Rows, Cols>, Rows, Cols,
madcowswe 0:feb4117d16d8 321 VectorConstReference<T2, Cols>
madcowswe 0:feb4117d16d8 322 >,
madcowswe 0:feb4117d16d8 323 Rows
madcowswe 0:feb4117d16d8 324 >
madcowswe 0:feb4117d16d8 325 operator*(const XprMatrix<E1, Rows, Cols>& lhs,
madcowswe 0:feb4117d16d8 326 const Vector<T2, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 327
madcowswe 0:feb4117d16d8 328
madcowswe 0:feb4117d16d8 329 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 330 * Matrix integer and compare operators
madcowswe 0:feb4117d16d8 331 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 332
madcowswe 0:feb4117d16d8 333
madcowswe 0:feb4117d16d8 334 /*
madcowswe 0:feb4117d16d8 335 * operator(Matrix<T1, Rows, Cols>, Matrix<T2, Rows, Cols>)
madcowswe 0:feb4117d16d8 336 * operator(XprMatrix<E>, Matrix<T, Rows, Cols>)
madcowswe 0:feb4117d16d8 337 * operator(Matrix<T, Rows, Cols>, XprMatrix<E>)
madcowswe 0:feb4117d16d8 338 * Note: operations are per se element wise
madcowswe 0:feb4117d16d8 339 */
madcowswe 0:feb4117d16d8 340 #define TVMET_DECLARE_MACRO(NAME, OP) \
madcowswe 0:feb4117d16d8 341 template<class T1, std::size_t Rows, std::size_t Cols, \
madcowswe 0:feb4117d16d8 342 class T2> \
madcowswe 0:feb4117d16d8 343 XprMatrix< \
madcowswe 0:feb4117d16d8 344 XprBinOp< \
madcowswe 0:feb4117d16d8 345 Fcnl_##NAME<T1, T2>, \
madcowswe 0:feb4117d16d8 346 MatrixConstReference<T1, Rows, Cols>, \
madcowswe 0:feb4117d16d8 347 MatrixConstReference<T2, Rows, Cols> \
madcowswe 0:feb4117d16d8 348 >, \
madcowswe 0:feb4117d16d8 349 Rows, Cols \
madcowswe 0:feb4117d16d8 350 > \
madcowswe 0:feb4117d16d8 351 operator OP (const Matrix<T1, Rows, Cols>& lhs, \
madcowswe 0:feb4117d16d8 352 const Matrix<T2, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE; \
madcowswe 0:feb4117d16d8 353 \
madcowswe 0:feb4117d16d8 354 template<class E, \
madcowswe 0:feb4117d16d8 355 class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 356 XprMatrix< \
madcowswe 0:feb4117d16d8 357 XprBinOp< \
madcowswe 0:feb4117d16d8 358 Fcnl_##NAME<typename E::value_type, T>, \
madcowswe 0:feb4117d16d8 359 XprMatrix<E, Rows, Cols>, \
madcowswe 0:feb4117d16d8 360 MatrixConstReference<T, Rows, Cols> \
madcowswe 0:feb4117d16d8 361 >, \
madcowswe 0:feb4117d16d8 362 Rows, Cols \
madcowswe 0:feb4117d16d8 363 > \
madcowswe 0:feb4117d16d8 364 operator OP (const XprMatrix<E, Rows, Cols>& lhs, \
madcowswe 0:feb4117d16d8 365 const Matrix<T, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE; \
madcowswe 0:feb4117d16d8 366 \
madcowswe 0:feb4117d16d8 367 template<class T, std::size_t Rows, std::size_t Cols, \
madcowswe 0:feb4117d16d8 368 class E> \
madcowswe 0:feb4117d16d8 369 XprMatrix< \
madcowswe 0:feb4117d16d8 370 XprBinOp< \
madcowswe 0:feb4117d16d8 371 Fcnl_##NAME<typename E::value_type, T>, \
madcowswe 0:feb4117d16d8 372 MatrixConstReference<T, Rows, Cols>, \
madcowswe 0:feb4117d16d8 373 XprMatrix<E, Rows, Cols> \
madcowswe 0:feb4117d16d8 374 >, \
madcowswe 0:feb4117d16d8 375 Rows, Cols \
madcowswe 0:feb4117d16d8 376 > \
madcowswe 0:feb4117d16d8 377 operator OP (const Matrix<T, Rows, Cols>& lhs, \
madcowswe 0:feb4117d16d8 378 const XprMatrix<E, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 379
madcowswe 0:feb4117d16d8 380 // integer operators only, e.g used on double you wil get an error
madcowswe 0:feb4117d16d8 381 namespace element_wise {
madcowswe 0:feb4117d16d8 382 TVMET_DECLARE_MACRO(mod, %)
madcowswe 0:feb4117d16d8 383 TVMET_DECLARE_MACRO(bitxor, ^)
madcowswe 0:feb4117d16d8 384 TVMET_DECLARE_MACRO(bitand, &)
madcowswe 0:feb4117d16d8 385 TVMET_DECLARE_MACRO(bitor, |)
madcowswe 0:feb4117d16d8 386 TVMET_DECLARE_MACRO(shl, <<)
madcowswe 0:feb4117d16d8 387 TVMET_DECLARE_MACRO(shr, >>)
madcowswe 0:feb4117d16d8 388 }
madcowswe 0:feb4117d16d8 389
madcowswe 0:feb4117d16d8 390 // necessary operators for eval functions
madcowswe 0:feb4117d16d8 391 TVMET_DECLARE_MACRO(greater, >)
madcowswe 0:feb4117d16d8 392 TVMET_DECLARE_MACRO(less, <)
madcowswe 0:feb4117d16d8 393 TVMET_DECLARE_MACRO(greater_eq, >=)
madcowswe 0:feb4117d16d8 394 TVMET_DECLARE_MACRO(less_eq, <=)
madcowswe 0:feb4117d16d8 395 TVMET_DECLARE_MACRO(eq, ==)
madcowswe 0:feb4117d16d8 396 TVMET_DECLARE_MACRO(not_eq, !=)
madcowswe 0:feb4117d16d8 397 TVMET_DECLARE_MACRO(and, &&)
madcowswe 0:feb4117d16d8 398 TVMET_DECLARE_MACRO(or, ||)
madcowswe 0:feb4117d16d8 399
madcowswe 0:feb4117d16d8 400 #undef TVMET_DECLARE_MACRO
madcowswe 0:feb4117d16d8 401
madcowswe 0:feb4117d16d8 402
madcowswe 0:feb4117d16d8 403 #if defined(TVMET_HAVE_COMPLEX)
madcowswe 0:feb4117d16d8 404 /*
madcowswe 0:feb4117d16d8 405 * operator(Matrix<T, Rows, Cols>, complex<T>)
madcowswe 0:feb4117d16d8 406 * operator(complex<T>, Matrix<T, Rows, Cols>)
madcowswe 0:feb4117d16d8 407 * Note: - per se element wise
madcowswe 0:feb4117d16d8 408 * - bit ops on complex<int> doesn't make sense, stay away
madcowswe 0:feb4117d16d8 409 * \todo type promotion
madcowswe 0:feb4117d16d8 410 */
madcowswe 0:feb4117d16d8 411 #define TVMET_DECLARE_MACRO(NAME, OP) \
madcowswe 0:feb4117d16d8 412 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 413 XprMatrix< \
madcowswe 0:feb4117d16d8 414 XprBinOp< \
madcowswe 0:feb4117d16d8 415 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 416 MatrixConstReference< std::complex<T>, Rows, Cols>, \
madcowswe 0:feb4117d16d8 417 XprLiteral<std::complex<T> > \
madcowswe 0:feb4117d16d8 418 >, \
madcowswe 0:feb4117d16d8 419 Rows, Cols \
madcowswe 0:feb4117d16d8 420 > \
madcowswe 0:feb4117d16d8 421 operator OP (const Matrix< std::complex<T>, Rows, Cols>& lhs, \
madcowswe 0:feb4117d16d8 422 const std::complex<T>& rhs) TVMET_CXX_ALWAYS_INLINE; \
madcowswe 0:feb4117d16d8 423 \
madcowswe 0:feb4117d16d8 424 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 425 XprMatrix< \
madcowswe 0:feb4117d16d8 426 XprBinOp< \
madcowswe 0:feb4117d16d8 427 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 428 XprLiteral< std::complex<T> >, \
madcowswe 0:feb4117d16d8 429 MatrixConstReference< std::complex<T>, Rows, Cols> \
madcowswe 0:feb4117d16d8 430 >, \
madcowswe 0:feb4117d16d8 431 Rows, Cols \
madcowswe 0:feb4117d16d8 432 > \
madcowswe 0:feb4117d16d8 433 operator OP (const std::complex<T>& lhs, \
madcowswe 0:feb4117d16d8 434 const Matrix< std::complex<T>, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 435
madcowswe 0:feb4117d16d8 436 // necessary operators for eval functions
madcowswe 0:feb4117d16d8 437 TVMET_DECLARE_MACRO(greater, >)
madcowswe 0:feb4117d16d8 438 TVMET_DECLARE_MACRO(less, <)
madcowswe 0:feb4117d16d8 439 TVMET_DECLARE_MACRO(greater_eq, >=)
madcowswe 0:feb4117d16d8 440 TVMET_DECLARE_MACRO(less_eq, <=)
madcowswe 0:feb4117d16d8 441 TVMET_DECLARE_MACRO(eq, ==)
madcowswe 0:feb4117d16d8 442 TVMET_DECLARE_MACRO(not_eq, !=)
madcowswe 0:feb4117d16d8 443 TVMET_DECLARE_MACRO(and, &&)
madcowswe 0:feb4117d16d8 444 TVMET_DECLARE_MACRO(or, ||)
madcowswe 0:feb4117d16d8 445
madcowswe 0:feb4117d16d8 446 #undef TVMET_DECLARE_MACRO
madcowswe 0:feb4117d16d8 447
madcowswe 0:feb4117d16d8 448 #endif // defined(TVMET_HAVE_COMPLEX)
madcowswe 0:feb4117d16d8 449
madcowswe 0:feb4117d16d8 450
madcowswe 0:feb4117d16d8 451 /*
madcowswe 0:feb4117d16d8 452 * operator(Matrix<T, Rows, Cols>, POD)
madcowswe 0:feb4117d16d8 453 * operator(POD, Matrix<T, Rows, Cols>)
madcowswe 0:feb4117d16d8 454 * Note: operations are per se element wise
madcowswe 0:feb4117d16d8 455 */
madcowswe 0:feb4117d16d8 456 #define TVMET_DECLARE_MACRO(NAME, OP, TP) \
madcowswe 0:feb4117d16d8 457 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 458 XprMatrix< \
madcowswe 0:feb4117d16d8 459 XprBinOp< \
madcowswe 0:feb4117d16d8 460 Fcnl_##NAME<T, TP >, \
madcowswe 0:feb4117d16d8 461 MatrixConstReference<T, Rows, Cols>, \
madcowswe 0:feb4117d16d8 462 XprLiteral<TP > \
madcowswe 0:feb4117d16d8 463 >, \
madcowswe 0:feb4117d16d8 464 Rows, Cols \
madcowswe 0:feb4117d16d8 465 > \
madcowswe 0:feb4117d16d8 466 operator OP (const Matrix<T, Rows, Cols>& lhs, TP rhs) TVMET_CXX_ALWAYS_INLINE; \
madcowswe 0:feb4117d16d8 467 \
madcowswe 0:feb4117d16d8 468 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 469 XprMatrix< \
madcowswe 0:feb4117d16d8 470 XprBinOp< \
madcowswe 0:feb4117d16d8 471 Fcnl_##NAME< TP, T>, \
madcowswe 0:feb4117d16d8 472 XprLiteral< TP >, \
madcowswe 0:feb4117d16d8 473 MatrixConstReference<T, Rows, Cols> \
madcowswe 0:feb4117d16d8 474 >, \
madcowswe 0:feb4117d16d8 475 Rows, Cols \
madcowswe 0:feb4117d16d8 476 > \
madcowswe 0:feb4117d16d8 477 operator OP (TP lhs, const Matrix<T, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 478
madcowswe 0:feb4117d16d8 479 // integer operators only, e.g used on double you wil get an error
madcowswe 0:feb4117d16d8 480 namespace element_wise {
madcowswe 0:feb4117d16d8 481 TVMET_DECLARE_MACRO(mod, %, int)
madcowswe 0:feb4117d16d8 482 TVMET_DECLARE_MACRO(bitxor, ^, int)
madcowswe 0:feb4117d16d8 483 TVMET_DECLARE_MACRO(bitand, &, int)
madcowswe 0:feb4117d16d8 484 TVMET_DECLARE_MACRO(bitor, |, int)
madcowswe 0:feb4117d16d8 485 TVMET_DECLARE_MACRO(shl, <<, int)
madcowswe 0:feb4117d16d8 486 TVMET_DECLARE_MACRO(shr, >>, int)
madcowswe 0:feb4117d16d8 487 }
madcowswe 0:feb4117d16d8 488
madcowswe 0:feb4117d16d8 489 // necessary operators for eval functions
madcowswe 0:feb4117d16d8 490 TVMET_DECLARE_MACRO(greater, >, int)
madcowswe 0:feb4117d16d8 491 TVMET_DECLARE_MACRO(less, <, int)
madcowswe 0:feb4117d16d8 492 TVMET_DECLARE_MACRO(greater_eq, >=, int)
madcowswe 0:feb4117d16d8 493 TVMET_DECLARE_MACRO(less_eq, <=, int)
madcowswe 0:feb4117d16d8 494 TVMET_DECLARE_MACRO(eq, ==, int)
madcowswe 0:feb4117d16d8 495 TVMET_DECLARE_MACRO(not_eq, !=, int)
madcowswe 0:feb4117d16d8 496 TVMET_DECLARE_MACRO(and, &&, int)
madcowswe 0:feb4117d16d8 497 TVMET_DECLARE_MACRO(or, ||, int)
madcowswe 0:feb4117d16d8 498
madcowswe 0:feb4117d16d8 499 #if defined(TVMET_HAVE_LONG_LONG)
madcowswe 0:feb4117d16d8 500 // integer operators only
madcowswe 0:feb4117d16d8 501 namespace element_wise {
madcowswe 0:feb4117d16d8 502 TVMET_DECLARE_MACRO(mod, %, long long int)
madcowswe 0:feb4117d16d8 503 TVMET_DECLARE_MACRO(bitxor, ^, long long int)
madcowswe 0:feb4117d16d8 504 TVMET_DECLARE_MACRO(bitand, &, long long int)
madcowswe 0:feb4117d16d8 505 TVMET_DECLARE_MACRO(bitor, |, long long int)
madcowswe 0:feb4117d16d8 506 TVMET_DECLARE_MACRO(shl, <<, long long int)
madcowswe 0:feb4117d16d8 507 TVMET_DECLARE_MACRO(shr, >>, long long int)
madcowswe 0:feb4117d16d8 508 }
madcowswe 0:feb4117d16d8 509
madcowswe 0:feb4117d16d8 510 // necessary operators for eval functions
madcowswe 0:feb4117d16d8 511 TVMET_DECLARE_MACRO(greater, >, long long int)
madcowswe 0:feb4117d16d8 512 TVMET_DECLARE_MACRO(less, <, long long int)
madcowswe 0:feb4117d16d8 513 TVMET_DECLARE_MACRO(greater_eq, >=, long long int)
madcowswe 0:feb4117d16d8 514 TVMET_DECLARE_MACRO(less_eq, <=, long long int)
madcowswe 0:feb4117d16d8 515 TVMET_DECLARE_MACRO(eq, ==, long long int)
madcowswe 0:feb4117d16d8 516 TVMET_DECLARE_MACRO(not_eq, !=, long long int)
madcowswe 0:feb4117d16d8 517 TVMET_DECLARE_MACRO(and, &&, long long int)
madcowswe 0:feb4117d16d8 518 TVMET_DECLARE_MACRO(or, ||, long long int)
madcowswe 0:feb4117d16d8 519 #endif // defined(TVMET_HAVE_LONG_LONG)
madcowswe 0:feb4117d16d8 520
madcowswe 0:feb4117d16d8 521 // necessary operators for eval functions
madcowswe 0:feb4117d16d8 522 TVMET_DECLARE_MACRO(greater, >, float)
madcowswe 0:feb4117d16d8 523 TVMET_DECLARE_MACRO(less, <, float)
madcowswe 0:feb4117d16d8 524 TVMET_DECLARE_MACRO(greater_eq, >=, float)
madcowswe 0:feb4117d16d8 525 TVMET_DECLARE_MACRO(less_eq, <=, float)
madcowswe 0:feb4117d16d8 526 TVMET_DECLARE_MACRO(eq, ==, float)
madcowswe 0:feb4117d16d8 527 TVMET_DECLARE_MACRO(not_eq, !=, float)
madcowswe 0:feb4117d16d8 528 TVMET_DECLARE_MACRO(and, &&, float)
madcowswe 0:feb4117d16d8 529 TVMET_DECLARE_MACRO(or, ||, float)
madcowswe 0:feb4117d16d8 530
madcowswe 0:feb4117d16d8 531 // necessary operators for eval functions
madcowswe 0:feb4117d16d8 532 TVMET_DECLARE_MACRO(greater, >, double)
madcowswe 0:feb4117d16d8 533 TVMET_DECLARE_MACRO(less, <, double)
madcowswe 0:feb4117d16d8 534 TVMET_DECLARE_MACRO(greater_eq, >=, double)
madcowswe 0:feb4117d16d8 535 TVMET_DECLARE_MACRO(less_eq, <=, double)
madcowswe 0:feb4117d16d8 536 TVMET_DECLARE_MACRO(eq, ==, double)
madcowswe 0:feb4117d16d8 537 TVMET_DECLARE_MACRO(not_eq, !=, double)
madcowswe 0:feb4117d16d8 538 TVMET_DECLARE_MACRO(and, &&, double)
madcowswe 0:feb4117d16d8 539 TVMET_DECLARE_MACRO(or, ||, double)
madcowswe 0:feb4117d16d8 540
madcowswe 0:feb4117d16d8 541 #if defined(TVMET_HAVE_LONG_DOUBLE)
madcowswe 0:feb4117d16d8 542 // necessary operators for eval functions
madcowswe 0:feb4117d16d8 543 TVMET_DECLARE_MACRO(greater, >, long double)
madcowswe 0:feb4117d16d8 544 TVMET_DECLARE_MACRO(less, <, long double)
madcowswe 0:feb4117d16d8 545 TVMET_DECLARE_MACRO(greater_eq, >=, long double)
madcowswe 0:feb4117d16d8 546 TVMET_DECLARE_MACRO(less_eq, <=, long double)
madcowswe 0:feb4117d16d8 547 TVMET_DECLARE_MACRO(eq, ==, long double)
madcowswe 0:feb4117d16d8 548 TVMET_DECLARE_MACRO(not_eq, !=, long double)
madcowswe 0:feb4117d16d8 549 TVMET_DECLARE_MACRO(and, &&, long double)
madcowswe 0:feb4117d16d8 550 TVMET_DECLARE_MACRO(or, ||, long double)
madcowswe 0:feb4117d16d8 551 #endif // defined(TVMET_HAVE_LONG_DOUBLE)
madcowswe 0:feb4117d16d8 552
madcowswe 0:feb4117d16d8 553 #undef TVMET_DECLARE_MACRO
madcowswe 0:feb4117d16d8 554
madcowswe 0:feb4117d16d8 555
madcowswe 0:feb4117d16d8 556
madcowswe 0:feb4117d16d8 557
madcowswe 0:feb4117d16d8 558 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 559 * global unary operators
madcowswe 0:feb4117d16d8 560 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 561
madcowswe 0:feb4117d16d8 562
madcowswe 0:feb4117d16d8 563 /*
madcowswe 0:feb4117d16d8 564 * unary_operator(Matrix<T, Rows, Cols>)
madcowswe 0:feb4117d16d8 565 * Note: per se element wise
madcowswe 0:feb4117d16d8 566 */
madcowswe 0:feb4117d16d8 567 #define TVMET_DECLARE_MACRO(NAME, OP) \
madcowswe 0:feb4117d16d8 568 template <class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 569 XprMatrix< \
madcowswe 0:feb4117d16d8 570 XprUnOp< \
madcowswe 0:feb4117d16d8 571 Fcnl_##NAME<T>, \
madcowswe 0:feb4117d16d8 572 MatrixConstReference<T, Rows, Cols> \
madcowswe 0:feb4117d16d8 573 >, \
madcowswe 0:feb4117d16d8 574 Rows, Cols \
madcowswe 0:feb4117d16d8 575 > \
madcowswe 0:feb4117d16d8 576 operator OP (const Matrix<T, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 577
madcowswe 0:feb4117d16d8 578 TVMET_DECLARE_MACRO(not, !)
madcowswe 0:feb4117d16d8 579 TVMET_DECLARE_MACRO(compl, ~)
madcowswe 0:feb4117d16d8 580 TVMET_DECLARE_MACRO(neg, -)
madcowswe 0:feb4117d16d8 581 #undef TVMET_DECLARE_MACRO
madcowswe 0:feb4117d16d8 582
madcowswe 0:feb4117d16d8 583
madcowswe 0:feb4117d16d8 584 /*********************************************************
madcowswe 0:feb4117d16d8 585 * PART II: IMPLEMENTATION
madcowswe 0:feb4117d16d8 586 *********************************************************/
madcowswe 0:feb4117d16d8 587
madcowswe 0:feb4117d16d8 588
madcowswe 0:feb4117d16d8 589 /**
madcowswe 0:feb4117d16d8 590 * \fn operator<<(std::ostream& os, const Matrix<T, Rows, Cols>& rhs)
madcowswe 0:feb4117d16d8 591 * \brief Overload operator for i/o
madcowswe 0:feb4117d16d8 592 * \ingroup _binary_operator
madcowswe 0:feb4117d16d8 593 */
madcowswe 0:feb4117d16d8 594 template<class T, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 595 inline
madcowswe 0:feb4117d16d8 596 std::ostream& operator<<(std::ostream& os, const Matrix<T, Rows, Cols>& rhs) {
madcowswe 0:feb4117d16d8 597 return rhs.print_on(os);
madcowswe 0:feb4117d16d8 598 }
madcowswe 0:feb4117d16d8 599
madcowswe 0:feb4117d16d8 600
madcowswe 0:feb4117d16d8 601 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 602 * Member operators (arithmetic and bit ops)
madcowswe 0:feb4117d16d8 603 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 604
madcowswe 0:feb4117d16d8 605
madcowswe 0:feb4117d16d8 606 /*
madcowswe 0:feb4117d16d8 607 * update_operator(Matrix<T1, Rows, Cols>, Matrix<T2, Rows, Cols>)
madcowswe 0:feb4117d16d8 608 * update_operator(Matrix<T1, Rows, Cols>, XprMatrix<E, Rows, Cols> rhs)
madcowswe 0:feb4117d16d8 609 * Note: per se element wise
madcowswe 0:feb4117d16d8 610 * \todo: the operator*= can have element wise mul oder product, decide!
madcowswe 0:feb4117d16d8 611 */
madcowswe 0:feb4117d16d8 612 #define TVMET_IMPLEMENT_MACRO(NAME, OP) \
madcowswe 0:feb4117d16d8 613 template<class T1, class T2, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 614 inline \
madcowswe 0:feb4117d16d8 615 Matrix<T1, Rows, Cols>& \
madcowswe 0:feb4117d16d8 616 operator OP (Matrix<T1, Rows, Cols>& lhs, const Matrix<T2, Rows, Cols>& rhs) { \
madcowswe 0:feb4117d16d8 617 return lhs.M_##NAME(rhs); \
madcowswe 0:feb4117d16d8 618 } \
madcowswe 0:feb4117d16d8 619 \
madcowswe 0:feb4117d16d8 620 template<class T, class E, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 621 inline \
madcowswe 0:feb4117d16d8 622 Matrix<T, Rows, Cols>& \
madcowswe 0:feb4117d16d8 623 operator OP (Matrix<T, Rows, Cols>& lhs, const XprMatrix<E, Rows, Cols>& rhs) { \
madcowswe 0:feb4117d16d8 624 return lhs.M_##NAME(rhs); \
madcowswe 0:feb4117d16d8 625 }
madcowswe 0:feb4117d16d8 626
madcowswe 0:feb4117d16d8 627 TVMET_IMPLEMENT_MACRO(add_eq, +=) // per se element wise
madcowswe 0:feb4117d16d8 628 TVMET_IMPLEMENT_MACRO(sub_eq, -=) // per se element wise
madcowswe 0:feb4117d16d8 629 namespace element_wise {
madcowswe 0:feb4117d16d8 630 TVMET_IMPLEMENT_MACRO(mul_eq, *=) // see note
madcowswe 0:feb4117d16d8 631 TVMET_IMPLEMENT_MACRO(div_eq, /=) // not defined for vectors
madcowswe 0:feb4117d16d8 632 }
madcowswe 0:feb4117d16d8 633
madcowswe 0:feb4117d16d8 634 // integer operators only, e.g used on double you wil get an error
madcowswe 0:feb4117d16d8 635 namespace element_wise {
madcowswe 0:feb4117d16d8 636 TVMET_IMPLEMENT_MACRO(mod_eq, %=)
madcowswe 0:feb4117d16d8 637 TVMET_IMPLEMENT_MACRO(xor_eq, ^=)
madcowswe 0:feb4117d16d8 638 TVMET_IMPLEMENT_MACRO(and_eq, &=)
madcowswe 0:feb4117d16d8 639 TVMET_IMPLEMENT_MACRO(or_eq, |=)
madcowswe 0:feb4117d16d8 640 TVMET_IMPLEMENT_MACRO(shl_eq, <<=)
madcowswe 0:feb4117d16d8 641 TVMET_IMPLEMENT_MACRO(shr_eq, >>=)
madcowswe 0:feb4117d16d8 642 }
madcowswe 0:feb4117d16d8 643
madcowswe 0:feb4117d16d8 644 #undef TVMET_IMPLEMENT_MACRO
madcowswe 0:feb4117d16d8 645
madcowswe 0:feb4117d16d8 646
madcowswe 0:feb4117d16d8 647 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 648 * Matrix arithmetic operators implemented by functions
madcowswe 0:feb4117d16d8 649 * add, sub, mul and div
madcowswe 0:feb4117d16d8 650 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 651
madcowswe 0:feb4117d16d8 652
madcowswe 0:feb4117d16d8 653 /*
madcowswe 0:feb4117d16d8 654 * operator(Matrix<T1, Rows, Cols>, Matrix<T2, Rows, Cols>)
madcowswe 0:feb4117d16d8 655 * operator(XprMatrix<E, Rows, Cols>, Matrix<T, Rows, Cols>)
madcowswe 0:feb4117d16d8 656 * operator(Matrix<T, Rows, Cols>, XprMatrix<E, Rows, Cols>)
madcowswe 0:feb4117d16d8 657 * Note: per se element wise
madcowswe 0:feb4117d16d8 658 */
madcowswe 0:feb4117d16d8 659 #define TVMET_IMPLEMENT_MACRO(NAME, OP) \
madcowswe 0:feb4117d16d8 660 template<class T1, class T2, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 661 inline \
madcowswe 0:feb4117d16d8 662 XprMatrix< \
madcowswe 0:feb4117d16d8 663 XprBinOp< \
madcowswe 0:feb4117d16d8 664 Fcnl_##NAME<T1, T2>, \
madcowswe 0:feb4117d16d8 665 MatrixConstReference<T1, Rows, Cols>, \
madcowswe 0:feb4117d16d8 666 MatrixConstReference<T2, Rows, Cols> \
madcowswe 0:feb4117d16d8 667 >, \
madcowswe 0:feb4117d16d8 668 Rows, Cols \
madcowswe 0:feb4117d16d8 669 > \
madcowswe 0:feb4117d16d8 670 operator OP (const Matrix<T1, Rows, Cols>& lhs, const Matrix<T2, Rows, Cols>& rhs) { \
madcowswe 0:feb4117d16d8 671 return NAME(lhs, rhs); \
madcowswe 0:feb4117d16d8 672 } \
madcowswe 0:feb4117d16d8 673 \
madcowswe 0:feb4117d16d8 674 template<class E, class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 675 inline \
madcowswe 0:feb4117d16d8 676 XprMatrix< \
madcowswe 0:feb4117d16d8 677 XprBinOp< \
madcowswe 0:feb4117d16d8 678 Fcnl_##NAME<typename E::value_type, T>, \
madcowswe 0:feb4117d16d8 679 XprMatrix<E, Rows, Cols>, \
madcowswe 0:feb4117d16d8 680 MatrixConstReference<T, Rows, Cols> \
madcowswe 0:feb4117d16d8 681 >, \
madcowswe 0:feb4117d16d8 682 Rows, Cols \
madcowswe 0:feb4117d16d8 683 > \
madcowswe 0:feb4117d16d8 684 operator OP (const XprMatrix<E, Rows, Cols>& lhs, const Matrix<T, Rows, Cols>& rhs) { \
madcowswe 0:feb4117d16d8 685 return NAME(lhs, rhs); \
madcowswe 0:feb4117d16d8 686 } \
madcowswe 0:feb4117d16d8 687 \
madcowswe 0:feb4117d16d8 688 template<class T, class E, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 689 inline \
madcowswe 0:feb4117d16d8 690 XprMatrix< \
madcowswe 0:feb4117d16d8 691 XprBinOp< \
madcowswe 0:feb4117d16d8 692 Fcnl_##NAME<typename E::value_type, T>, \
madcowswe 0:feb4117d16d8 693 MatrixConstReference<T, Rows, Cols>, \
madcowswe 0:feb4117d16d8 694 XprMatrix<E, Rows, Cols> \
madcowswe 0:feb4117d16d8 695 >, \
madcowswe 0:feb4117d16d8 696 Rows, Cols \
madcowswe 0:feb4117d16d8 697 > \
madcowswe 0:feb4117d16d8 698 operator OP (const Matrix<T, Rows, Cols>& lhs, const XprMatrix<E, Rows, Cols>& rhs) { \
madcowswe 0:feb4117d16d8 699 return NAME(lhs, rhs); \
madcowswe 0:feb4117d16d8 700 }
madcowswe 0:feb4117d16d8 701
madcowswe 0:feb4117d16d8 702 TVMET_IMPLEMENT_MACRO(add, +) // per se element wise
madcowswe 0:feb4117d16d8 703 TVMET_IMPLEMENT_MACRO(sub, -) // per se element wise
madcowswe 0:feb4117d16d8 704 namespace element_wise {
madcowswe 0:feb4117d16d8 705 TVMET_IMPLEMENT_MACRO(mul, *) // see as prod()
madcowswe 0:feb4117d16d8 706 TVMET_IMPLEMENT_MACRO(div, /) // not defined for matrizes
madcowswe 0:feb4117d16d8 707 }
madcowswe 0:feb4117d16d8 708 #undef TVMET_IMPLEMENT_MACRO
madcowswe 0:feb4117d16d8 709
madcowswe 0:feb4117d16d8 710
madcowswe 0:feb4117d16d8 711 /*
madcowswe 0:feb4117d16d8 712 * operator(Matrix<T, Rows, Cols>, POD)
madcowswe 0:feb4117d16d8 713 * operator(POD, Matrix<T, Rows, Cols>)
madcowswe 0:feb4117d16d8 714 * Note: operations +,-,*,/ are per se element wise
madcowswe 0:feb4117d16d8 715 */
madcowswe 0:feb4117d16d8 716 #define TVMET_IMPLEMENT_MACRO(NAME, OP, POD) \
madcowswe 0:feb4117d16d8 717 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 718 inline \
madcowswe 0:feb4117d16d8 719 XprMatrix< \
madcowswe 0:feb4117d16d8 720 XprBinOp< \
madcowswe 0:feb4117d16d8 721 Fcnl_##NAME<T, POD >, \
madcowswe 0:feb4117d16d8 722 MatrixConstReference<T, Rows, Cols>, \
madcowswe 0:feb4117d16d8 723 XprLiteral<POD > \
madcowswe 0:feb4117d16d8 724 >, \
madcowswe 0:feb4117d16d8 725 Rows, Cols \
madcowswe 0:feb4117d16d8 726 > \
madcowswe 0:feb4117d16d8 727 operator OP (const Matrix<T, Rows, Cols>& lhs, POD rhs) { \
madcowswe 0:feb4117d16d8 728 return NAME (lhs, rhs); \
madcowswe 0:feb4117d16d8 729 } \
madcowswe 0:feb4117d16d8 730 \
madcowswe 0:feb4117d16d8 731 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 732 inline \
madcowswe 0:feb4117d16d8 733 XprMatrix< \
madcowswe 0:feb4117d16d8 734 XprBinOp< \
madcowswe 0:feb4117d16d8 735 Fcnl_##NAME< POD, T>, \
madcowswe 0:feb4117d16d8 736 XprLiteral< POD >, \
madcowswe 0:feb4117d16d8 737 MatrixConstReference<T, Rows, Cols> \
madcowswe 0:feb4117d16d8 738 >, \
madcowswe 0:feb4117d16d8 739 Rows, Cols \
madcowswe 0:feb4117d16d8 740 > \
madcowswe 0:feb4117d16d8 741 operator OP (POD lhs, const Matrix<T, Rows, Cols>& rhs) { \
madcowswe 0:feb4117d16d8 742 return NAME (lhs, rhs); \
madcowswe 0:feb4117d16d8 743 }
madcowswe 0:feb4117d16d8 744
madcowswe 0:feb4117d16d8 745 TVMET_IMPLEMENT_MACRO(add, +, int)
madcowswe 0:feb4117d16d8 746 TVMET_IMPLEMENT_MACRO(sub, -, int)
madcowswe 0:feb4117d16d8 747 TVMET_IMPLEMENT_MACRO(mul, *, int)
madcowswe 0:feb4117d16d8 748 TVMET_IMPLEMENT_MACRO(div, /, int)
madcowswe 0:feb4117d16d8 749
madcowswe 0:feb4117d16d8 750 #if defined(TVMET_HAVE_LONG_LONG)
madcowswe 0:feb4117d16d8 751 TVMET_IMPLEMENT_MACRO(add, +, long long int)
madcowswe 0:feb4117d16d8 752 TVMET_IMPLEMENT_MACRO(sub, -, long long int)
madcowswe 0:feb4117d16d8 753 TVMET_IMPLEMENT_MACRO(mul, *, long long int)
madcowswe 0:feb4117d16d8 754 TVMET_IMPLEMENT_MACRO(div, /, long long int)
madcowswe 0:feb4117d16d8 755 #endif // defined(TVMET_HAVE_LONG_LONG)
madcowswe 0:feb4117d16d8 756
madcowswe 0:feb4117d16d8 757 TVMET_IMPLEMENT_MACRO(add, +, float)
madcowswe 0:feb4117d16d8 758 TVMET_IMPLEMENT_MACRO(sub, -, float)
madcowswe 0:feb4117d16d8 759 TVMET_IMPLEMENT_MACRO(mul, *, float)
madcowswe 0:feb4117d16d8 760 TVMET_IMPLEMENT_MACRO(div, /, float)
madcowswe 0:feb4117d16d8 761
madcowswe 0:feb4117d16d8 762 TVMET_IMPLEMENT_MACRO(add, +, double)
madcowswe 0:feb4117d16d8 763 TVMET_IMPLEMENT_MACRO(sub, -, double)
madcowswe 0:feb4117d16d8 764 TVMET_IMPLEMENT_MACRO(mul, *, double)
madcowswe 0:feb4117d16d8 765 TVMET_IMPLEMENT_MACRO(div, /, double)
madcowswe 0:feb4117d16d8 766
madcowswe 0:feb4117d16d8 767 #if defined(TVMET_HAVE_LONG_DOUBLE)
madcowswe 0:feb4117d16d8 768 TVMET_IMPLEMENT_MACRO(add, +, long double)
madcowswe 0:feb4117d16d8 769 TVMET_IMPLEMENT_MACRO(sub, -, long double)
madcowswe 0:feb4117d16d8 770 TVMET_IMPLEMENT_MACRO(mul, *, long double)
madcowswe 0:feb4117d16d8 771 TVMET_IMPLEMENT_MACRO(div, /, long double)
madcowswe 0:feb4117d16d8 772 #endif // defined(TVMET_HAVE_LONG_DOUBLE)
madcowswe 0:feb4117d16d8 773
madcowswe 0:feb4117d16d8 774 #undef TVMET_IMPLEMENT_MACRO
madcowswe 0:feb4117d16d8 775
madcowswe 0:feb4117d16d8 776
madcowswe 0:feb4117d16d8 777 #if defined(TVMET_HAVE_COMPLEX)
madcowswe 0:feb4117d16d8 778 /*
madcowswe 0:feb4117d16d8 779 * operator(Matrix<T, Rows, Cols>, complex<T>)
madcowswe 0:feb4117d16d8 780 * operator(complex<T>, Matrix<T, Rows, Cols>)
madcowswe 0:feb4117d16d8 781 * Note: operations +,-,*,/ are per se element wise
madcowswe 0:feb4117d16d8 782 * \todo type promotion
madcowswe 0:feb4117d16d8 783 */
madcowswe 0:feb4117d16d8 784 #define TVMET_IMPLEMENT_MACRO(NAME, OP) \
madcowswe 0:feb4117d16d8 785 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 786 inline \
madcowswe 0:feb4117d16d8 787 XprMatrix< \
madcowswe 0:feb4117d16d8 788 XprBinOp< \
madcowswe 0:feb4117d16d8 789 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 790 MatrixConstReference< std::complex<T>, Rows, Cols>, \
madcowswe 0:feb4117d16d8 791 XprLiteral<std::complex<T> > \
madcowswe 0:feb4117d16d8 792 >, \
madcowswe 0:feb4117d16d8 793 Rows, Cols \
madcowswe 0:feb4117d16d8 794 > \
madcowswe 0:feb4117d16d8 795 operator OP (const Matrix< std::complex<T>, Rows, Cols>& lhs, \
madcowswe 0:feb4117d16d8 796 const std::complex<T>& rhs) { \
madcowswe 0:feb4117d16d8 797 return NAME (lhs, rhs); \
madcowswe 0:feb4117d16d8 798 } \
madcowswe 0:feb4117d16d8 799 \
madcowswe 0:feb4117d16d8 800 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 801 inline \
madcowswe 0:feb4117d16d8 802 XprMatrix< \
madcowswe 0:feb4117d16d8 803 XprBinOp< \
madcowswe 0:feb4117d16d8 804 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 805 XprLiteral< std::complex<T> >, \
madcowswe 0:feb4117d16d8 806 MatrixConstReference< std::complex<T>, Rows, Cols> \
madcowswe 0:feb4117d16d8 807 >, \
madcowswe 0:feb4117d16d8 808 Rows, Cols \
madcowswe 0:feb4117d16d8 809 > \
madcowswe 0:feb4117d16d8 810 operator OP (const std::complex<T>& lhs, \
madcowswe 0:feb4117d16d8 811 const Matrix< std::complex<T>, Rows, Cols>& rhs) { \
madcowswe 0:feb4117d16d8 812 return NAME (lhs, rhs); \
madcowswe 0:feb4117d16d8 813 }
madcowswe 0:feb4117d16d8 814
madcowswe 0:feb4117d16d8 815 TVMET_IMPLEMENT_MACRO(add, +)
madcowswe 0:feb4117d16d8 816 TVMET_IMPLEMENT_MACRO(sub, -)
madcowswe 0:feb4117d16d8 817 TVMET_IMPLEMENT_MACRO(mul, *)
madcowswe 0:feb4117d16d8 818 TVMET_IMPLEMENT_MACRO(div, /)
madcowswe 0:feb4117d16d8 819
madcowswe 0:feb4117d16d8 820 #undef TVMET_IMPLEMENT_MACRO
madcowswe 0:feb4117d16d8 821
madcowswe 0:feb4117d16d8 822 #endif // defined(TVMET_HAVE_COMPLEX)
madcowswe 0:feb4117d16d8 823
madcowswe 0:feb4117d16d8 824
madcowswe 0:feb4117d16d8 825 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 826 * matrix specific operator*() = prod() operations
madcowswe 0:feb4117d16d8 827 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 828
madcowswe 0:feb4117d16d8 829
madcowswe 0:feb4117d16d8 830 /**
madcowswe 0:feb4117d16d8 831 * \fn operator*(const Matrix<T1, Rows1, Cols1>& lhs, const Matrix<T2, Cols1, Cols2>& rhs)
madcowswe 0:feb4117d16d8 832 * \brief multiply two Matrices.
madcowswe 0:feb4117d16d8 833 * \ingroup _binary_operator
madcowswe 0:feb4117d16d8 834 * \note The rows2 has to be equal to cols1.
madcowswe 0:feb4117d16d8 835 * \sa prod(const Matrix<T1, Rows1, Cols1>& lhs, const Matrix<T2, Cols1, Cols2>& rhs)
madcowswe 0:feb4117d16d8 836 */
madcowswe 0:feb4117d16d8 837 template<class T1, std::size_t Rows1, std::size_t Cols1,
madcowswe 0:feb4117d16d8 838 class T2, std::size_t Cols2>
madcowswe 0:feb4117d16d8 839 inline
madcowswe 0:feb4117d16d8 840 XprMatrix<
madcowswe 0:feb4117d16d8 841 XprMMProduct<
madcowswe 0:feb4117d16d8 842 MatrixConstReference<T1, Rows1, Cols1>, Rows1, Cols1,
madcowswe 0:feb4117d16d8 843 MatrixConstReference<T2, Cols1, Cols2>, Cols2
madcowswe 0:feb4117d16d8 844 >,
madcowswe 0:feb4117d16d8 845 Rows1, Cols2
madcowswe 0:feb4117d16d8 846 >
madcowswe 0:feb4117d16d8 847 operator*(const Matrix<T1, Rows1, Cols1>& lhs, const Matrix<T2, Cols1, Cols2>& rhs) {
madcowswe 0:feb4117d16d8 848 return prod(lhs, rhs);
madcowswe 0:feb4117d16d8 849 }
madcowswe 0:feb4117d16d8 850
madcowswe 0:feb4117d16d8 851
madcowswe 0:feb4117d16d8 852 /**
madcowswe 0:feb4117d16d8 853 * \fn operator*(const XprMatrix<E1, Rows1, Cols1>& lhs, const Matrix<T2, Cols1, Cols2>& rhs)
madcowswe 0:feb4117d16d8 854 * \brief Evaluate the product of XprMatrix and Matrix.
madcowswe 0:feb4117d16d8 855 * \ingroup _binary_operator
madcowswe 0:feb4117d16d8 856 * \sa prod(const XprMatrix<E1, Rows1, Cols1>& lhs, const Matrix<T2, Cols1, Cols2>& rhs)
madcowswe 0:feb4117d16d8 857 */
madcowswe 0:feb4117d16d8 858 template<class E1, std::size_t Rows1, std::size_t Cols1,
madcowswe 0:feb4117d16d8 859 class T2, std::size_t Cols2>
madcowswe 0:feb4117d16d8 860 inline
madcowswe 0:feb4117d16d8 861 XprMatrix<
madcowswe 0:feb4117d16d8 862 XprMMProduct<
madcowswe 0:feb4117d16d8 863 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1,
madcowswe 0:feb4117d16d8 864 MatrixConstReference<T2, Cols1, Cols2>, Cols2
madcowswe 0:feb4117d16d8 865 >,
madcowswe 0:feb4117d16d8 866 Rows1, Cols2
madcowswe 0:feb4117d16d8 867 >
madcowswe 0:feb4117d16d8 868 operator*(const XprMatrix<E1, Rows1, Cols1>& lhs, const Matrix<T2, Cols1, Cols2>& rhs) {
madcowswe 0:feb4117d16d8 869 return prod(lhs, rhs);
madcowswe 0:feb4117d16d8 870 }
madcowswe 0:feb4117d16d8 871
madcowswe 0:feb4117d16d8 872
madcowswe 0:feb4117d16d8 873 /**
madcowswe 0:feb4117d16d8 874 * \fn operator*(const Matrix<T1, Rows1, Cols1>& lhs, const XprMatrix<E2, Cols1, Cols2>& rhs)
madcowswe 0:feb4117d16d8 875 * \brief Evaluate the product of Matrix and XprMatrix.
madcowswe 0:feb4117d16d8 876 * \ingroup _binary_operator
madcowswe 0:feb4117d16d8 877 * \sa prod(const Matrix<T, Rows1, Cols1>& lhs, const XprMatrix<E, Cols1, Cols2>& rhs)
madcowswe 0:feb4117d16d8 878 */
madcowswe 0:feb4117d16d8 879 template<class T1, std::size_t Rows1, std::size_t Cols1,
madcowswe 0:feb4117d16d8 880 class E2, std::size_t Cols2>
madcowswe 0:feb4117d16d8 881 inline
madcowswe 0:feb4117d16d8 882 XprMatrix<
madcowswe 0:feb4117d16d8 883 XprMMProduct<
madcowswe 0:feb4117d16d8 884 MatrixConstReference<T1, Rows1, Cols1>, Rows1, Cols1,
madcowswe 0:feb4117d16d8 885 XprMatrix<E2, Cols1, Cols2>, Cols2
madcowswe 0:feb4117d16d8 886 >,
madcowswe 0:feb4117d16d8 887 Rows1, Cols2
madcowswe 0:feb4117d16d8 888 >
madcowswe 0:feb4117d16d8 889 operator*(const Matrix<T1, Rows1, Cols1>& lhs, const XprMatrix<E2, Cols1, Cols2>& rhs) {
madcowswe 0:feb4117d16d8 890 return prod(lhs, rhs);
madcowswe 0:feb4117d16d8 891 }
madcowswe 0:feb4117d16d8 892
madcowswe 0:feb4117d16d8 893
madcowswe 0:feb4117d16d8 894 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 895 * matrix-vector specific prod( ... ) operators
madcowswe 0:feb4117d16d8 896 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 897
madcowswe 0:feb4117d16d8 898
madcowswe 0:feb4117d16d8 899 /**
madcowswe 0:feb4117d16d8 900 * \fn operator*(const Matrix<T1, Rows, Cols>& lhs, const Vector<T2, Cols>& rhs)
madcowswe 0:feb4117d16d8 901 * \brief multiply a Matrix with a Vector.
madcowswe 0:feb4117d16d8 902 * \ingroup _binary_operator
madcowswe 0:feb4117d16d8 903 * \note The length of the Vector has to be equal to the number of Columns.
madcowswe 0:feb4117d16d8 904 * \sa prod(const Matrix<T1, Rows, Cols>& m, const Vector<T2, Cols>& v)
madcowswe 0:feb4117d16d8 905 */
madcowswe 0:feb4117d16d8 906 template<class T1, std::size_t Rows, std::size_t Cols, class T2>
madcowswe 0:feb4117d16d8 907 inline
madcowswe 0:feb4117d16d8 908 XprVector<
madcowswe 0:feb4117d16d8 909 XprMVProduct<
madcowswe 0:feb4117d16d8 910 MatrixConstReference<T1, Rows, Cols>, Rows, Cols,
madcowswe 0:feb4117d16d8 911 VectorConstReference<T2, Cols>
madcowswe 0:feb4117d16d8 912 >,
madcowswe 0:feb4117d16d8 913 Rows
madcowswe 0:feb4117d16d8 914 >
madcowswe 0:feb4117d16d8 915 operator*(const Matrix<T1, Rows, Cols>& lhs, const Vector<T2, Cols>& rhs) {
madcowswe 0:feb4117d16d8 916 return prod(lhs, rhs);
madcowswe 0:feb4117d16d8 917 }
madcowswe 0:feb4117d16d8 918
madcowswe 0:feb4117d16d8 919
madcowswe 0:feb4117d16d8 920 /**
madcowswe 0:feb4117d16d8 921 * \fn operator*(const Matrix<T1, Rows, Cols>& lhs, const XprVector<E2, Cols>& rhs)
madcowswe 0:feb4117d16d8 922 * \brief Function for the matrix-vector-product
madcowswe 0:feb4117d16d8 923 * \ingroup _binary_operator
madcowswe 0:feb4117d16d8 924 * \sa prod(const Matrix<T, Rows, Cols>& lhs, const XprVector<E, Cols>& rhs)
madcowswe 0:feb4117d16d8 925 */
madcowswe 0:feb4117d16d8 926 template<class T1, class E2, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 927 inline
madcowswe 0:feb4117d16d8 928 XprVector<
madcowswe 0:feb4117d16d8 929 XprMVProduct<
madcowswe 0:feb4117d16d8 930 MatrixConstReference<T1, Rows, Cols>, Rows, Cols,
madcowswe 0:feb4117d16d8 931 XprVector<E2, Cols>
madcowswe 0:feb4117d16d8 932 >,
madcowswe 0:feb4117d16d8 933 Rows
madcowswe 0:feb4117d16d8 934 >
madcowswe 0:feb4117d16d8 935 operator*(const Matrix<T1, Rows, Cols>& lhs, const XprVector<E2, Cols>& rhs) {
madcowswe 0:feb4117d16d8 936 return prod(lhs, rhs);
madcowswe 0:feb4117d16d8 937 }
madcowswe 0:feb4117d16d8 938
madcowswe 0:feb4117d16d8 939
madcowswe 0:feb4117d16d8 940 /**
madcowswe 0:feb4117d16d8 941 * \fn operator*(const XprMatrix<E1, Rows, Cols>& lhs, const Vector<T2, Cols>& rhs)
madcowswe 0:feb4117d16d8 942 * \brief Compute the product of an XprMatrix with a Vector.
madcowswe 0:feb4117d16d8 943 * \ingroup _binary_operator
madcowswe 0:feb4117d16d8 944 * \sa prod(const XprMatrix<E, Rows, Cols>& lhs, const Vector<T, Cols>& rhs)
madcowswe 0:feb4117d16d8 945 */
madcowswe 0:feb4117d16d8 946 template<class E1, class T2, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 947 inline
madcowswe 0:feb4117d16d8 948 XprVector<
madcowswe 0:feb4117d16d8 949 XprMVProduct<
madcowswe 0:feb4117d16d8 950 XprMatrix<E1, Rows, Cols>, Rows, Cols,
madcowswe 0:feb4117d16d8 951 VectorConstReference<T2, Cols>
madcowswe 0:feb4117d16d8 952 >,
madcowswe 0:feb4117d16d8 953 Rows
madcowswe 0:feb4117d16d8 954 >
madcowswe 0:feb4117d16d8 955 operator*(const XprMatrix<E1, Rows, Cols>& lhs, const Vector<T2, Cols>& rhs) {
madcowswe 0:feb4117d16d8 956 return prod(lhs, rhs);
madcowswe 0:feb4117d16d8 957 }
madcowswe 0:feb4117d16d8 958
madcowswe 0:feb4117d16d8 959
madcowswe 0:feb4117d16d8 960 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 961 * Matrix integer and compare operators
madcowswe 0:feb4117d16d8 962 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 963
madcowswe 0:feb4117d16d8 964
madcowswe 0:feb4117d16d8 965 /*
madcowswe 0:feb4117d16d8 966 * operator(Matrix<T1, Rows, Cols>, Matrix<T2, Rows, Cols>)
madcowswe 0:feb4117d16d8 967 * operator(XprMatrix<E>, Matrix<T, Rows, Cols>)
madcowswe 0:feb4117d16d8 968 * operator(Matrix<T, Rows, Cols>, XprMatrix<E>)
madcowswe 0:feb4117d16d8 969 * Note: operations are per se element wise
madcowswe 0:feb4117d16d8 970 */
madcowswe 0:feb4117d16d8 971 #define TVMET_IMPLEMENT_MACRO(NAME, OP) \
madcowswe 0:feb4117d16d8 972 template<class T1, std::size_t Rows, std::size_t Cols, \
madcowswe 0:feb4117d16d8 973 class T2> \
madcowswe 0:feb4117d16d8 974 inline \
madcowswe 0:feb4117d16d8 975 XprMatrix< \
madcowswe 0:feb4117d16d8 976 XprBinOp< \
madcowswe 0:feb4117d16d8 977 Fcnl_##NAME<T1, T2>, \
madcowswe 0:feb4117d16d8 978 MatrixConstReference<T1, Rows, Cols>, \
madcowswe 0:feb4117d16d8 979 MatrixConstReference<T2, Rows, Cols> \
madcowswe 0:feb4117d16d8 980 >, \
madcowswe 0:feb4117d16d8 981 Rows, Cols \
madcowswe 0:feb4117d16d8 982 > \
madcowswe 0:feb4117d16d8 983 operator OP (const Matrix<T1, Rows, Cols>& lhs, \
madcowswe 0:feb4117d16d8 984 const Matrix<T2, Rows, Cols>& rhs) { \
madcowswe 0:feb4117d16d8 985 typedef XprBinOp < \
madcowswe 0:feb4117d16d8 986 Fcnl_##NAME<T1, T2>, \
madcowswe 0:feb4117d16d8 987 MatrixConstReference<T1, Rows, Cols>, \
madcowswe 0:feb4117d16d8 988 MatrixConstReference<T2, Rows, Cols> \
madcowswe 0:feb4117d16d8 989 > expr_type; \
madcowswe 0:feb4117d16d8 990 return XprMatrix<expr_type, Rows, Cols>(expr_type(lhs.const_ref(), rhs.const_ref())); \
madcowswe 0:feb4117d16d8 991 } \
madcowswe 0:feb4117d16d8 992 \
madcowswe 0:feb4117d16d8 993 template<class E, \
madcowswe 0:feb4117d16d8 994 class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 995 inline \
madcowswe 0:feb4117d16d8 996 XprMatrix< \
madcowswe 0:feb4117d16d8 997 XprBinOp< \
madcowswe 0:feb4117d16d8 998 Fcnl_##NAME<typename E::value_type, T>, \
madcowswe 0:feb4117d16d8 999 XprMatrix<E, Rows, Cols>, \
madcowswe 0:feb4117d16d8 1000 MatrixConstReference<T, Rows, Cols> \
madcowswe 0:feb4117d16d8 1001 >, \
madcowswe 0:feb4117d16d8 1002 Rows, Cols \
madcowswe 0:feb4117d16d8 1003 > \
madcowswe 0:feb4117d16d8 1004 operator OP (const XprMatrix<E, Rows, Cols>& lhs, const Matrix<T, Rows, Cols>& rhs) { \
madcowswe 0:feb4117d16d8 1005 typedef XprBinOp< \
madcowswe 0:feb4117d16d8 1006 Fcnl_##NAME<typename E::value_type, T>, \
madcowswe 0:feb4117d16d8 1007 XprMatrix<E, Rows, Cols>, \
madcowswe 0:feb4117d16d8 1008 MatrixConstReference<T, Rows, Cols> \
madcowswe 0:feb4117d16d8 1009 > expr_type; \
madcowswe 0:feb4117d16d8 1010 return XprMatrix<expr_type, Rows, Cols>(expr_type(lhs, rhs.const_ref())); \
madcowswe 0:feb4117d16d8 1011 } \
madcowswe 0:feb4117d16d8 1012 \
madcowswe 0:feb4117d16d8 1013 template<class T, std::size_t Rows, std::size_t Cols, \
madcowswe 0:feb4117d16d8 1014 class E> \
madcowswe 0:feb4117d16d8 1015 inline \
madcowswe 0:feb4117d16d8 1016 XprMatrix< \
madcowswe 0:feb4117d16d8 1017 XprBinOp< \
madcowswe 0:feb4117d16d8 1018 Fcnl_##NAME<typename E::value_type, T>, \
madcowswe 0:feb4117d16d8 1019 MatrixConstReference<T, Rows, Cols>, \
madcowswe 0:feb4117d16d8 1020 XprMatrix<E, Rows, Cols> \
madcowswe 0:feb4117d16d8 1021 >, \
madcowswe 0:feb4117d16d8 1022 Rows, Cols \
madcowswe 0:feb4117d16d8 1023 > \
madcowswe 0:feb4117d16d8 1024 operator OP (const Matrix<T, Rows, Cols>& lhs, const XprMatrix<E, Rows, Cols>& rhs) { \
madcowswe 0:feb4117d16d8 1025 typedef XprBinOp< \
madcowswe 0:feb4117d16d8 1026 Fcnl_##NAME<T, typename E::value_type>, \
madcowswe 0:feb4117d16d8 1027 MatrixConstReference<T, Rows, Cols>, \
madcowswe 0:feb4117d16d8 1028 XprMatrix<E, Rows, Cols> \
madcowswe 0:feb4117d16d8 1029 > expr_type; \
madcowswe 0:feb4117d16d8 1030 return XprMatrix<expr_type, Rows, Cols>(expr_type(lhs.const_ref(), rhs)); \
madcowswe 0:feb4117d16d8 1031 }
madcowswe 0:feb4117d16d8 1032
madcowswe 0:feb4117d16d8 1033 // integer operators only, e.g used on double you wil get an error
madcowswe 0:feb4117d16d8 1034 namespace element_wise {
madcowswe 0:feb4117d16d8 1035 TVMET_IMPLEMENT_MACRO(mod, %)
madcowswe 0:feb4117d16d8 1036 TVMET_IMPLEMENT_MACRO(bitxor, ^)
madcowswe 0:feb4117d16d8 1037 TVMET_IMPLEMENT_MACRO(bitand, &)
madcowswe 0:feb4117d16d8 1038 TVMET_IMPLEMENT_MACRO(bitor, |)
madcowswe 0:feb4117d16d8 1039 TVMET_IMPLEMENT_MACRO(shl, <<)
madcowswe 0:feb4117d16d8 1040 TVMET_IMPLEMENT_MACRO(shr, >>)
madcowswe 0:feb4117d16d8 1041 }
madcowswe 0:feb4117d16d8 1042
madcowswe 0:feb4117d16d8 1043 // necessary operators for eval functions
madcowswe 0:feb4117d16d8 1044 TVMET_IMPLEMENT_MACRO(greater, >)
madcowswe 0:feb4117d16d8 1045 TVMET_IMPLEMENT_MACRO(less, <)
madcowswe 0:feb4117d16d8 1046 TVMET_IMPLEMENT_MACRO(greater_eq, >=)
madcowswe 0:feb4117d16d8 1047 TVMET_IMPLEMENT_MACRO(less_eq, <=)
madcowswe 0:feb4117d16d8 1048 TVMET_IMPLEMENT_MACRO(eq, ==)
madcowswe 0:feb4117d16d8 1049 TVMET_IMPLEMENT_MACRO(not_eq, !=)
madcowswe 0:feb4117d16d8 1050 TVMET_IMPLEMENT_MACRO(and, &&)
madcowswe 0:feb4117d16d8 1051 TVMET_IMPLEMENT_MACRO(or, ||)
madcowswe 0:feb4117d16d8 1052
madcowswe 0:feb4117d16d8 1053 #undef TVMET_IMPLEMENT_MACRO
madcowswe 0:feb4117d16d8 1054
madcowswe 0:feb4117d16d8 1055
madcowswe 0:feb4117d16d8 1056 #if defined(TVMET_HAVE_COMPLEX)
madcowswe 0:feb4117d16d8 1057 /*
madcowswe 0:feb4117d16d8 1058 * operator(Matrix<T, Rows, Cols>, complex<T>)
madcowswe 0:feb4117d16d8 1059 * operator(complex<T>, Matrix<T, Rows, Cols>)
madcowswe 0:feb4117d16d8 1060 * Note: - per se element wise
madcowswe 0:feb4117d16d8 1061 * - bit ops on complex<int> doesn't make sense, stay away
madcowswe 0:feb4117d16d8 1062 * \todo type promotion
madcowswe 0:feb4117d16d8 1063 */
madcowswe 0:feb4117d16d8 1064 #define TVMET_IMPLEMENT_MACRO(NAME, OP) \
madcowswe 0:feb4117d16d8 1065 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 1066 inline \
madcowswe 0:feb4117d16d8 1067 XprMatrix< \
madcowswe 0:feb4117d16d8 1068 XprBinOp< \
madcowswe 0:feb4117d16d8 1069 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 1070 MatrixConstReference< std::complex<T>, Rows, Cols>, \
madcowswe 0:feb4117d16d8 1071 XprLiteral<std::complex<T> > \
madcowswe 0:feb4117d16d8 1072 >, \
madcowswe 0:feb4117d16d8 1073 Rows, Cols \
madcowswe 0:feb4117d16d8 1074 > \
madcowswe 0:feb4117d16d8 1075 operator OP (const Matrix< std::complex<T>, Rows, Cols>& lhs, \
madcowswe 0:feb4117d16d8 1076 const std::complex<T>& rhs) { \
madcowswe 0:feb4117d16d8 1077 typedef XprBinOp< \
madcowswe 0:feb4117d16d8 1078 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 1079 MatrixConstReference< std::complex<T>, Rows, Cols>, \
madcowswe 0:feb4117d16d8 1080 XprLiteral< std::complex<T> > \
madcowswe 0:feb4117d16d8 1081 > expr_type; \
madcowswe 0:feb4117d16d8 1082 return XprMatrix<expr_type, Rows, Cols>( \
madcowswe 0:feb4117d16d8 1083 expr_type(lhs.const_ref(), XprLiteral< std::complex<T> >(rhs))); \
madcowswe 0:feb4117d16d8 1084 } \
madcowswe 0:feb4117d16d8 1085 \
madcowswe 0:feb4117d16d8 1086 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 1087 inline \
madcowswe 0:feb4117d16d8 1088 XprMatrix< \
madcowswe 0:feb4117d16d8 1089 XprBinOp< \
madcowswe 0:feb4117d16d8 1090 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 1091 XprLiteral< std::complex<T> >, \
madcowswe 0:feb4117d16d8 1092 MatrixConstReference< std::complex<T>, Rows, Cols> \
madcowswe 0:feb4117d16d8 1093 >, \
madcowswe 0:feb4117d16d8 1094 Rows, Cols \
madcowswe 0:feb4117d16d8 1095 > \
madcowswe 0:feb4117d16d8 1096 operator OP (const std::complex<T>& lhs, \
madcowswe 0:feb4117d16d8 1097 const Matrix< std::complex<T>, Rows, Cols>& rhs) { \
madcowswe 0:feb4117d16d8 1098 typedef XprBinOp< \
madcowswe 0:feb4117d16d8 1099 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 1100 XprLiteral< std::complex<T> >, \
madcowswe 0:feb4117d16d8 1101 MatrixConstReference<T, Rows, Cols> \
madcowswe 0:feb4117d16d8 1102 > expr_type; \
madcowswe 0:feb4117d16d8 1103 return XprMatrix<expr_type, Rows, Cols>( \
madcowswe 0:feb4117d16d8 1104 expr_type(XprLiteral< std::complex<T> >(lhs), rhs.const_ref())); \
madcowswe 0:feb4117d16d8 1105 }
madcowswe 0:feb4117d16d8 1106
madcowswe 0:feb4117d16d8 1107 // necessary operators for eval functions
madcowswe 0:feb4117d16d8 1108 TVMET_IMPLEMENT_MACRO(greater, >)
madcowswe 0:feb4117d16d8 1109 TVMET_IMPLEMENT_MACRO(less, <)
madcowswe 0:feb4117d16d8 1110 TVMET_IMPLEMENT_MACRO(greater_eq, >=)
madcowswe 0:feb4117d16d8 1111 TVMET_IMPLEMENT_MACRO(less_eq, <=)
madcowswe 0:feb4117d16d8 1112 TVMET_IMPLEMENT_MACRO(eq, ==)
madcowswe 0:feb4117d16d8 1113 TVMET_IMPLEMENT_MACRO(not_eq, !=)
madcowswe 0:feb4117d16d8 1114 TVMET_IMPLEMENT_MACRO(and, &&)
madcowswe 0:feb4117d16d8 1115 TVMET_IMPLEMENT_MACRO(or, ||)
madcowswe 0:feb4117d16d8 1116
madcowswe 0:feb4117d16d8 1117 #undef TVMET_IMPLEMENT_MACRO
madcowswe 0:feb4117d16d8 1118
madcowswe 0:feb4117d16d8 1119 #endif // defined(TVMET_HAVE_COMPLEX)
madcowswe 0:feb4117d16d8 1120
madcowswe 0:feb4117d16d8 1121
madcowswe 0:feb4117d16d8 1122 /*
madcowswe 0:feb4117d16d8 1123 * operator(Matrix<T, Rows, Cols>, POD)
madcowswe 0:feb4117d16d8 1124 * operator(POD, Matrix<T, Rows, Cols>)
madcowswe 0:feb4117d16d8 1125 * Note: operations are per se element wise
madcowswe 0:feb4117d16d8 1126 */
madcowswe 0:feb4117d16d8 1127 #define TVMET_IMPLEMENT_MACRO(NAME, OP, TP) \
madcowswe 0:feb4117d16d8 1128 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 1129 inline \
madcowswe 0:feb4117d16d8 1130 XprMatrix< \
madcowswe 0:feb4117d16d8 1131 XprBinOp< \
madcowswe 0:feb4117d16d8 1132 Fcnl_##NAME<T, TP >, \
madcowswe 0:feb4117d16d8 1133 MatrixConstReference<T, Rows, Cols>, \
madcowswe 0:feb4117d16d8 1134 XprLiteral<TP > \
madcowswe 0:feb4117d16d8 1135 >, \
madcowswe 0:feb4117d16d8 1136 Rows, Cols \
madcowswe 0:feb4117d16d8 1137 > \
madcowswe 0:feb4117d16d8 1138 operator OP (const Matrix<T, Rows, Cols>& lhs, TP rhs) { \
madcowswe 0:feb4117d16d8 1139 typedef XprBinOp< \
madcowswe 0:feb4117d16d8 1140 Fcnl_##NAME<T, TP >, \
madcowswe 0:feb4117d16d8 1141 MatrixConstReference<T, Rows, Cols>, \
madcowswe 0:feb4117d16d8 1142 XprLiteral< TP > \
madcowswe 0:feb4117d16d8 1143 > expr_type; \
madcowswe 0:feb4117d16d8 1144 return XprMatrix<expr_type, Rows, Cols>( \
madcowswe 0:feb4117d16d8 1145 expr_type(lhs.const_ref(), XprLiteral< TP >(rhs))); \
madcowswe 0:feb4117d16d8 1146 } \
madcowswe 0:feb4117d16d8 1147 \
madcowswe 0:feb4117d16d8 1148 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 1149 inline \
madcowswe 0:feb4117d16d8 1150 XprMatrix< \
madcowswe 0:feb4117d16d8 1151 XprBinOp< \
madcowswe 0:feb4117d16d8 1152 Fcnl_##NAME< TP, T>, \
madcowswe 0:feb4117d16d8 1153 XprLiteral< TP >, \
madcowswe 0:feb4117d16d8 1154 MatrixConstReference<T, Rows, Cols> \
madcowswe 0:feb4117d16d8 1155 >, \
madcowswe 0:feb4117d16d8 1156 Rows, Cols \
madcowswe 0:feb4117d16d8 1157 > \
madcowswe 0:feb4117d16d8 1158 operator OP (TP lhs, const Matrix<T, Rows, Cols>& rhs) { \
madcowswe 0:feb4117d16d8 1159 typedef XprBinOp< \
madcowswe 0:feb4117d16d8 1160 Fcnl_##NAME< TP, T>, \
madcowswe 0:feb4117d16d8 1161 XprLiteral< TP >, \
madcowswe 0:feb4117d16d8 1162 MatrixConstReference<T, Rows, Cols> \
madcowswe 0:feb4117d16d8 1163 > expr_type; \
madcowswe 0:feb4117d16d8 1164 return XprMatrix<expr_type, Rows, Cols>( \
madcowswe 0:feb4117d16d8 1165 expr_type(XprLiteral< TP >(lhs), rhs.const_ref())); \
madcowswe 0:feb4117d16d8 1166 }
madcowswe 0:feb4117d16d8 1167
madcowswe 0:feb4117d16d8 1168 // integer operators only, e.g used on double you wil get an error
madcowswe 0:feb4117d16d8 1169 namespace element_wise {
madcowswe 0:feb4117d16d8 1170 TVMET_IMPLEMENT_MACRO(mod, %, int)
madcowswe 0:feb4117d16d8 1171 TVMET_IMPLEMENT_MACRO(bitxor, ^, int)
madcowswe 0:feb4117d16d8 1172 TVMET_IMPLEMENT_MACRO(bitand, &, int)
madcowswe 0:feb4117d16d8 1173 TVMET_IMPLEMENT_MACRO(bitor, |, int)
madcowswe 0:feb4117d16d8 1174 TVMET_IMPLEMENT_MACRO(shl, <<, int)
madcowswe 0:feb4117d16d8 1175 TVMET_IMPLEMENT_MACRO(shr, >>, int)
madcowswe 0:feb4117d16d8 1176 }
madcowswe 0:feb4117d16d8 1177
madcowswe 0:feb4117d16d8 1178 // necessary operators for eval functions
madcowswe 0:feb4117d16d8 1179 TVMET_IMPLEMENT_MACRO(greater, >, int)
madcowswe 0:feb4117d16d8 1180 TVMET_IMPLEMENT_MACRO(less, <, int)
madcowswe 0:feb4117d16d8 1181 TVMET_IMPLEMENT_MACRO(greater_eq, >=, int)
madcowswe 0:feb4117d16d8 1182 TVMET_IMPLEMENT_MACRO(less_eq, <=, int)
madcowswe 0:feb4117d16d8 1183 TVMET_IMPLEMENT_MACRO(eq, ==, int)
madcowswe 0:feb4117d16d8 1184 TVMET_IMPLEMENT_MACRO(not_eq, !=, int)
madcowswe 0:feb4117d16d8 1185 TVMET_IMPLEMENT_MACRO(and, &&, int)
madcowswe 0:feb4117d16d8 1186 TVMET_IMPLEMENT_MACRO(or, ||, int)
madcowswe 0:feb4117d16d8 1187
madcowswe 0:feb4117d16d8 1188 #if defined(TVMET_HAVE_LONG_LONG)
madcowswe 0:feb4117d16d8 1189 // integer operators only
madcowswe 0:feb4117d16d8 1190 namespace element_wise {
madcowswe 0:feb4117d16d8 1191 TVMET_IMPLEMENT_MACRO(mod, %, long long int)
madcowswe 0:feb4117d16d8 1192 TVMET_IMPLEMENT_MACRO(bitxor, ^, long long int)
madcowswe 0:feb4117d16d8 1193 TVMET_IMPLEMENT_MACRO(bitand, &, long long int)
madcowswe 0:feb4117d16d8 1194 TVMET_IMPLEMENT_MACRO(bitor, |, long long int)
madcowswe 0:feb4117d16d8 1195 TVMET_IMPLEMENT_MACRO(shl, <<, long long int)
madcowswe 0:feb4117d16d8 1196 TVMET_IMPLEMENT_MACRO(shr, >>, long long int)
madcowswe 0:feb4117d16d8 1197 }
madcowswe 0:feb4117d16d8 1198
madcowswe 0:feb4117d16d8 1199 // necessary operators for eval functions
madcowswe 0:feb4117d16d8 1200 TVMET_IMPLEMENT_MACRO(greater, >, long long int)
madcowswe 0:feb4117d16d8 1201 TVMET_IMPLEMENT_MACRO(less, <, long long int)
madcowswe 0:feb4117d16d8 1202 TVMET_IMPLEMENT_MACRO(greater_eq, >=, long long int)
madcowswe 0:feb4117d16d8 1203 TVMET_IMPLEMENT_MACRO(less_eq, <=, long long int)
madcowswe 0:feb4117d16d8 1204 TVMET_IMPLEMENT_MACRO(eq, ==, long long int)
madcowswe 0:feb4117d16d8 1205 TVMET_IMPLEMENT_MACRO(not_eq, !=, long long int)
madcowswe 0:feb4117d16d8 1206 TVMET_IMPLEMENT_MACRO(and, &&, long long int)
madcowswe 0:feb4117d16d8 1207 TVMET_IMPLEMENT_MACRO(or, ||, long long int)
madcowswe 0:feb4117d16d8 1208 #endif // defined(TVMET_HAVE_LONG_LONG)
madcowswe 0:feb4117d16d8 1209
madcowswe 0:feb4117d16d8 1210 // necessary operators for eval functions
madcowswe 0:feb4117d16d8 1211 TVMET_IMPLEMENT_MACRO(greater, >, float)
madcowswe 0:feb4117d16d8 1212 TVMET_IMPLEMENT_MACRO(less, <, float)
madcowswe 0:feb4117d16d8 1213 TVMET_IMPLEMENT_MACRO(greater_eq, >=, float)
madcowswe 0:feb4117d16d8 1214 TVMET_IMPLEMENT_MACRO(less_eq, <=, float)
madcowswe 0:feb4117d16d8 1215 TVMET_IMPLEMENT_MACRO(eq, ==, float)
madcowswe 0:feb4117d16d8 1216 TVMET_IMPLEMENT_MACRO(not_eq, !=, float)
madcowswe 0:feb4117d16d8 1217 TVMET_IMPLEMENT_MACRO(and, &&, float)
madcowswe 0:feb4117d16d8 1218 TVMET_IMPLEMENT_MACRO(or, ||, float)
madcowswe 0:feb4117d16d8 1219
madcowswe 0:feb4117d16d8 1220 // necessary operators for eval functions
madcowswe 0:feb4117d16d8 1221 TVMET_IMPLEMENT_MACRO(greater, >, double)
madcowswe 0:feb4117d16d8 1222 TVMET_IMPLEMENT_MACRO(less, <, double)
madcowswe 0:feb4117d16d8 1223 TVMET_IMPLEMENT_MACRO(greater_eq, >=, double)
madcowswe 0:feb4117d16d8 1224 TVMET_IMPLEMENT_MACRO(less_eq, <=, double)
madcowswe 0:feb4117d16d8 1225 TVMET_IMPLEMENT_MACRO(eq, ==, double)
madcowswe 0:feb4117d16d8 1226 TVMET_IMPLEMENT_MACRO(not_eq, !=, double)
madcowswe 0:feb4117d16d8 1227 TVMET_IMPLEMENT_MACRO(and, &&, double)
madcowswe 0:feb4117d16d8 1228 TVMET_IMPLEMENT_MACRO(or, ||, double)
madcowswe 0:feb4117d16d8 1229
madcowswe 0:feb4117d16d8 1230 #if defined(TVMET_HAVE_LONG_DOUBLE)
madcowswe 0:feb4117d16d8 1231 // necessary operators for eval functions
madcowswe 0:feb4117d16d8 1232 TVMET_IMPLEMENT_MACRO(greater, >, long double)
madcowswe 0:feb4117d16d8 1233 TVMET_IMPLEMENT_MACRO(less, <, long double)
madcowswe 0:feb4117d16d8 1234 TVMET_IMPLEMENT_MACRO(greater_eq, >=, long double)
madcowswe 0:feb4117d16d8 1235 TVMET_IMPLEMENT_MACRO(less_eq, <=, long double)
madcowswe 0:feb4117d16d8 1236 TVMET_IMPLEMENT_MACRO(eq, ==, long double)
madcowswe 0:feb4117d16d8 1237 TVMET_IMPLEMENT_MACRO(not_eq, !=, long double)
madcowswe 0:feb4117d16d8 1238 TVMET_IMPLEMENT_MACRO(and, &&, long double)
madcowswe 0:feb4117d16d8 1239 TVMET_IMPLEMENT_MACRO(or, ||, long double)
madcowswe 0:feb4117d16d8 1240 #endif // defined(TVMET_HAVE_LONG_DOUBLE)
madcowswe 0:feb4117d16d8 1241
madcowswe 0:feb4117d16d8 1242 #undef TVMET_IMPLEMENT_MACRO
madcowswe 0:feb4117d16d8 1243
madcowswe 0:feb4117d16d8 1244
madcowswe 0:feb4117d16d8 1245
madcowswe 0:feb4117d16d8 1246
madcowswe 0:feb4117d16d8 1247 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 1248 * global unary operators
madcowswe 0:feb4117d16d8 1249 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 1250
madcowswe 0:feb4117d16d8 1251
madcowswe 0:feb4117d16d8 1252 /*
madcowswe 0:feb4117d16d8 1253 * unary_operator(Matrix<T, Rows, Cols>)
madcowswe 0:feb4117d16d8 1254 * Note: per se element wise
madcowswe 0:feb4117d16d8 1255 */
madcowswe 0:feb4117d16d8 1256 #define TVMET_IMPLEMENT_MACRO(NAME, OP) \
madcowswe 0:feb4117d16d8 1257 template <class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 1258 inline \
madcowswe 0:feb4117d16d8 1259 XprMatrix< \
madcowswe 0:feb4117d16d8 1260 XprUnOp< \
madcowswe 0:feb4117d16d8 1261 Fcnl_##NAME<T>, \
madcowswe 0:feb4117d16d8 1262 MatrixConstReference<T, Rows, Cols> \
madcowswe 0:feb4117d16d8 1263 >, \
madcowswe 0:feb4117d16d8 1264 Rows, Cols \
madcowswe 0:feb4117d16d8 1265 > \
madcowswe 0:feb4117d16d8 1266 operator OP (const Matrix<T, Rows, Cols>& rhs) { \
madcowswe 0:feb4117d16d8 1267 typedef XprUnOp< \
madcowswe 0:feb4117d16d8 1268 Fcnl_##NAME<T>, \
madcowswe 0:feb4117d16d8 1269 MatrixConstReference<T, Rows, Cols> \
madcowswe 0:feb4117d16d8 1270 > expr_type; \
madcowswe 0:feb4117d16d8 1271 return XprMatrix<expr_type, Rows, Cols>(expr_type(rhs.const_ref())); \
madcowswe 0:feb4117d16d8 1272 }
madcowswe 0:feb4117d16d8 1273
madcowswe 0:feb4117d16d8 1274 TVMET_IMPLEMENT_MACRO(not, !)
madcowswe 0:feb4117d16d8 1275 TVMET_IMPLEMENT_MACRO(compl, ~)
madcowswe 0:feb4117d16d8 1276 TVMET_IMPLEMENT_MACRO(neg, -)
madcowswe 0:feb4117d16d8 1277 #undef TVMET_IMPLEMENT_MACRO
madcowswe 0:feb4117d16d8 1278
madcowswe 0:feb4117d16d8 1279
madcowswe 0:feb4117d16d8 1280 } // namespace tvmet
madcowswe 0:feb4117d16d8 1281
madcowswe 0:feb4117d16d8 1282 #endif // TVMET_MATRIX_OPERATORS_H
madcowswe 0:feb4117d16d8 1283
madcowswe 0:feb4117d16d8 1284 // Local Variables:
madcowswe 0:feb4117d16d8 1285 // mode:C++
madcowswe 0:feb4117d16d8 1286 // tab-width:8
madcowswe 0:feb4117d16d8 1287 // End: