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: VectorOperators.h,v 1.17 2007-06-23 15:59:00 opetzold Exp $
narshu 1:cc2a9eb0bd55 22 */
narshu 1:cc2a9eb0bd55 23
narshu 1:cc2a9eb0bd55 24 #ifndef TVMET_XPR_VECTOR_OPERATORS_H
narshu 1:cc2a9eb0bd55 25 #define TVMET_XPR_VECTOR_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 * Vector 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(XprVector<E1, Sz>, XprVector<E2, Sz>)
narshu 1:cc2a9eb0bd55 43 */
narshu 1:cc2a9eb0bd55 44 #define TVMET_DECLARE_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 45 template<class E1, class E2, std::size_t Sz> \
narshu 1:cc2a9eb0bd55 46 inline \
narshu 1:cc2a9eb0bd55 47 XprVector< \
narshu 1:cc2a9eb0bd55 48 XprBinOp< \
narshu 1:cc2a9eb0bd55 49 Fcnl_##NAME<typename E1::value_type, typename E2::value_type>, \
narshu 1:cc2a9eb0bd55 50 XprVector<E1, Sz>, \
narshu 1:cc2a9eb0bd55 51 XprVector<E2, Sz> \
narshu 1:cc2a9eb0bd55 52 >, \
narshu 1:cc2a9eb0bd55 53 Sz \
narshu 1:cc2a9eb0bd55 54 > \
narshu 1:cc2a9eb0bd55 55 operator OP (const XprVector<E1, Sz>& lhs, \
narshu 1:cc2a9eb0bd55 56 const XprVector<E2, Sz>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 1:cc2a9eb0bd55 57
narshu 1:cc2a9eb0bd55 58 TVMET_DECLARE_MACRO(add, +) // per se element wise
narshu 1:cc2a9eb0bd55 59 TVMET_DECLARE_MACRO(sub, -) // per se element wise
narshu 1:cc2a9eb0bd55 60 TVMET_DECLARE_MACRO(mul, *) // per se element wise
narshu 1:cc2a9eb0bd55 61 namespace element_wise {
narshu 1:cc2a9eb0bd55 62 TVMET_DECLARE_MACRO(div, /) // not defined for vectors
narshu 1:cc2a9eb0bd55 63 }
narshu 1:cc2a9eb0bd55 64
narshu 1:cc2a9eb0bd55 65 #undef TVMET_DECLARE_MACRO
narshu 1:cc2a9eb0bd55 66
narshu 1:cc2a9eb0bd55 67
narshu 1:cc2a9eb0bd55 68 /*
narshu 1:cc2a9eb0bd55 69 * operator(XprVector<E, Sz>, POD)
narshu 1:cc2a9eb0bd55 70 * operator(POD, XprVector<E, Sz>)
narshu 1:cc2a9eb0bd55 71 * Note: operations +,-,*,/ are per se element wise
narshu 1:cc2a9eb0bd55 72 */
narshu 1:cc2a9eb0bd55 73 #define TVMET_DECLARE_MACRO(NAME, OP, POD) \
narshu 1:cc2a9eb0bd55 74 template<class E, std::size_t Sz> \
narshu 1:cc2a9eb0bd55 75 inline \
narshu 1:cc2a9eb0bd55 76 XprVector< \
narshu 1:cc2a9eb0bd55 77 XprBinOp< \
narshu 1:cc2a9eb0bd55 78 Fcnl_##NAME<typename E::value_type, POD >, \
narshu 1:cc2a9eb0bd55 79 XprVector<E, Sz>, \
narshu 1:cc2a9eb0bd55 80 XprLiteral< POD > \
narshu 1:cc2a9eb0bd55 81 >, \
narshu 1:cc2a9eb0bd55 82 Sz \
narshu 1:cc2a9eb0bd55 83 > \
narshu 1:cc2a9eb0bd55 84 operator OP (const XprVector<E, Sz>& lhs, \
narshu 1:cc2a9eb0bd55 85 POD rhs) TVMET_CXX_ALWAYS_INLINE; \
narshu 1:cc2a9eb0bd55 86 \
narshu 1:cc2a9eb0bd55 87 template<class E, std::size_t Sz> \
narshu 1:cc2a9eb0bd55 88 inline \
narshu 1:cc2a9eb0bd55 89 XprVector< \
narshu 1:cc2a9eb0bd55 90 XprBinOp< \
narshu 1:cc2a9eb0bd55 91 Fcnl_##NAME< POD, typename E::value_type >, \
narshu 1:cc2a9eb0bd55 92 XprLiteral< POD >, \
narshu 1:cc2a9eb0bd55 93 XprVector< E, Sz> \
narshu 1:cc2a9eb0bd55 94 >, \
narshu 1:cc2a9eb0bd55 95 Sz \
narshu 1:cc2a9eb0bd55 96 > \
narshu 1:cc2a9eb0bd55 97 operator OP (POD lhs, \
narshu 1:cc2a9eb0bd55 98 const XprVector<E, Sz>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 1:cc2a9eb0bd55 99
narshu 1:cc2a9eb0bd55 100 TVMET_DECLARE_MACRO(add, +, int)
narshu 1:cc2a9eb0bd55 101 TVMET_DECLARE_MACRO(sub, -, int)
narshu 1:cc2a9eb0bd55 102 TVMET_DECLARE_MACRO(mul, *, int)
narshu 1:cc2a9eb0bd55 103 TVMET_DECLARE_MACRO(div, /, int)
narshu 1:cc2a9eb0bd55 104
narshu 1:cc2a9eb0bd55 105 #if defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 106 TVMET_DECLARE_MACRO(add, +, long long int)
narshu 1:cc2a9eb0bd55 107 TVMET_DECLARE_MACRO(sub, -, long long int)
narshu 1:cc2a9eb0bd55 108 TVMET_DECLARE_MACRO(mul, *, long long int)
narshu 1:cc2a9eb0bd55 109 TVMET_DECLARE_MACRO(div, /, long long int)
narshu 1:cc2a9eb0bd55 110 #endif
narshu 1:cc2a9eb0bd55 111
narshu 1:cc2a9eb0bd55 112 TVMET_DECLARE_MACRO(add, +, float)
narshu 1:cc2a9eb0bd55 113 TVMET_DECLARE_MACRO(sub, -, float)
narshu 1:cc2a9eb0bd55 114 TVMET_DECLARE_MACRO(mul, *, float)
narshu 1:cc2a9eb0bd55 115 TVMET_DECLARE_MACRO(div, /, float)
narshu 1:cc2a9eb0bd55 116
narshu 1:cc2a9eb0bd55 117 TVMET_DECLARE_MACRO(add, +, double)
narshu 1:cc2a9eb0bd55 118 TVMET_DECLARE_MACRO(sub, -, double)
narshu 1:cc2a9eb0bd55 119 TVMET_DECLARE_MACRO(mul, *, double)
narshu 1:cc2a9eb0bd55 120 TVMET_DECLARE_MACRO(div, /, double)
narshu 1:cc2a9eb0bd55 121
narshu 1:cc2a9eb0bd55 122 #if defined(TVMET_HAVE_LONG_DOUBLE)
narshu 1:cc2a9eb0bd55 123 TVMET_DECLARE_MACRO(add, +, long double)
narshu 1:cc2a9eb0bd55 124 TVMET_DECLARE_MACRO(sub, -, long double)
narshu 1:cc2a9eb0bd55 125 TVMET_DECLARE_MACRO(mul, *, long double)
narshu 1:cc2a9eb0bd55 126 TVMET_DECLARE_MACRO(div, /, long double)
narshu 1:cc2a9eb0bd55 127 #endif
narshu 1:cc2a9eb0bd55 128
narshu 1:cc2a9eb0bd55 129 #undef TVMET_DECLARE_MACRO
narshu 1:cc2a9eb0bd55 130
narshu 1:cc2a9eb0bd55 131
narshu 1:cc2a9eb0bd55 132 #if defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 133 /*
narshu 1:cc2a9eb0bd55 134 * operator(XprVector<E, Sz>, complex<T>)
narshu 1:cc2a9eb0bd55 135 * operator(complex<T>, XprVector<E, Sz>)
narshu 1:cc2a9eb0bd55 136 * Note: operations +,-,*,/ are per se element wise
narshu 1:cc2a9eb0bd55 137 */
narshu 1:cc2a9eb0bd55 138 #define TVMET_DECLARE_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 139 template<class E, std::size_t Sz, class T> \
narshu 1:cc2a9eb0bd55 140 inline \
narshu 1:cc2a9eb0bd55 141 XprVector< \
narshu 1:cc2a9eb0bd55 142 XprBinOp< \
narshu 1:cc2a9eb0bd55 143 Fcnl_##NAME<typename E::value_type, std::complex<T> >, \
narshu 1:cc2a9eb0bd55 144 XprVector<E, Sz>, \
narshu 1:cc2a9eb0bd55 145 XprLiteral< std::complex<T> > \
narshu 1:cc2a9eb0bd55 146 >, \
narshu 1:cc2a9eb0bd55 147 Sz \
narshu 1:cc2a9eb0bd55 148 > \
narshu 1:cc2a9eb0bd55 149 operator OP (const XprVector<E, Sz>& lhs, \
narshu 1:cc2a9eb0bd55 150 const std::complex<T>& rhs) TVMET_CXX_ALWAYS_INLINE; \
narshu 1:cc2a9eb0bd55 151 \
narshu 1:cc2a9eb0bd55 152 template<class E, std::size_t Sz, class T> \
narshu 1:cc2a9eb0bd55 153 inline \
narshu 1:cc2a9eb0bd55 154 XprVector< \
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 XprVector< E, Sz> \
narshu 1:cc2a9eb0bd55 159 >, \
narshu 1:cc2a9eb0bd55 160 Sz \
narshu 1:cc2a9eb0bd55 161 > \
narshu 1:cc2a9eb0bd55 162 operator OP (const std::complex<T>& lhs, \
narshu 1:cc2a9eb0bd55 163 const XprVector<E, Sz>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 1:cc2a9eb0bd55 164
narshu 1:cc2a9eb0bd55 165 TVMET_DECLARE_MACRO(add, +) // per se element wise
narshu 1:cc2a9eb0bd55 166 TVMET_DECLARE_MACRO(sub, -) // per se element wise
narshu 1:cc2a9eb0bd55 167 TVMET_DECLARE_MACRO(mul, *) // per se element wise
narshu 1:cc2a9eb0bd55 168 TVMET_DECLARE_MACRO(div, /) // per se element wise
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 * Vector integer and compare operators
narshu 1:cc2a9eb0bd55 177 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 1:cc2a9eb0bd55 178
narshu 1:cc2a9eb0bd55 179
narshu 1:cc2a9eb0bd55 180 /*
narshu 1:cc2a9eb0bd55 181 * operator(XprVector, XprVector)
narshu 1:cc2a9eb0bd55 182 */
narshu 1:cc2a9eb0bd55 183 #define TVMET_DECLARE_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 184 template<class E1, class E2, std::size_t Sz> \
narshu 1:cc2a9eb0bd55 185 inline \
narshu 1:cc2a9eb0bd55 186 XprVector< \
narshu 1:cc2a9eb0bd55 187 XprBinOp< \
narshu 1:cc2a9eb0bd55 188 Fcnl_##NAME<typename E1::value_type, typename E2::value_type>, \
narshu 1:cc2a9eb0bd55 189 XprVector<E1, Sz>, \
narshu 1:cc2a9eb0bd55 190 XprVector<E2, Sz> \
narshu 1:cc2a9eb0bd55 191 >, \
narshu 1:cc2a9eb0bd55 192 Sz \
narshu 1:cc2a9eb0bd55 193 > \
narshu 1:cc2a9eb0bd55 194 operator OP (const XprVector<E1, Sz>& lhs, \
narshu 1:cc2a9eb0bd55 195 const XprVector<E2, Sz>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 1:cc2a9eb0bd55 196
narshu 1:cc2a9eb0bd55 197 // integer operators only, e.g used on double you wil get an error
narshu 1:cc2a9eb0bd55 198 namespace element_wise {
narshu 1:cc2a9eb0bd55 199 TVMET_DECLARE_MACRO(mod, %)
narshu 1:cc2a9eb0bd55 200 TVMET_DECLARE_MACRO(bitxor, ^)
narshu 1:cc2a9eb0bd55 201 TVMET_DECLARE_MACRO(bitand, &)
narshu 1:cc2a9eb0bd55 202 TVMET_DECLARE_MACRO(bitor, |)
narshu 1:cc2a9eb0bd55 203 TVMET_DECLARE_MACRO(shl, <<)
narshu 1:cc2a9eb0bd55 204 TVMET_DECLARE_MACRO(shr, >>)
narshu 1:cc2a9eb0bd55 205 }
narshu 1:cc2a9eb0bd55 206
narshu 1:cc2a9eb0bd55 207 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 208 TVMET_DECLARE_MACRO(greater, >)
narshu 1:cc2a9eb0bd55 209 TVMET_DECLARE_MACRO(less, <)
narshu 1:cc2a9eb0bd55 210 TVMET_DECLARE_MACRO(greater_eq, >=)
narshu 1:cc2a9eb0bd55 211 TVMET_DECLARE_MACRO(less_eq, <=)
narshu 1:cc2a9eb0bd55 212 TVMET_DECLARE_MACRO(eq, ==)
narshu 1:cc2a9eb0bd55 213 TVMET_DECLARE_MACRO(not_eq, !=)
narshu 1:cc2a9eb0bd55 214 TVMET_DECLARE_MACRO(and, &&)
narshu 1:cc2a9eb0bd55 215 TVMET_DECLARE_MACRO(or, ||)
narshu 1:cc2a9eb0bd55 216
narshu 1:cc2a9eb0bd55 217 #undef TVMET_DECLARE_MACRO
narshu 1:cc2a9eb0bd55 218
narshu 1:cc2a9eb0bd55 219
narshu 1:cc2a9eb0bd55 220 /*
narshu 1:cc2a9eb0bd55 221 * operator(Vector<T, Sz>, POD)
narshu 1:cc2a9eb0bd55 222 * operator(POD, Vector<T, Sz>)
narshu 1:cc2a9eb0bd55 223 * Note: operations are per se element_wise
narshu 1:cc2a9eb0bd55 224 */
narshu 1:cc2a9eb0bd55 225 #define TVMET_DECLARE_MACRO(NAME, OP, TP) \
narshu 1:cc2a9eb0bd55 226 template<class E, std::size_t Sz> \
narshu 1:cc2a9eb0bd55 227 inline \
narshu 1:cc2a9eb0bd55 228 XprVector< \
narshu 1:cc2a9eb0bd55 229 XprBinOp< \
narshu 1:cc2a9eb0bd55 230 Fcnl_##NAME<typename E::value_type, TP >, \
narshu 1:cc2a9eb0bd55 231 XprVector<E, Sz>, \
narshu 1:cc2a9eb0bd55 232 XprLiteral< TP > \
narshu 1:cc2a9eb0bd55 233 >, \
narshu 1:cc2a9eb0bd55 234 Sz \
narshu 1:cc2a9eb0bd55 235 > \
narshu 1:cc2a9eb0bd55 236 operator OP (const XprVector<E, Sz>& lhs, \
narshu 1:cc2a9eb0bd55 237 TP rhs) TVMET_CXX_ALWAYS_INLINE; \
narshu 1:cc2a9eb0bd55 238 \
narshu 1:cc2a9eb0bd55 239 template<class E, std::size_t Sz> \
narshu 1:cc2a9eb0bd55 240 inline \
narshu 1:cc2a9eb0bd55 241 XprVector< \
narshu 1:cc2a9eb0bd55 242 XprBinOp< \
narshu 1:cc2a9eb0bd55 243 Fcnl_##NAME<TP, typename E::value_type>, \
narshu 1:cc2a9eb0bd55 244 XprLiteral< TP >, \
narshu 1:cc2a9eb0bd55 245 XprVector<E, Sz> \
narshu 1:cc2a9eb0bd55 246 >, \
narshu 1:cc2a9eb0bd55 247 Sz \
narshu 1:cc2a9eb0bd55 248 > \
narshu 1:cc2a9eb0bd55 249 operator OP (TP lhs, \
narshu 1:cc2a9eb0bd55 250 const XprVector<E, Sz>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 1:cc2a9eb0bd55 251
narshu 1:cc2a9eb0bd55 252 // integer operators only, e.g used on double you wil get an error
narshu 1:cc2a9eb0bd55 253 namespace element_wise {
narshu 1:cc2a9eb0bd55 254 TVMET_DECLARE_MACRO(mod, %, int)
narshu 1:cc2a9eb0bd55 255 TVMET_DECLARE_MACRO(bitxor, ^, int)
narshu 1:cc2a9eb0bd55 256 TVMET_DECLARE_MACRO(bitand, &, int)
narshu 1:cc2a9eb0bd55 257 TVMET_DECLARE_MACRO(bitor, |, int)
narshu 1:cc2a9eb0bd55 258 TVMET_DECLARE_MACRO(shl, <<, int)
narshu 1:cc2a9eb0bd55 259 TVMET_DECLARE_MACRO(shr, >>, int)
narshu 1:cc2a9eb0bd55 260 }
narshu 1:cc2a9eb0bd55 261
narshu 1:cc2a9eb0bd55 262 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 263 TVMET_DECLARE_MACRO(greater, >, int)
narshu 1:cc2a9eb0bd55 264 TVMET_DECLARE_MACRO(less, <, int)
narshu 1:cc2a9eb0bd55 265 TVMET_DECLARE_MACRO(greater_eq, >=, int)
narshu 1:cc2a9eb0bd55 266 TVMET_DECLARE_MACRO(less_eq, <=, int)
narshu 1:cc2a9eb0bd55 267 TVMET_DECLARE_MACRO(eq, ==, int)
narshu 1:cc2a9eb0bd55 268 TVMET_DECLARE_MACRO(not_eq, !=, int)
narshu 1:cc2a9eb0bd55 269 TVMET_DECLARE_MACRO(and, &&, int)
narshu 1:cc2a9eb0bd55 270 TVMET_DECLARE_MACRO(or, ||, int)
narshu 1:cc2a9eb0bd55 271
narshu 1:cc2a9eb0bd55 272
narshu 1:cc2a9eb0bd55 273 #if defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 274 // integer operators only
narshu 1:cc2a9eb0bd55 275 namespace element_wise {
narshu 1:cc2a9eb0bd55 276 TVMET_DECLARE_MACRO(mod, %, long long int)
narshu 1:cc2a9eb0bd55 277 TVMET_DECLARE_MACRO(bitxor, ^, long long int)
narshu 1:cc2a9eb0bd55 278 TVMET_DECLARE_MACRO(bitand, &, long long int)
narshu 1:cc2a9eb0bd55 279 TVMET_DECLARE_MACRO(bitor, |, long long int)
narshu 1:cc2a9eb0bd55 280 TVMET_DECLARE_MACRO(shl, <<, long long int)
narshu 1:cc2a9eb0bd55 281 TVMET_DECLARE_MACRO(shr, >>, long long int)
narshu 1:cc2a9eb0bd55 282 }
narshu 1:cc2a9eb0bd55 283
narshu 1:cc2a9eb0bd55 284 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 285 TVMET_DECLARE_MACRO(greater, >, long long int)
narshu 1:cc2a9eb0bd55 286 TVMET_DECLARE_MACRO(less, <, long long int)
narshu 1:cc2a9eb0bd55 287 TVMET_DECLARE_MACRO(greater_eq, >=, long long int)
narshu 1:cc2a9eb0bd55 288 TVMET_DECLARE_MACRO(less_eq, <=, long long int)
narshu 1:cc2a9eb0bd55 289 TVMET_DECLARE_MACRO(eq, ==, long long int)
narshu 1:cc2a9eb0bd55 290 TVMET_DECLARE_MACRO(not_eq, !=, long long int)
narshu 1:cc2a9eb0bd55 291 TVMET_DECLARE_MACRO(and, &&, long long int)
narshu 1:cc2a9eb0bd55 292 TVMET_DECLARE_MACRO(or, ||, long long int)
narshu 1:cc2a9eb0bd55 293 #endif // defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 294
narshu 1:cc2a9eb0bd55 295 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 296 TVMET_DECLARE_MACRO(greater, >, float)
narshu 1:cc2a9eb0bd55 297 TVMET_DECLARE_MACRO(less, <, float)
narshu 1:cc2a9eb0bd55 298 TVMET_DECLARE_MACRO(greater_eq, >=, float)
narshu 1:cc2a9eb0bd55 299 TVMET_DECLARE_MACRO(less_eq, <=, float)
narshu 1:cc2a9eb0bd55 300 TVMET_DECLARE_MACRO(eq, ==, float)
narshu 1:cc2a9eb0bd55 301 TVMET_DECLARE_MACRO(not_eq, !=, float)
narshu 1:cc2a9eb0bd55 302
narshu 1:cc2a9eb0bd55 303 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 304 TVMET_DECLARE_MACRO(greater, >, double)
narshu 1:cc2a9eb0bd55 305 TVMET_DECLARE_MACRO(less, <, double)
narshu 1:cc2a9eb0bd55 306 TVMET_DECLARE_MACRO(greater_eq, >=, double)
narshu 1:cc2a9eb0bd55 307 TVMET_DECLARE_MACRO(less_eq, <=, double)
narshu 1:cc2a9eb0bd55 308 TVMET_DECLARE_MACRO(eq, ==, double)
narshu 1:cc2a9eb0bd55 309 TVMET_DECLARE_MACRO(not_eq, !=, double)
narshu 1:cc2a9eb0bd55 310
narshu 1:cc2a9eb0bd55 311 #if defined(TVMET_HAVE_LONG_DOUBLE)
narshu 1:cc2a9eb0bd55 312 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 313 TVMET_DECLARE_MACRO(greater, >, long double)
narshu 1:cc2a9eb0bd55 314 TVMET_DECLARE_MACRO(less, <, long double)
narshu 1:cc2a9eb0bd55 315 TVMET_DECLARE_MACRO(greater_eq, >=, long double)
narshu 1:cc2a9eb0bd55 316 TVMET_DECLARE_MACRO(less_eq, <=, long double)
narshu 1:cc2a9eb0bd55 317 TVMET_DECLARE_MACRO(eq, ==, long double)
narshu 1:cc2a9eb0bd55 318 TVMET_DECLARE_MACRO(not_eq, !=, long double)
narshu 1:cc2a9eb0bd55 319 #endif // defined(TVMET_HAVE_LONG_DOUBLE)
narshu 1:cc2a9eb0bd55 320
narshu 1:cc2a9eb0bd55 321 #undef TVMET_DECLARE_MACRO
narshu 1:cc2a9eb0bd55 322
narshu 1:cc2a9eb0bd55 323
narshu 1:cc2a9eb0bd55 324 #if defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 325 /*
narshu 1:cc2a9eb0bd55 326 * operator(Vector<std::complex<T>, Sz>, std::complex<T>)
narshu 1:cc2a9eb0bd55 327 * operator(std::complex<T>, Vector<std::complex<T>, Sz>)
narshu 1:cc2a9eb0bd55 328 * Note: - per se element wise
narshu 1:cc2a9eb0bd55 329 * - bit ops on complex<int> doesn't make sense, stay away
narshu 1:cc2a9eb0bd55 330 * \todo type promotion
narshu 1:cc2a9eb0bd55 331 */
narshu 1:cc2a9eb0bd55 332 #define TVMET_DECLARE_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 333 template<class E, std::size_t Sz, class T> \
narshu 1:cc2a9eb0bd55 334 inline \
narshu 1:cc2a9eb0bd55 335 XprVector< \
narshu 1:cc2a9eb0bd55 336 XprBinOp< \
narshu 1:cc2a9eb0bd55 337 Fcnl_##NAME<typename E::value_type, std::complex<T> >, \
narshu 1:cc2a9eb0bd55 338 XprVector<E, Sz>, \
narshu 1:cc2a9eb0bd55 339 XprLiteral< std::complex<T> > \
narshu 1:cc2a9eb0bd55 340 >, \
narshu 1:cc2a9eb0bd55 341 Sz \
narshu 1:cc2a9eb0bd55 342 > \
narshu 1:cc2a9eb0bd55 343 operator OP (const XprVector<E, Sz>& lhs, \
narshu 1:cc2a9eb0bd55 344 const std::complex<T>& rhs) TVMET_CXX_ALWAYS_INLINE; \
narshu 1:cc2a9eb0bd55 345 \
narshu 1:cc2a9eb0bd55 346 template<class E, std::size_t Sz, class T> \
narshu 1:cc2a9eb0bd55 347 inline \
narshu 1:cc2a9eb0bd55 348 XprVector< \
narshu 1:cc2a9eb0bd55 349 XprBinOp< \
narshu 1:cc2a9eb0bd55 350 Fcnl_##NAME<std::complex<T>, typename E::value_type>, \
narshu 1:cc2a9eb0bd55 351 XprLiteral< std::complex<T> >, \
narshu 1:cc2a9eb0bd55 352 XprVector<E, Sz> \
narshu 1:cc2a9eb0bd55 353 >, \
narshu 1:cc2a9eb0bd55 354 Sz \
narshu 1:cc2a9eb0bd55 355 > \
narshu 1:cc2a9eb0bd55 356 operator OP (const std::complex<T>& lhs, \
narshu 1:cc2a9eb0bd55 357 const XprVector<E, Sz>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 1:cc2a9eb0bd55 358
narshu 1:cc2a9eb0bd55 359 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 360 TVMET_DECLARE_MACRO(greater, >)
narshu 1:cc2a9eb0bd55 361 TVMET_DECLARE_MACRO(less, <)
narshu 1:cc2a9eb0bd55 362 TVMET_DECLARE_MACRO(greater_eq, >=)
narshu 1:cc2a9eb0bd55 363 TVMET_DECLARE_MACRO(less_eq, <=)
narshu 1:cc2a9eb0bd55 364 TVMET_DECLARE_MACRO(eq, ==)
narshu 1:cc2a9eb0bd55 365 TVMET_DECLARE_MACRO(not_eq, !=)
narshu 1:cc2a9eb0bd55 366 TVMET_DECLARE_MACRO(and, &&)
narshu 1:cc2a9eb0bd55 367 TVMET_DECLARE_MACRO(or, ||)
narshu 1:cc2a9eb0bd55 368
narshu 1:cc2a9eb0bd55 369 #undef TVMET_DECLARE_MACRO
narshu 1:cc2a9eb0bd55 370
narshu 1:cc2a9eb0bd55 371 #endif // defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 372
narshu 1:cc2a9eb0bd55 373
narshu 1:cc2a9eb0bd55 374 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 1:cc2a9eb0bd55 375 * global unary operators
narshu 1:cc2a9eb0bd55 376 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 1:cc2a9eb0bd55 377
narshu 1:cc2a9eb0bd55 378
narshu 1:cc2a9eb0bd55 379 /*
narshu 1:cc2a9eb0bd55 380 * Unary Operator on XprVector<E, Sz>
narshu 1:cc2a9eb0bd55 381 */
narshu 1:cc2a9eb0bd55 382 #define TVMET_DECLARE_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 383 template <class E, std::size_t Sz> \
narshu 1:cc2a9eb0bd55 384 inline \
narshu 1:cc2a9eb0bd55 385 XprVector< \
narshu 1:cc2a9eb0bd55 386 XprUnOp< \
narshu 1:cc2a9eb0bd55 387 Fcnl_##NAME<typename E::value_type>, \
narshu 1:cc2a9eb0bd55 388 XprVector<E, Sz> \
narshu 1:cc2a9eb0bd55 389 >, \
narshu 1:cc2a9eb0bd55 390 Sz \
narshu 1:cc2a9eb0bd55 391 > \
narshu 1:cc2a9eb0bd55 392 operator OP (const XprVector<E, Sz>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 1:cc2a9eb0bd55 393
narshu 1:cc2a9eb0bd55 394 TVMET_DECLARE_MACRO(not, !)
narshu 1:cc2a9eb0bd55 395 TVMET_DECLARE_MACRO(compl, ~)
narshu 1:cc2a9eb0bd55 396 TVMET_DECLARE_MACRO(neg, -)
narshu 1:cc2a9eb0bd55 397
narshu 1:cc2a9eb0bd55 398 #undef TVMET_DECLARE_MACRO
narshu 1:cc2a9eb0bd55 399
narshu 1:cc2a9eb0bd55 400
narshu 1:cc2a9eb0bd55 401 /*********************************************************
narshu 1:cc2a9eb0bd55 402 * PART II: IMPLEMENTATION
narshu 1:cc2a9eb0bd55 403 *********************************************************/
narshu 1:cc2a9eb0bd55 404
narshu 1:cc2a9eb0bd55 405
narshu 1:cc2a9eb0bd55 406 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 1:cc2a9eb0bd55 407 * Vector arithmetic operators implemented by functions
narshu 1:cc2a9eb0bd55 408 * add, sub, mul and div
narshu 1:cc2a9eb0bd55 409 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 1:cc2a9eb0bd55 410
narshu 1:cc2a9eb0bd55 411
narshu 1:cc2a9eb0bd55 412 /*
narshu 1:cc2a9eb0bd55 413 * operator(XprVector<E1, Sz>, XprVector<E2, Sz>)
narshu 1:cc2a9eb0bd55 414 */
narshu 1:cc2a9eb0bd55 415 #define TVMET_IMPLEMENT_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 416 template<class E1, class E2, std::size_t Sz> \
narshu 1:cc2a9eb0bd55 417 inline \
narshu 1:cc2a9eb0bd55 418 XprVector< \
narshu 1:cc2a9eb0bd55 419 XprBinOp< \
narshu 1:cc2a9eb0bd55 420 Fcnl_##NAME<typename E1::value_type, typename E2::value_type>, \
narshu 1:cc2a9eb0bd55 421 XprVector<E1, Sz>, \
narshu 1:cc2a9eb0bd55 422 XprVector<E2, Sz> \
narshu 1:cc2a9eb0bd55 423 >, \
narshu 1:cc2a9eb0bd55 424 Sz \
narshu 1:cc2a9eb0bd55 425 > \
narshu 1:cc2a9eb0bd55 426 operator OP (const XprVector<E1, Sz>& lhs, \
narshu 1:cc2a9eb0bd55 427 const XprVector<E2, Sz>& rhs) { \
narshu 1:cc2a9eb0bd55 428 return NAME (lhs, rhs); \
narshu 1:cc2a9eb0bd55 429 }
narshu 1:cc2a9eb0bd55 430
narshu 1:cc2a9eb0bd55 431 TVMET_IMPLEMENT_MACRO(add, +) // per se element wise
narshu 1:cc2a9eb0bd55 432 TVMET_IMPLEMENT_MACRO(sub, -) // per se element wise
narshu 1:cc2a9eb0bd55 433 TVMET_IMPLEMENT_MACRO(mul, *) // per se element wise
narshu 1:cc2a9eb0bd55 434 namespace element_wise {
narshu 1:cc2a9eb0bd55 435 TVMET_IMPLEMENT_MACRO(div, /) // not defined for vectors
narshu 1:cc2a9eb0bd55 436 }
narshu 1:cc2a9eb0bd55 437
narshu 1:cc2a9eb0bd55 438 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 439
narshu 1:cc2a9eb0bd55 440
narshu 1:cc2a9eb0bd55 441 /*
narshu 1:cc2a9eb0bd55 442 * operator(XprVector<E, Sz>, POD)
narshu 1:cc2a9eb0bd55 443 * operator(POD, XprVector<E, Sz>)
narshu 1:cc2a9eb0bd55 444 * Note: operations +,-,*,/ are per se element wise
narshu 1:cc2a9eb0bd55 445 */
narshu 1:cc2a9eb0bd55 446 #define TVMET_IMPLEMENT_MACRO(NAME, OP, POD) \
narshu 1:cc2a9eb0bd55 447 template<class E, std::size_t Sz> \
narshu 1:cc2a9eb0bd55 448 inline \
narshu 1:cc2a9eb0bd55 449 XprVector< \
narshu 1:cc2a9eb0bd55 450 XprBinOp< \
narshu 1:cc2a9eb0bd55 451 Fcnl_##NAME<typename E::value_type, POD >, \
narshu 1:cc2a9eb0bd55 452 XprVector<E, Sz>, \
narshu 1:cc2a9eb0bd55 453 XprLiteral< POD > \
narshu 1:cc2a9eb0bd55 454 >, \
narshu 1:cc2a9eb0bd55 455 Sz \
narshu 1:cc2a9eb0bd55 456 > \
narshu 1:cc2a9eb0bd55 457 operator OP (const XprVector<E, Sz>& lhs, POD rhs) { \
narshu 1:cc2a9eb0bd55 458 return NAME (lhs, rhs); \
narshu 1:cc2a9eb0bd55 459 } \
narshu 1:cc2a9eb0bd55 460 \
narshu 1:cc2a9eb0bd55 461 template<class E, std::size_t Sz> \
narshu 1:cc2a9eb0bd55 462 inline \
narshu 1:cc2a9eb0bd55 463 XprVector< \
narshu 1:cc2a9eb0bd55 464 XprBinOp< \
narshu 1:cc2a9eb0bd55 465 Fcnl_##NAME< POD, typename E::value_type >, \
narshu 1:cc2a9eb0bd55 466 XprLiteral< POD >, \
narshu 1:cc2a9eb0bd55 467 XprVector< E, Sz> \
narshu 1:cc2a9eb0bd55 468 >, \
narshu 1:cc2a9eb0bd55 469 Sz \
narshu 1:cc2a9eb0bd55 470 > \
narshu 1:cc2a9eb0bd55 471 operator OP (POD lhs, const XprVector<E, Sz>& rhs) { \
narshu 1:cc2a9eb0bd55 472 return NAME (lhs, rhs); \
narshu 1:cc2a9eb0bd55 473 }
narshu 1:cc2a9eb0bd55 474
narshu 1:cc2a9eb0bd55 475 TVMET_IMPLEMENT_MACRO(add, +, int)
narshu 1:cc2a9eb0bd55 476 TVMET_IMPLEMENT_MACRO(sub, -, int)
narshu 1:cc2a9eb0bd55 477 TVMET_IMPLEMENT_MACRO(mul, *, int)
narshu 1:cc2a9eb0bd55 478 TVMET_IMPLEMENT_MACRO(div, /, int)
narshu 1:cc2a9eb0bd55 479
narshu 1:cc2a9eb0bd55 480 #if defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 481 TVMET_IMPLEMENT_MACRO(add, +, long long int)
narshu 1:cc2a9eb0bd55 482 TVMET_IMPLEMENT_MACRO(sub, -, long long int)
narshu 1:cc2a9eb0bd55 483 TVMET_IMPLEMENT_MACRO(mul, *, long long int)
narshu 1:cc2a9eb0bd55 484 TVMET_IMPLEMENT_MACRO(div, /, long long int)
narshu 1:cc2a9eb0bd55 485 #endif
narshu 1:cc2a9eb0bd55 486
narshu 1:cc2a9eb0bd55 487 TVMET_IMPLEMENT_MACRO(add, +, float)
narshu 1:cc2a9eb0bd55 488 TVMET_IMPLEMENT_MACRO(sub, -, float)
narshu 1:cc2a9eb0bd55 489 TVMET_IMPLEMENT_MACRO(mul, *, float)
narshu 1:cc2a9eb0bd55 490 TVMET_IMPLEMENT_MACRO(div, /, float)
narshu 1:cc2a9eb0bd55 491
narshu 1:cc2a9eb0bd55 492 TVMET_IMPLEMENT_MACRO(add, +, double)
narshu 1:cc2a9eb0bd55 493 TVMET_IMPLEMENT_MACRO(sub, -, double)
narshu 1:cc2a9eb0bd55 494 TVMET_IMPLEMENT_MACRO(mul, *, double)
narshu 1:cc2a9eb0bd55 495 TVMET_IMPLEMENT_MACRO(div, /, double)
narshu 1:cc2a9eb0bd55 496
narshu 1:cc2a9eb0bd55 497 #if defined(TVMET_HAVE_LONG_DOUBLE)
narshu 1:cc2a9eb0bd55 498 TVMET_IMPLEMENT_MACRO(add, +, long double)
narshu 1:cc2a9eb0bd55 499 TVMET_IMPLEMENT_MACRO(sub, -, long double)
narshu 1:cc2a9eb0bd55 500 TVMET_IMPLEMENT_MACRO(mul, *, long double)
narshu 1:cc2a9eb0bd55 501 TVMET_IMPLEMENT_MACRO(div, /, long double)
narshu 1:cc2a9eb0bd55 502 #endif
narshu 1:cc2a9eb0bd55 503
narshu 1:cc2a9eb0bd55 504 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 505
narshu 1:cc2a9eb0bd55 506
narshu 1:cc2a9eb0bd55 507 #if defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 508 /*
narshu 1:cc2a9eb0bd55 509 * operator(XprVector<E, Sz>, complex<T>)
narshu 1:cc2a9eb0bd55 510 * operator(complex<T>, XprVector<E, Sz>)
narshu 1:cc2a9eb0bd55 511 * Note: operations +,-,*,/ are per se element wise
narshu 1:cc2a9eb0bd55 512 */
narshu 1:cc2a9eb0bd55 513 #define TVMET_IMPLEMENT_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 514 template<class E, std::size_t Sz, class T> \
narshu 1:cc2a9eb0bd55 515 inline \
narshu 1:cc2a9eb0bd55 516 XprVector< \
narshu 1:cc2a9eb0bd55 517 XprBinOp< \
narshu 1:cc2a9eb0bd55 518 Fcnl_##NAME<typename E::value_type, std::complex<T> >, \
narshu 1:cc2a9eb0bd55 519 XprVector<E, Sz>, \
narshu 1:cc2a9eb0bd55 520 XprLiteral< std::complex<T> > \
narshu 1:cc2a9eb0bd55 521 >, \
narshu 1:cc2a9eb0bd55 522 Sz \
narshu 1:cc2a9eb0bd55 523 > \
narshu 1:cc2a9eb0bd55 524 operator OP (const XprVector<E, Sz>& lhs, \
narshu 1:cc2a9eb0bd55 525 const std::complex<T>& rhs) { \
narshu 1:cc2a9eb0bd55 526 return NAME (lhs, rhs); \
narshu 1:cc2a9eb0bd55 527 } \
narshu 1:cc2a9eb0bd55 528 \
narshu 1:cc2a9eb0bd55 529 template<class E, std::size_t Sz, class T> \
narshu 1:cc2a9eb0bd55 530 inline \
narshu 1:cc2a9eb0bd55 531 XprVector< \
narshu 1:cc2a9eb0bd55 532 XprBinOp< \
narshu 1:cc2a9eb0bd55 533 Fcnl_##NAME< std::complex<T>, typename E::value_type >, \
narshu 1:cc2a9eb0bd55 534 XprLiteral< std::complex<T> >, \
narshu 1:cc2a9eb0bd55 535 XprVector< E, Sz> \
narshu 1:cc2a9eb0bd55 536 >, \
narshu 1:cc2a9eb0bd55 537 Sz \
narshu 1:cc2a9eb0bd55 538 > \
narshu 1:cc2a9eb0bd55 539 operator OP (const std::complex<T>& lhs, \
narshu 1:cc2a9eb0bd55 540 const XprVector<E, Sz>& rhs) { \
narshu 1:cc2a9eb0bd55 541 return NAME (lhs, rhs); \
narshu 1:cc2a9eb0bd55 542 }
narshu 1:cc2a9eb0bd55 543
narshu 1:cc2a9eb0bd55 544 TVMET_IMPLEMENT_MACRO(add, +) // per se element wise
narshu 1:cc2a9eb0bd55 545 TVMET_IMPLEMENT_MACRO(sub, -) // per se element wise
narshu 1:cc2a9eb0bd55 546 TVMET_IMPLEMENT_MACRO(mul, *) // per se element wise
narshu 1:cc2a9eb0bd55 547 TVMET_IMPLEMENT_MACRO(div, /) // per se element wise
narshu 1:cc2a9eb0bd55 548
narshu 1:cc2a9eb0bd55 549 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 550
narshu 1:cc2a9eb0bd55 551 #endif // defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 552
narshu 1:cc2a9eb0bd55 553
narshu 1:cc2a9eb0bd55 554 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 1:cc2a9eb0bd55 555 * Vector integer and compare operators
narshu 1:cc2a9eb0bd55 556 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 1:cc2a9eb0bd55 557
narshu 1:cc2a9eb0bd55 558
narshu 1:cc2a9eb0bd55 559 /*
narshu 1:cc2a9eb0bd55 560 * operator(XprVector, XprVector)
narshu 1:cc2a9eb0bd55 561 */
narshu 1:cc2a9eb0bd55 562 #define TVMET_IMPLEMENT_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 563 template<class E1, class E2, std::size_t Sz> \
narshu 1:cc2a9eb0bd55 564 inline \
narshu 1:cc2a9eb0bd55 565 XprVector< \
narshu 1:cc2a9eb0bd55 566 XprBinOp< \
narshu 1:cc2a9eb0bd55 567 Fcnl_##NAME<typename E1::value_type, typename E2::value_type>, \
narshu 1:cc2a9eb0bd55 568 XprVector<E1, Sz>, \
narshu 1:cc2a9eb0bd55 569 XprVector<E2, Sz> \
narshu 1:cc2a9eb0bd55 570 >, \
narshu 1:cc2a9eb0bd55 571 Sz \
narshu 1:cc2a9eb0bd55 572 > \
narshu 1:cc2a9eb0bd55 573 operator OP (const XprVector<E1, Sz>& lhs, \
narshu 1:cc2a9eb0bd55 574 const XprVector<E2, Sz>& rhs) { \
narshu 1:cc2a9eb0bd55 575 typedef XprBinOp< \
narshu 1:cc2a9eb0bd55 576 Fcnl_##NAME<typename E1::value_type, typename E2::value_type>, \
narshu 1:cc2a9eb0bd55 577 XprVector<E1, Sz>, \
narshu 1:cc2a9eb0bd55 578 XprVector<E2, Sz> \
narshu 1:cc2a9eb0bd55 579 > expr_type; \
narshu 1:cc2a9eb0bd55 580 return XprVector<expr_type, Sz>(expr_type(lhs, rhs)); \
narshu 1:cc2a9eb0bd55 581 }
narshu 1:cc2a9eb0bd55 582
narshu 1:cc2a9eb0bd55 583 // integer operators only, e.g used on double you wil get an error
narshu 1:cc2a9eb0bd55 584 namespace element_wise {
narshu 1:cc2a9eb0bd55 585 TVMET_IMPLEMENT_MACRO(mod, %)
narshu 1:cc2a9eb0bd55 586 TVMET_IMPLEMENT_MACRO(bitxor, ^)
narshu 1:cc2a9eb0bd55 587 TVMET_IMPLEMENT_MACRO(bitand, &)
narshu 1:cc2a9eb0bd55 588 TVMET_IMPLEMENT_MACRO(bitor, |)
narshu 1:cc2a9eb0bd55 589 TVMET_IMPLEMENT_MACRO(shl, <<)
narshu 1:cc2a9eb0bd55 590 TVMET_IMPLEMENT_MACRO(shr, >>)
narshu 1:cc2a9eb0bd55 591 }
narshu 1:cc2a9eb0bd55 592
narshu 1:cc2a9eb0bd55 593 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 594 TVMET_IMPLEMENT_MACRO(greater, >)
narshu 1:cc2a9eb0bd55 595 TVMET_IMPLEMENT_MACRO(less, <)
narshu 1:cc2a9eb0bd55 596 TVMET_IMPLEMENT_MACRO(greater_eq, >=)
narshu 1:cc2a9eb0bd55 597 TVMET_IMPLEMENT_MACRO(less_eq, <=)
narshu 1:cc2a9eb0bd55 598 TVMET_IMPLEMENT_MACRO(eq, ==)
narshu 1:cc2a9eb0bd55 599 TVMET_IMPLEMENT_MACRO(not_eq, !=)
narshu 1:cc2a9eb0bd55 600 TVMET_IMPLEMENT_MACRO(and, &&)
narshu 1:cc2a9eb0bd55 601 TVMET_IMPLEMENT_MACRO(or, ||)
narshu 1:cc2a9eb0bd55 602
narshu 1:cc2a9eb0bd55 603 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 604
narshu 1:cc2a9eb0bd55 605
narshu 1:cc2a9eb0bd55 606 /*
narshu 1:cc2a9eb0bd55 607 * operator(Vector<T, Sz>, POD)
narshu 1:cc2a9eb0bd55 608 * operator(POD, Vector<T, Sz>)
narshu 1:cc2a9eb0bd55 609 * Note: operations are per se element_wise
narshu 1:cc2a9eb0bd55 610 */
narshu 1:cc2a9eb0bd55 611 #define TVMET_IMPLEMENT_MACRO(NAME, OP, TP) \
narshu 1:cc2a9eb0bd55 612 template<class E, std::size_t Sz> \
narshu 1:cc2a9eb0bd55 613 inline \
narshu 1:cc2a9eb0bd55 614 XprVector< \
narshu 1:cc2a9eb0bd55 615 XprBinOp< \
narshu 1:cc2a9eb0bd55 616 Fcnl_##NAME<typename E::value_type, TP >, \
narshu 1:cc2a9eb0bd55 617 XprVector<E, Sz>, \
narshu 1:cc2a9eb0bd55 618 XprLiteral< TP > \
narshu 1:cc2a9eb0bd55 619 >, \
narshu 1:cc2a9eb0bd55 620 Sz \
narshu 1:cc2a9eb0bd55 621 > \
narshu 1:cc2a9eb0bd55 622 operator OP (const XprVector<E, Sz>& lhs, TP rhs) { \
narshu 1:cc2a9eb0bd55 623 typedef XprBinOp< \
narshu 1:cc2a9eb0bd55 624 Fcnl_##NAME<typename E::value_type, TP >, \
narshu 1:cc2a9eb0bd55 625 XprVector<E, Sz>, \
narshu 1:cc2a9eb0bd55 626 XprLiteral< TP > \
narshu 1:cc2a9eb0bd55 627 > expr_type; \
narshu 1:cc2a9eb0bd55 628 return XprVector<expr_type, Sz>( \
narshu 1:cc2a9eb0bd55 629 expr_type(lhs, XprLiteral< TP >(rhs))); \
narshu 1:cc2a9eb0bd55 630 } \
narshu 1:cc2a9eb0bd55 631 \
narshu 1:cc2a9eb0bd55 632 template<class E, std::size_t Sz> \
narshu 1:cc2a9eb0bd55 633 inline \
narshu 1:cc2a9eb0bd55 634 XprVector< \
narshu 1:cc2a9eb0bd55 635 XprBinOp< \
narshu 1:cc2a9eb0bd55 636 Fcnl_##NAME<TP, typename E::value_type>, \
narshu 1:cc2a9eb0bd55 637 XprLiteral< TP >, \
narshu 1:cc2a9eb0bd55 638 XprVector<E, Sz> \
narshu 1:cc2a9eb0bd55 639 >, \
narshu 1:cc2a9eb0bd55 640 Sz \
narshu 1:cc2a9eb0bd55 641 > \
narshu 1:cc2a9eb0bd55 642 operator OP (TP lhs, const XprVector<E, Sz>& rhs) { \
narshu 1:cc2a9eb0bd55 643 typedef XprBinOp< \
narshu 1:cc2a9eb0bd55 644 Fcnl_##NAME< TP, typename E::value_type>, \
narshu 1:cc2a9eb0bd55 645 XprLiteral< TP >, \
narshu 1:cc2a9eb0bd55 646 XprVector<E, Sz> \
narshu 1:cc2a9eb0bd55 647 > expr_type; \
narshu 1:cc2a9eb0bd55 648 return XprVector<expr_type, Sz>( \
narshu 1:cc2a9eb0bd55 649 expr_type(XprLiteral< TP >(lhs), rhs)); \
narshu 1:cc2a9eb0bd55 650 }
narshu 1:cc2a9eb0bd55 651
narshu 1:cc2a9eb0bd55 652 // integer operators only, e.g used on double you wil get an error
narshu 1:cc2a9eb0bd55 653 namespace element_wise {
narshu 1:cc2a9eb0bd55 654 TVMET_IMPLEMENT_MACRO(mod, %, int)
narshu 1:cc2a9eb0bd55 655 TVMET_IMPLEMENT_MACRO(bitxor, ^, int)
narshu 1:cc2a9eb0bd55 656 TVMET_IMPLEMENT_MACRO(bitand, &, int)
narshu 1:cc2a9eb0bd55 657 TVMET_IMPLEMENT_MACRO(bitor, |, int)
narshu 1:cc2a9eb0bd55 658 TVMET_IMPLEMENT_MACRO(shl, <<, int)
narshu 1:cc2a9eb0bd55 659 TVMET_IMPLEMENT_MACRO(shr, >>, int)
narshu 1:cc2a9eb0bd55 660 }
narshu 1:cc2a9eb0bd55 661
narshu 1:cc2a9eb0bd55 662 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 663 TVMET_IMPLEMENT_MACRO(greater, >, int)
narshu 1:cc2a9eb0bd55 664 TVMET_IMPLEMENT_MACRO(less, <, int)
narshu 1:cc2a9eb0bd55 665 TVMET_IMPLEMENT_MACRO(greater_eq, >=, int)
narshu 1:cc2a9eb0bd55 666 TVMET_IMPLEMENT_MACRO(less_eq, <=, int)
narshu 1:cc2a9eb0bd55 667 TVMET_IMPLEMENT_MACRO(eq, ==, int)
narshu 1:cc2a9eb0bd55 668 TVMET_IMPLEMENT_MACRO(not_eq, !=, int)
narshu 1:cc2a9eb0bd55 669 TVMET_IMPLEMENT_MACRO(and, &&, int)
narshu 1:cc2a9eb0bd55 670 TVMET_IMPLEMENT_MACRO(or, ||, int)
narshu 1:cc2a9eb0bd55 671
narshu 1:cc2a9eb0bd55 672
narshu 1:cc2a9eb0bd55 673 #if defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 674 // integer operators only
narshu 1:cc2a9eb0bd55 675 namespace element_wise {
narshu 1:cc2a9eb0bd55 676 TVMET_IMPLEMENT_MACRO(mod, %, long long int)
narshu 1:cc2a9eb0bd55 677 TVMET_IMPLEMENT_MACRO(bitxor, ^, long long int)
narshu 1:cc2a9eb0bd55 678 TVMET_IMPLEMENT_MACRO(bitand, &, long long int)
narshu 1:cc2a9eb0bd55 679 TVMET_IMPLEMENT_MACRO(bitor, |, long long int)
narshu 1:cc2a9eb0bd55 680 TVMET_IMPLEMENT_MACRO(shl, <<, long long int)
narshu 1:cc2a9eb0bd55 681 TVMET_IMPLEMENT_MACRO(shr, >>, long long int)
narshu 1:cc2a9eb0bd55 682 }
narshu 1:cc2a9eb0bd55 683
narshu 1:cc2a9eb0bd55 684 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 685 TVMET_IMPLEMENT_MACRO(greater, >, long long int)
narshu 1:cc2a9eb0bd55 686 TVMET_IMPLEMENT_MACRO(less, <, long long int)
narshu 1:cc2a9eb0bd55 687 TVMET_IMPLEMENT_MACRO(greater_eq, >=, long long int)
narshu 1:cc2a9eb0bd55 688 TVMET_IMPLEMENT_MACRO(less_eq, <=, long long int)
narshu 1:cc2a9eb0bd55 689 TVMET_IMPLEMENT_MACRO(eq, ==, long long int)
narshu 1:cc2a9eb0bd55 690 TVMET_IMPLEMENT_MACRO(not_eq, !=, long long int)
narshu 1:cc2a9eb0bd55 691 TVMET_IMPLEMENT_MACRO(and, &&, long long int)
narshu 1:cc2a9eb0bd55 692 TVMET_IMPLEMENT_MACRO(or, ||, long long int)
narshu 1:cc2a9eb0bd55 693 #endif // defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 694
narshu 1:cc2a9eb0bd55 695 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 696 TVMET_IMPLEMENT_MACRO(greater, >, float)
narshu 1:cc2a9eb0bd55 697 TVMET_IMPLEMENT_MACRO(less, <, float)
narshu 1:cc2a9eb0bd55 698 TVMET_IMPLEMENT_MACRO(greater_eq, >=, float)
narshu 1:cc2a9eb0bd55 699 TVMET_IMPLEMENT_MACRO(less_eq, <=, float)
narshu 1:cc2a9eb0bd55 700 TVMET_IMPLEMENT_MACRO(eq, ==, float)
narshu 1:cc2a9eb0bd55 701 TVMET_IMPLEMENT_MACRO(not_eq, !=, float)
narshu 1:cc2a9eb0bd55 702
narshu 1:cc2a9eb0bd55 703 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 704 TVMET_IMPLEMENT_MACRO(greater, >, double)
narshu 1:cc2a9eb0bd55 705 TVMET_IMPLEMENT_MACRO(less, <, double)
narshu 1:cc2a9eb0bd55 706 TVMET_IMPLEMENT_MACRO(greater_eq, >=, double)
narshu 1:cc2a9eb0bd55 707 TVMET_IMPLEMENT_MACRO(less_eq, <=, double)
narshu 1:cc2a9eb0bd55 708 TVMET_IMPLEMENT_MACRO(eq, ==, double)
narshu 1:cc2a9eb0bd55 709 TVMET_IMPLEMENT_MACRO(not_eq, !=, double)
narshu 1:cc2a9eb0bd55 710
narshu 1:cc2a9eb0bd55 711 #if defined(TVMET_HAVE_LONG_DOUBLE)
narshu 1:cc2a9eb0bd55 712 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 713 TVMET_IMPLEMENT_MACRO(greater, >, long double)
narshu 1:cc2a9eb0bd55 714 TVMET_IMPLEMENT_MACRO(less, <, long double)
narshu 1:cc2a9eb0bd55 715 TVMET_IMPLEMENT_MACRO(greater_eq, >=, long double)
narshu 1:cc2a9eb0bd55 716 TVMET_IMPLEMENT_MACRO(less_eq, <=, long double)
narshu 1:cc2a9eb0bd55 717 TVMET_IMPLEMENT_MACRO(eq, ==, long double)
narshu 1:cc2a9eb0bd55 718 TVMET_IMPLEMENT_MACRO(not_eq, !=, long double)
narshu 1:cc2a9eb0bd55 719 #endif // defined(TVMET_HAVE_LONG_DOUBLE)
narshu 1:cc2a9eb0bd55 720
narshu 1:cc2a9eb0bd55 721 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 722
narshu 1:cc2a9eb0bd55 723
narshu 1:cc2a9eb0bd55 724 #if defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 725 /*
narshu 1:cc2a9eb0bd55 726 * operator(Vector<std::complex<T>, Sz>, std::complex<T>)
narshu 1:cc2a9eb0bd55 727 * operator(std::complex<T>, Vector<std::complex<T>, Sz>)
narshu 1:cc2a9eb0bd55 728 * Note: - per se element wise
narshu 1:cc2a9eb0bd55 729 * - bit ops on complex<int> doesn't make sense, stay away
narshu 1:cc2a9eb0bd55 730 * \todo type promotion
narshu 1:cc2a9eb0bd55 731 */
narshu 1:cc2a9eb0bd55 732 #define TVMET_IMPLEMENT_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 733 template<class E, std::size_t Sz, class T> \
narshu 1:cc2a9eb0bd55 734 inline \
narshu 1:cc2a9eb0bd55 735 XprVector< \
narshu 1:cc2a9eb0bd55 736 XprBinOp< \
narshu 1:cc2a9eb0bd55 737 Fcnl_##NAME<typename E::value_type, std::complex<T> >, \
narshu 1:cc2a9eb0bd55 738 XprVector<E, Sz>, \
narshu 1:cc2a9eb0bd55 739 XprLiteral< std::complex<T> > \
narshu 1:cc2a9eb0bd55 740 >, \
narshu 1:cc2a9eb0bd55 741 Sz \
narshu 1:cc2a9eb0bd55 742 > \
narshu 1:cc2a9eb0bd55 743 operator OP (const XprVector<E, Sz>& lhs, \
narshu 1:cc2a9eb0bd55 744 const std::complex<T>& rhs) { \
narshu 1:cc2a9eb0bd55 745 typedef XprBinOp< \
narshu 1:cc2a9eb0bd55 746 Fcnl_##NAME<typename E::value_type, std::complex<T> >, \
narshu 1:cc2a9eb0bd55 747 XprVector<E, Sz>, \
narshu 1:cc2a9eb0bd55 748 XprLiteral< std::complex<T> > \
narshu 1:cc2a9eb0bd55 749 > expr_type; \
narshu 1:cc2a9eb0bd55 750 return XprVector<expr_type, Sz>( \
narshu 1:cc2a9eb0bd55 751 expr_type(lhs, XprLiteral< std::complex<T> >(rhs))); \
narshu 1:cc2a9eb0bd55 752 } \
narshu 1:cc2a9eb0bd55 753 \
narshu 1:cc2a9eb0bd55 754 template<class E, std::size_t Sz, class T> \
narshu 1:cc2a9eb0bd55 755 inline \
narshu 1:cc2a9eb0bd55 756 XprVector< \
narshu 1:cc2a9eb0bd55 757 XprBinOp< \
narshu 1:cc2a9eb0bd55 758 Fcnl_##NAME<std::complex<T>, typename E::value_type>, \
narshu 1:cc2a9eb0bd55 759 XprLiteral< std::complex<T> >, \
narshu 1:cc2a9eb0bd55 760 XprVector<E, Sz> \
narshu 1:cc2a9eb0bd55 761 >, \
narshu 1:cc2a9eb0bd55 762 Sz \
narshu 1:cc2a9eb0bd55 763 > \
narshu 1:cc2a9eb0bd55 764 operator OP (const std::complex<T>& lhs, \
narshu 1:cc2a9eb0bd55 765 const XprVector<E, Sz>& rhs) { \
narshu 1:cc2a9eb0bd55 766 typedef XprBinOp< \
narshu 1:cc2a9eb0bd55 767 Fcnl_##NAME< std::complex<T>, typename E::value_type>, \
narshu 1:cc2a9eb0bd55 768 XprLiteral< std::complex<T> >, \
narshu 1:cc2a9eb0bd55 769 XprVector<E, Sz> \
narshu 1:cc2a9eb0bd55 770 > expr_type; \
narshu 1:cc2a9eb0bd55 771 return XprVector<expr_type, Sz>( \
narshu 1:cc2a9eb0bd55 772 expr_type(XprLiteral< std::complex<T> >(lhs), rhs)); \
narshu 1:cc2a9eb0bd55 773 }
narshu 1:cc2a9eb0bd55 774
narshu 1:cc2a9eb0bd55 775 // necessary operators for eval functions
narshu 1:cc2a9eb0bd55 776 TVMET_IMPLEMENT_MACRO(greater, >)
narshu 1:cc2a9eb0bd55 777 TVMET_IMPLEMENT_MACRO(less, <)
narshu 1:cc2a9eb0bd55 778 TVMET_IMPLEMENT_MACRO(greater_eq, >=)
narshu 1:cc2a9eb0bd55 779 TVMET_IMPLEMENT_MACRO(less_eq, <=)
narshu 1:cc2a9eb0bd55 780 TVMET_IMPLEMENT_MACRO(eq, ==)
narshu 1:cc2a9eb0bd55 781 TVMET_IMPLEMENT_MACRO(not_eq, !=)
narshu 1:cc2a9eb0bd55 782 TVMET_IMPLEMENT_MACRO(and, &&)
narshu 1:cc2a9eb0bd55 783 TVMET_IMPLEMENT_MACRO(or, ||)
narshu 1:cc2a9eb0bd55 784
narshu 1:cc2a9eb0bd55 785 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 786
narshu 1:cc2a9eb0bd55 787 #endif // defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 788
narshu 1:cc2a9eb0bd55 789
narshu 1:cc2a9eb0bd55 790 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 1:cc2a9eb0bd55 791 * global unary operators
narshu 1:cc2a9eb0bd55 792 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 1:cc2a9eb0bd55 793
narshu 1:cc2a9eb0bd55 794
narshu 1:cc2a9eb0bd55 795 /*
narshu 1:cc2a9eb0bd55 796 * Unary Operator on XprVector<E, Sz>
narshu 1:cc2a9eb0bd55 797 */
narshu 1:cc2a9eb0bd55 798 #define TVMET_IMPLEMENT_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 799 template <class E, std::size_t Sz> \
narshu 1:cc2a9eb0bd55 800 inline \
narshu 1:cc2a9eb0bd55 801 XprVector< \
narshu 1:cc2a9eb0bd55 802 XprUnOp< \
narshu 1:cc2a9eb0bd55 803 Fcnl_##NAME<typename E::value_type>, \
narshu 1:cc2a9eb0bd55 804 XprVector<E, Sz> \
narshu 1:cc2a9eb0bd55 805 >, \
narshu 1:cc2a9eb0bd55 806 Sz \
narshu 1:cc2a9eb0bd55 807 > \
narshu 1:cc2a9eb0bd55 808 operator OP (const XprVector<E, Sz>& rhs) { \
narshu 1:cc2a9eb0bd55 809 typedef XprUnOp< \
narshu 1:cc2a9eb0bd55 810 Fcnl_##NAME<typename E::value_type>, \
narshu 1:cc2a9eb0bd55 811 XprVector<E, Sz> \
narshu 1:cc2a9eb0bd55 812 > expr_type; \
narshu 1:cc2a9eb0bd55 813 return XprVector<expr_type, Sz>(expr_type(rhs)); \
narshu 1:cc2a9eb0bd55 814 }
narshu 1:cc2a9eb0bd55 815
narshu 1:cc2a9eb0bd55 816 TVMET_IMPLEMENT_MACRO(not, !)
narshu 1:cc2a9eb0bd55 817 TVMET_IMPLEMENT_MACRO(compl, ~)
narshu 1:cc2a9eb0bd55 818 TVMET_IMPLEMENT_MACRO(neg, -)
narshu 1:cc2a9eb0bd55 819
narshu 1:cc2a9eb0bd55 820 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 821
narshu 1:cc2a9eb0bd55 822
narshu 1:cc2a9eb0bd55 823 } // namespace tvmet
narshu 1:cc2a9eb0bd55 824
narshu 1:cc2a9eb0bd55 825 #endif // TVMET_XPR_VECTOR_OPERATORS_H
narshu 1:cc2a9eb0bd55 826
narshu 1:cc2a9eb0bd55 827 // Local Variables:
narshu 1:cc2a9eb0bd55 828 // mode:C++
narshu 1:cc2a9eb0bd55 829 // tab-width:8
narshu 1:cc2a9eb0bd55 830 // End: