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: UnaryFunctionals.h,v 1.24 2007-06-23 15:58:58 opetzold Exp $
narshu 1:cc2a9eb0bd55 22 */
narshu 1:cc2a9eb0bd55 23
narshu 1:cc2a9eb0bd55 24 #ifndef TVMET_UNARY_FUNCTIONAL_H
narshu 1:cc2a9eb0bd55 25 #define TVMET_UNARY_FUNCTIONAL_H
narshu 1:cc2a9eb0bd55 26
narshu 1:cc2a9eb0bd55 27 namespace tvmet {
narshu 1:cc2a9eb0bd55 28
narshu 1:cc2a9eb0bd55 29 /** \class Fcnl_compl UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 30 /** \class Fcnl_neg UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 31 /** \class Fcnl_not UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 32 #define TVMET_IMPLEMENT_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 33 template <class T> \
narshu 1:cc2a9eb0bd55 34 struct Fcnl_##NAME : public UnaryFunctional { \
narshu 1:cc2a9eb0bd55 35 typedef T value_type; \
narshu 1:cc2a9eb0bd55 36 \
narshu 1:cc2a9eb0bd55 37 static inline \
narshu 1:cc2a9eb0bd55 38 value_type apply_on(value_type rhs) { \
narshu 1:cc2a9eb0bd55 39 return OP rhs; \
narshu 1:cc2a9eb0bd55 40 } \
narshu 1:cc2a9eb0bd55 41 \
narshu 1:cc2a9eb0bd55 42 static \
narshu 1:cc2a9eb0bd55 43 void print_xpr(std::ostream& os, std::size_t l=0) { \
narshu 1:cc2a9eb0bd55 44 os << IndentLevel(l) << "Fcnl_" << #NAME << "<T=" \
narshu 1:cc2a9eb0bd55 45 << typeid(T).name() << ">," \
narshu 1:cc2a9eb0bd55 46 << std::endl; \
narshu 1:cc2a9eb0bd55 47 } \
narshu 1:cc2a9eb0bd55 48 };
narshu 1:cc2a9eb0bd55 49
narshu 1:cc2a9eb0bd55 50 TVMET_IMPLEMENT_MACRO(compl, ~)
narshu 1:cc2a9eb0bd55 51 TVMET_IMPLEMENT_MACRO(neg, -)
narshu 1:cc2a9eb0bd55 52 TVMET_IMPLEMENT_MACRO(not, !)
narshu 1:cc2a9eb0bd55 53 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 54
narshu 1:cc2a9eb0bd55 55
narshu 1:cc2a9eb0bd55 56 /** \class Fcnl_abs UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 57 /** \class Fcnl_ceil UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 58 /** \class Fcnl_floor UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 59 /** \class Fcnl_sin UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 60 /** \class Fcnl_cos UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 61 /** \class Fcnl_tan UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 62 /** \class Fcnl_sinh UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 63 /** \class Fcnl_cosh UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 64 /** \class Fcnl_tanh UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 65 /** \class Fcnl_asin UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 66 /** \class Fcnl_acos UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 67 /** \class Fcnl_atan UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 68 /** \class Fcnl_exp UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 69 /** \class Fcnl_log UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 70 /** \class Fcnl_log10 UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 71 /** \class Fcnl_sqrt UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 72 #define TVMET_IMPLEMENT_MACRO(NAME) \
narshu 1:cc2a9eb0bd55 73 template <class T> \
narshu 1:cc2a9eb0bd55 74 struct Fcnl_##NAME : public UnaryFunctional { \
narshu 1:cc2a9eb0bd55 75 typedef T value_type; \
narshu 1:cc2a9eb0bd55 76 \
narshu 1:cc2a9eb0bd55 77 static inline \
narshu 1:cc2a9eb0bd55 78 value_type apply_on(value_type rhs) { \
narshu 1:cc2a9eb0bd55 79 return TVMET_STD_SCOPE(NAME)(rhs); \
narshu 1:cc2a9eb0bd55 80 } \
narshu 1:cc2a9eb0bd55 81 \
narshu 1:cc2a9eb0bd55 82 static \
narshu 1:cc2a9eb0bd55 83 void print_xpr(std::ostream& os, std::size_t l=0) { \
narshu 1:cc2a9eb0bd55 84 os << IndentLevel(l) << "Fcnl_" << #NAME << "<T=" \
narshu 1:cc2a9eb0bd55 85 << typeid(value_type).name() << ">," \
narshu 1:cc2a9eb0bd55 86 << std::endl; \
narshu 1:cc2a9eb0bd55 87 } \
narshu 1:cc2a9eb0bd55 88 };
narshu 1:cc2a9eb0bd55 89
narshu 1:cc2a9eb0bd55 90 TVMET_IMPLEMENT_MACRO(abs) // specialized later, see below
narshu 1:cc2a9eb0bd55 91 TVMET_IMPLEMENT_MACRO(ceil)
narshu 1:cc2a9eb0bd55 92 TVMET_IMPLEMENT_MACRO(floor)
narshu 1:cc2a9eb0bd55 93 TVMET_IMPLEMENT_MACRO(sin)
narshu 1:cc2a9eb0bd55 94 TVMET_IMPLEMENT_MACRO(cos)
narshu 1:cc2a9eb0bd55 95 TVMET_IMPLEMENT_MACRO(tan)
narshu 1:cc2a9eb0bd55 96 TVMET_IMPLEMENT_MACRO(sinh)
narshu 1:cc2a9eb0bd55 97 TVMET_IMPLEMENT_MACRO(cosh)
narshu 1:cc2a9eb0bd55 98 TVMET_IMPLEMENT_MACRO(tanh)
narshu 1:cc2a9eb0bd55 99 TVMET_IMPLEMENT_MACRO(asin)
narshu 1:cc2a9eb0bd55 100 TVMET_IMPLEMENT_MACRO(acos)
narshu 1:cc2a9eb0bd55 101 TVMET_IMPLEMENT_MACRO(atan)
narshu 1:cc2a9eb0bd55 102 TVMET_IMPLEMENT_MACRO(exp)
narshu 1:cc2a9eb0bd55 103 TVMET_IMPLEMENT_MACRO(log)
narshu 1:cc2a9eb0bd55 104 TVMET_IMPLEMENT_MACRO(log10)
narshu 1:cc2a9eb0bd55 105 TVMET_IMPLEMENT_MACRO(sqrt)
narshu 1:cc2a9eb0bd55 106
narshu 1:cc2a9eb0bd55 107 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 108
narshu 1:cc2a9eb0bd55 109
narshu 1:cc2a9eb0bd55 110 /** \class Fcnl_cbrt UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 111 /** \class Fcnl_rint UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 112 #define TVMET_IMPLEMENT_MACRO(NAME) \
narshu 1:cc2a9eb0bd55 113 template <class T> \
narshu 1:cc2a9eb0bd55 114 struct Fcnl_##NAME : public UnaryFunctional { \
narshu 1:cc2a9eb0bd55 115 typedef T value_type; \
narshu 1:cc2a9eb0bd55 116 \
narshu 1:cc2a9eb0bd55 117 static inline \
narshu 1:cc2a9eb0bd55 118 value_type apply_on(value_type rhs) { \
narshu 1:cc2a9eb0bd55 119 return TVMET_GLOBAL_SCOPE(NAME)(rhs); \
narshu 1:cc2a9eb0bd55 120 } \
narshu 1:cc2a9eb0bd55 121 \
narshu 1:cc2a9eb0bd55 122 static \
narshu 1:cc2a9eb0bd55 123 void print_xpr(std::ostream& os, std::size_t l=0) { \
narshu 1:cc2a9eb0bd55 124 os << IndentLevel(l) << "Fcnl_" << #NAME << "<T=" \
narshu 1:cc2a9eb0bd55 125 << typeid(value_type).name() << ">," \
narshu 1:cc2a9eb0bd55 126 << std::endl; \
narshu 1:cc2a9eb0bd55 127 } \
narshu 1:cc2a9eb0bd55 128 };
narshu 1:cc2a9eb0bd55 129
narshu 1:cc2a9eb0bd55 130 TVMET_IMPLEMENT_MACRO(cbrt)
narshu 1:cc2a9eb0bd55 131 TVMET_IMPLEMENT_MACRO(rint)
narshu 1:cc2a9eb0bd55 132
narshu 1:cc2a9eb0bd55 133 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 134
narshu 1:cc2a9eb0bd55 135
narshu 1:cc2a9eb0bd55 136 #if defined(TVMET_HAVE_IEEE_MATH)
narshu 1:cc2a9eb0bd55 137
narshu 1:cc2a9eb0bd55 138 /** \class Fcnl_asinh UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 139 /** \class Fcnl_acosh UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 140 /** \class Fcnl_atanh UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 141 /** \class Fcnl_expm1 UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 142 /** \class Fcnl_log1p UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 143 /** \class Fcnl_erf UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 144 /** \class Fcnl_erfc UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 145 /** \class Fcnl_j0 UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 146 /** \class Fcnl_j1 UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 147 /** \class Fcnl_y0 UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 148 /** \class Fcnl_y1 UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 149 /** \class Fcnl_lgamma UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 150 #define TVMET_IMPLEMENT_MACRO(NAME) \
narshu 1:cc2a9eb0bd55 151 template <class T> \
narshu 1:cc2a9eb0bd55 152 struct Fcnl_##NAME : public UnaryFunctional { \
narshu 1:cc2a9eb0bd55 153 typedef T value_type; \
narshu 1:cc2a9eb0bd55 154 \
narshu 1:cc2a9eb0bd55 155 static inline \
narshu 1:cc2a9eb0bd55 156 value_type apply_on(value_type rhs) { \
narshu 1:cc2a9eb0bd55 157 return TVMET_GLOBAL_SCOPE(NAME)(rhs); \
narshu 1:cc2a9eb0bd55 158 } \
narshu 1:cc2a9eb0bd55 159 \
narshu 1:cc2a9eb0bd55 160 static \
narshu 1:cc2a9eb0bd55 161 void print_xpr(std::ostream& os, std::size_t l=0) { \
narshu 1:cc2a9eb0bd55 162 os << IndentLevel(l) << "Fcnl_" << #NAME << "<T=" \
narshu 1:cc2a9eb0bd55 163 << typeid(value_type).name() << ">," \
narshu 1:cc2a9eb0bd55 164 << std::endl; \
narshu 1:cc2a9eb0bd55 165 } \
narshu 1:cc2a9eb0bd55 166 };
narshu 1:cc2a9eb0bd55 167
narshu 1:cc2a9eb0bd55 168 TVMET_IMPLEMENT_MACRO(asinh)
narshu 1:cc2a9eb0bd55 169 TVMET_IMPLEMENT_MACRO(acosh)
narshu 1:cc2a9eb0bd55 170 TVMET_IMPLEMENT_MACRO(atanh)
narshu 1:cc2a9eb0bd55 171 TVMET_IMPLEMENT_MACRO(expm1)
narshu 1:cc2a9eb0bd55 172 TVMET_IMPLEMENT_MACRO(log1p)
narshu 1:cc2a9eb0bd55 173 TVMET_IMPLEMENT_MACRO(erf)
narshu 1:cc2a9eb0bd55 174 TVMET_IMPLEMENT_MACRO(erfc)
narshu 1:cc2a9eb0bd55 175 TVMET_IMPLEMENT_MACRO(j0)
narshu 1:cc2a9eb0bd55 176 TVMET_IMPLEMENT_MACRO(j1)
narshu 1:cc2a9eb0bd55 177 TVMET_IMPLEMENT_MACRO(y0)
narshu 1:cc2a9eb0bd55 178 TVMET_IMPLEMENT_MACRO(y1)
narshu 1:cc2a9eb0bd55 179 TVMET_IMPLEMENT_MACRO(lgamma)
narshu 1:cc2a9eb0bd55 180
narshu 1:cc2a9eb0bd55 181 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 182
narshu 1:cc2a9eb0bd55 183 #endif // defined(TVMET_HAVE_IEEE_MATH)
narshu 1:cc2a9eb0bd55 184
narshu 1:cc2a9eb0bd55 185
narshu 1:cc2a9eb0bd55 186 /** \class Fcnl_abs<long int> UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 187 /** \class Fcnl_abs<long long int> UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 188 /** \class Fcnl_abs<float> UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 189 /** \class Fcnl_abs<double> UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 190 /** \class Fcnl_abs<long double> UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 191 #define TVMET_IMPLEMENT_MACRO(NAME, POD) \
narshu 1:cc2a9eb0bd55 192 template <class T> struct Fcnl_##NAME; \
narshu 1:cc2a9eb0bd55 193 template <> \
narshu 1:cc2a9eb0bd55 194 struct Fcnl_##NAME< POD > : public UnaryFunctional { \
narshu 1:cc2a9eb0bd55 195 typedef POD value_type; \
narshu 1:cc2a9eb0bd55 196 \
narshu 1:cc2a9eb0bd55 197 static inline \
narshu 1:cc2a9eb0bd55 198 value_type apply_on(value_type rhs) { \
narshu 1:cc2a9eb0bd55 199 return TVMET_STD_SCOPE(NAME)(rhs); \
narshu 1:cc2a9eb0bd55 200 } \
narshu 1:cc2a9eb0bd55 201 \
narshu 1:cc2a9eb0bd55 202 static \
narshu 1:cc2a9eb0bd55 203 void print_xpr(std::ostream& os, std::size_t l=0) { \
narshu 1:cc2a9eb0bd55 204 os << IndentLevel(l) << "Fcnl_" << #NAME << "<T=" \
narshu 1:cc2a9eb0bd55 205 << typeid(value_type).name() << ">," \
narshu 1:cc2a9eb0bd55 206 << std::endl; \
narshu 1:cc2a9eb0bd55 207 } \
narshu 1:cc2a9eb0bd55 208 };
narshu 1:cc2a9eb0bd55 209
narshu 1:cc2a9eb0bd55 210 TVMET_IMPLEMENT_MACRO(labs, long int)
narshu 1:cc2a9eb0bd55 211
narshu 1:cc2a9eb0bd55 212 #if defined(TVMET_HAVE_LONG_LONG)
narshu 1:cc2a9eb0bd55 213 TVMET_IMPLEMENT_MACRO(labs, long long int)
narshu 1:cc2a9eb0bd55 214 #endif
narshu 1:cc2a9eb0bd55 215
narshu 1:cc2a9eb0bd55 216 TVMET_IMPLEMENT_MACRO(fabs, float)
narshu 1:cc2a9eb0bd55 217 TVMET_IMPLEMENT_MACRO(fabs, double)
narshu 1:cc2a9eb0bd55 218
narshu 1:cc2a9eb0bd55 219 #if defined(TVMET_HAVE_LONG_DOUBLE)
narshu 1:cc2a9eb0bd55 220 TVMET_IMPLEMENT_MACRO(fabs, long double)
narshu 1:cc2a9eb0bd55 221 #endif
narshu 1:cc2a9eb0bd55 222
narshu 1:cc2a9eb0bd55 223 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 224
narshu 1:cc2a9eb0bd55 225
narshu 1:cc2a9eb0bd55 226 /*
narshu 1:cc2a9eb0bd55 227 * complex support
narshu 1:cc2a9eb0bd55 228 */
narshu 1:cc2a9eb0bd55 229
narshu 1:cc2a9eb0bd55 230 #if defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 231 /**
narshu 1:cc2a9eb0bd55 232 * \class Fcnl_abs< std::complex<T> > UnaryFunctionals.h "tvmet/UnaryFunctionals.h"
narshu 1:cc2a9eb0bd55 233 */
narshu 1:cc2a9eb0bd55 234 template <class T>
narshu 1:cc2a9eb0bd55 235 struct Fcnl_abs< std::complex<T> > : public UnaryFunctional {
narshu 1:cc2a9eb0bd55 236 typedef T value_type;
narshu 1:cc2a9eb0bd55 237
narshu 1:cc2a9eb0bd55 238 static inline
narshu 1:cc2a9eb0bd55 239 value_type apply_on(const std::complex<T>& rhs) {
narshu 1:cc2a9eb0bd55 240 return std::abs(rhs);
narshu 1:cc2a9eb0bd55 241 }
narshu 1:cc2a9eb0bd55 242
narshu 1:cc2a9eb0bd55 243 static
narshu 1:cc2a9eb0bd55 244 void print_xpr(std::ostream& os, std::size_t l=0) {
narshu 1:cc2a9eb0bd55 245 os << IndentLevel(l) << "Fcnl_abs<T="
narshu 1:cc2a9eb0bd55 246 << typeid(std::complex<T>).name() << ">,"
narshu 1:cc2a9eb0bd55 247 << std::endl;
narshu 1:cc2a9eb0bd55 248 }
narshu 1:cc2a9eb0bd55 249 };
narshu 1:cc2a9eb0bd55 250
narshu 1:cc2a9eb0bd55 251
narshu 1:cc2a9eb0bd55 252 /**
narshu 1:cc2a9eb0bd55 253 * \class Fcnl_conj< std::complex<T> > UnaryFunctionals.h "tvmet/UnaryFunctionals.h"
narshu 1:cc2a9eb0bd55 254 * \brief %Functional for conj.
narshu 1:cc2a9eb0bd55 255 */
narshu 1:cc2a9eb0bd55 256 template <class T> struct Fcnl_conj : public UnaryFunctional { };
narshu 1:cc2a9eb0bd55 257
narshu 1:cc2a9eb0bd55 258
narshu 1:cc2a9eb0bd55 259 /** \class Fcnl_conj< std::complex<T> > UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 260 template <class T>
narshu 1:cc2a9eb0bd55 261 struct Fcnl_conj< std::complex<T> > : public UnaryFunctional {
narshu 1:cc2a9eb0bd55 262 typedef std::complex<T> value_type;
narshu 1:cc2a9eb0bd55 263
narshu 1:cc2a9eb0bd55 264 static inline
narshu 1:cc2a9eb0bd55 265 value_type apply_on(const std::complex<T>& rhs) {
narshu 1:cc2a9eb0bd55 266 return std::conj(rhs);
narshu 1:cc2a9eb0bd55 267 }
narshu 1:cc2a9eb0bd55 268
narshu 1:cc2a9eb0bd55 269 static
narshu 1:cc2a9eb0bd55 270 void print_xpr(std::ostream& os, std::size_t l=0) {
narshu 1:cc2a9eb0bd55 271 os << IndentLevel(l) << "Fcnl_conj<T="
narshu 1:cc2a9eb0bd55 272 << typeid(std::complex<T>).name() << ">,"
narshu 1:cc2a9eb0bd55 273 << std::endl;
narshu 1:cc2a9eb0bd55 274 }
narshu 1:cc2a9eb0bd55 275 };
narshu 1:cc2a9eb0bd55 276
narshu 1:cc2a9eb0bd55 277
narshu 1:cc2a9eb0bd55 278 /** \class Fcnl_real< std::complex<T> > UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 279 /** \class Fcnl_imag< std::complex<T> > UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 280 /** \class Fcnl_arg< std::complex<T> > UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 281 /** \class Fcnl_norm< std::complex<T> > UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 282 #define TVMET_IMPLEMENT_MACRO(NAME) \
narshu 1:cc2a9eb0bd55 283 template <class T> struct Fcnl_##NAME; \
narshu 1:cc2a9eb0bd55 284 template <class T> \
narshu 1:cc2a9eb0bd55 285 struct Fcnl_##NAME< std::complex<T> > : public UnaryFunctional { \
narshu 1:cc2a9eb0bd55 286 typedef T value_type; \
narshu 1:cc2a9eb0bd55 287 \
narshu 1:cc2a9eb0bd55 288 static inline \
narshu 1:cc2a9eb0bd55 289 value_type apply_on(const std::complex<T>& rhs) { \
narshu 1:cc2a9eb0bd55 290 return TVMET_STD_SCOPE(NAME)(rhs); \
narshu 1:cc2a9eb0bd55 291 } \
narshu 1:cc2a9eb0bd55 292 \
narshu 1:cc2a9eb0bd55 293 static \
narshu 1:cc2a9eb0bd55 294 void print_xpr(std::ostream& os, std::size_t l=0) { \
narshu 1:cc2a9eb0bd55 295 os << IndentLevel(l) << "Fcnl_" << #NAME << "<T=" \
narshu 1:cc2a9eb0bd55 296 << typeid(std::complex<T>).name() << ">," \
narshu 1:cc2a9eb0bd55 297 << std::endl; \
narshu 1:cc2a9eb0bd55 298 } \
narshu 1:cc2a9eb0bd55 299 };
narshu 1:cc2a9eb0bd55 300
narshu 1:cc2a9eb0bd55 301 TVMET_IMPLEMENT_MACRO(real)
narshu 1:cc2a9eb0bd55 302 TVMET_IMPLEMENT_MACRO(imag)
narshu 1:cc2a9eb0bd55 303 TVMET_IMPLEMENT_MACRO(arg)
narshu 1:cc2a9eb0bd55 304 TVMET_IMPLEMENT_MACRO(norm)
narshu 1:cc2a9eb0bd55 305
narshu 1:cc2a9eb0bd55 306 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 307
narshu 1:cc2a9eb0bd55 308 #endif // defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 309
narshu 1:cc2a9eb0bd55 310
narshu 1:cc2a9eb0bd55 311 #if defined(TVMET_HAVE_IEEE_MATH)
narshu 1:cc2a9eb0bd55 312
narshu 1:cc2a9eb0bd55 313 /** \class Fcnl_isnan UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 314 /** \class Fcnl_isinf UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 315 /** \class Fcnl_finite UnaryFunctionals.h "tvmet/UnaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 316 #define TVMET_IMPLEMENT_MACRO(NAME, POD) \
narshu 1:cc2a9eb0bd55 317 template <class T> \
narshu 1:cc2a9eb0bd55 318 struct Fcnl_##NAME : public UnaryFunctional { \
narshu 1:cc2a9eb0bd55 319 typedef T value_type; \
narshu 1:cc2a9eb0bd55 320 \
narshu 1:cc2a9eb0bd55 321 static inline \
narshu 1:cc2a9eb0bd55 322 POD apply_on(T rhs) { \
narshu 1:cc2a9eb0bd55 323 return TVMET_GLOBAL_SCOPE(NAME)(rhs); \
narshu 1:cc2a9eb0bd55 324 } \
narshu 1:cc2a9eb0bd55 325 \
narshu 1:cc2a9eb0bd55 326 static \
narshu 1:cc2a9eb0bd55 327 void print_xpr(std::ostream& os, std::size_t l=0) { \
narshu 1:cc2a9eb0bd55 328 os << IndentLevel(l) << "Fcnl_" << #NAME << "<T=" \
narshu 1:cc2a9eb0bd55 329 << typeid(POD).name() << ">," \
narshu 1:cc2a9eb0bd55 330 << std::endl; \
narshu 1:cc2a9eb0bd55 331 } \
narshu 1:cc2a9eb0bd55 332 };
narshu 1:cc2a9eb0bd55 333
narshu 1:cc2a9eb0bd55 334 TVMET_IMPLEMENT_MACRO(isnan, int)
narshu 1:cc2a9eb0bd55 335 TVMET_IMPLEMENT_MACRO(isinf, int)
narshu 1:cc2a9eb0bd55 336 TVMET_IMPLEMENT_MACRO(finite, int)
narshu 1:cc2a9eb0bd55 337
narshu 1:cc2a9eb0bd55 338 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 339
narshu 1:cc2a9eb0bd55 340 #endif // defined(TVMET_HAVE_IEEE_MATH)
narshu 1:cc2a9eb0bd55 341
narshu 1:cc2a9eb0bd55 342 } // namespace tvmet
narshu 1:cc2a9eb0bd55 343
narshu 1:cc2a9eb0bd55 344 #endif // TVMET_UNARY_FUNCTIONAL_H
narshu 1:cc2a9eb0bd55 345
narshu 1:cc2a9eb0bd55 346 // Local Variables:
narshu 1:cc2a9eb0bd55 347 // mode:C++
narshu 1:cc2a9eb0bd55 348 // tab-width:8
narshu 1:cc2a9eb0bd55 349 // End: