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: BinaryFunctionals.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_BINARY_FUNCTIONAL_H
narshu 1:cc2a9eb0bd55 25 #define TVMET_BINARY_FUNCTIONAL_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 * \class Fcnl_assign BinaryFunctionals.h "tvmet/BinaryFunctionals.h"
narshu 1:cc2a9eb0bd55 32 * \brief Binary operator for assign operations.
narshu 1:cc2a9eb0bd55 33 *
narshu 1:cc2a9eb0bd55 34 * Unfortunally we have sometimes to cast on assign operations e.g.,
narshu 1:cc2a9eb0bd55 35 * on assign on different POD. So we avoid warnings.
narshu 1:cc2a9eb0bd55 36 */
narshu 1:cc2a9eb0bd55 37 template <class T1, class T2>
narshu 1:cc2a9eb0bd55 38 struct Fcnl_assign : public BinaryFunctional {
narshu 1:cc2a9eb0bd55 39 static inline
narshu 1:cc2a9eb0bd55 40 void apply_on(T1& _tvmet_restrict lhs, T2 rhs) {
narshu 1:cc2a9eb0bd55 41 lhs = static_cast<T1>(rhs);
narshu 1:cc2a9eb0bd55 42 }
narshu 1:cc2a9eb0bd55 43
narshu 1:cc2a9eb0bd55 44 static
narshu 1:cc2a9eb0bd55 45 void print_xpr(std::ostream& os, std::size_t l=0) {
narshu 1:cc2a9eb0bd55 46 os << IndentLevel(l) << "fcnl_assign<T1="
narshu 1:cc2a9eb0bd55 47 << typeid(T1).name() << ", T2=" << typeid(T2).name() << ">,"
narshu 1:cc2a9eb0bd55 48 << std::endl;
narshu 1:cc2a9eb0bd55 49 }
narshu 1:cc2a9eb0bd55 50 };
narshu 1:cc2a9eb0bd55 51
narshu 1:cc2a9eb0bd55 52
narshu 1:cc2a9eb0bd55 53 /** \class Fcnl_add_eq BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 54 /** \class Fcnl_sub_eq BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 55 /** \class Fcnl_mul_eq BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 56 /** \class Fcnl_div_eq BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 57 /** \class Fcnl_mod_eq BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 58 /** \class Fcnl_xor_eq BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 59 /** \class Fcnl_and_eq BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 60 /** \class Fcnl_or_eq BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 61 /** \class Fcnl_shl_eq BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 62 /** \class Fcnl_shr_eq BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 63 #define TVMET_IMPLEMENT_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 64 template <class T1, class T2> \
narshu 1:cc2a9eb0bd55 65 struct Fcnl_##NAME : public BinaryFunctional { \
narshu 1:cc2a9eb0bd55 66 typedef void value_type; \
narshu 1:cc2a9eb0bd55 67 \
narshu 1:cc2a9eb0bd55 68 static inline \
narshu 1:cc2a9eb0bd55 69 void apply_on(T1& _tvmet_restrict lhs, T2 rhs) { \
narshu 1:cc2a9eb0bd55 70 lhs OP rhs; \
narshu 1:cc2a9eb0bd55 71 } \
narshu 1:cc2a9eb0bd55 72 \
narshu 1:cc2a9eb0bd55 73 static \
narshu 1:cc2a9eb0bd55 74 void print_xpr(std::ostream& os, std::size_t l=0) { \
narshu 1:cc2a9eb0bd55 75 os << IndentLevel(l) \
narshu 1:cc2a9eb0bd55 76 << "Fcnl_" << #NAME << "<T1=" \
narshu 1:cc2a9eb0bd55 77 << typeid(T1).name() << ", T2=" << typeid(T2).name() << ">," \
narshu 1:cc2a9eb0bd55 78 << std::endl; \
narshu 1:cc2a9eb0bd55 79 } \
narshu 1:cc2a9eb0bd55 80 };
narshu 1:cc2a9eb0bd55 81
narshu 1:cc2a9eb0bd55 82 TVMET_IMPLEMENT_MACRO(add_eq, +=)
narshu 1:cc2a9eb0bd55 83 TVMET_IMPLEMENT_MACRO(sub_eq, -=)
narshu 1:cc2a9eb0bd55 84 TVMET_IMPLEMENT_MACRO(mul_eq, *=)
narshu 1:cc2a9eb0bd55 85 TVMET_IMPLEMENT_MACRO(div_eq, /=)
narshu 1:cc2a9eb0bd55 86 TVMET_IMPLEMENT_MACRO(mod_eq, %=)
narshu 1:cc2a9eb0bd55 87 TVMET_IMPLEMENT_MACRO(xor_eq, ^=)
narshu 1:cc2a9eb0bd55 88 TVMET_IMPLEMENT_MACRO(and_eq, &=)
narshu 1:cc2a9eb0bd55 89 TVMET_IMPLEMENT_MACRO(or_eq, |=)
narshu 1:cc2a9eb0bd55 90 TVMET_IMPLEMENT_MACRO(shl_eq, <<=)
narshu 1:cc2a9eb0bd55 91 TVMET_IMPLEMENT_MACRO(shr_eq, >>=)
narshu 1:cc2a9eb0bd55 92
narshu 1:cc2a9eb0bd55 93 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 94
narshu 1:cc2a9eb0bd55 95
narshu 1:cc2a9eb0bd55 96 /** \class Fcnl_add BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 97 /** \class Fcnl_sub BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 98 /** \class Fcnl_mul BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 99 /** \class Fcnl_div BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 100 /** \class Fcnl_mod BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 101 /** \class Fcnl_bitxor BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 102 /** \class Fcnl_bitand BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 103 /** \class Fcnl_bitor BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 104 /** \class Fcnl_shl BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 105 /** \class Fcnl_shr BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 106 #define TVMET_IMPLEMENT_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 107 template <class T1, class T2> \
narshu 1:cc2a9eb0bd55 108 struct Fcnl_##NAME : public BinaryFunctional { \
narshu 1:cc2a9eb0bd55 109 typedef typename PromoteTraits<T1, T2>::value_type value_type; \
narshu 1:cc2a9eb0bd55 110 \
narshu 1:cc2a9eb0bd55 111 static inline \
narshu 1:cc2a9eb0bd55 112 value_type apply_on(T1 lhs, T2 rhs) { \
narshu 1:cc2a9eb0bd55 113 return lhs OP rhs; \
narshu 1:cc2a9eb0bd55 114 } \
narshu 1:cc2a9eb0bd55 115 \
narshu 1:cc2a9eb0bd55 116 static \
narshu 1:cc2a9eb0bd55 117 void print_xpr(std::ostream& os, std::size_t l=0) { \
narshu 1:cc2a9eb0bd55 118 os << IndentLevel(l) \
narshu 1:cc2a9eb0bd55 119 << "Fcnl_" << #NAME << "<T1=" \
narshu 1:cc2a9eb0bd55 120 << typeid(T1).name() << ", T2=" << typeid(T2).name() << ">," \
narshu 1:cc2a9eb0bd55 121 << std::endl; \
narshu 1:cc2a9eb0bd55 122 } \
narshu 1:cc2a9eb0bd55 123 };
narshu 1:cc2a9eb0bd55 124
narshu 1:cc2a9eb0bd55 125 TVMET_IMPLEMENT_MACRO(add, +)
narshu 1:cc2a9eb0bd55 126 TVMET_IMPLEMENT_MACRO(sub, -)
narshu 1:cc2a9eb0bd55 127 TVMET_IMPLEMENT_MACRO(mul, *)
narshu 1:cc2a9eb0bd55 128 TVMET_IMPLEMENT_MACRO(div, /)
narshu 1:cc2a9eb0bd55 129 TVMET_IMPLEMENT_MACRO(mod, %)
narshu 1:cc2a9eb0bd55 130 TVMET_IMPLEMENT_MACRO(bitxor, ^)
narshu 1:cc2a9eb0bd55 131 TVMET_IMPLEMENT_MACRO(bitand, &)
narshu 1:cc2a9eb0bd55 132 TVMET_IMPLEMENT_MACRO(bitor, |)
narshu 1:cc2a9eb0bd55 133 TVMET_IMPLEMENT_MACRO(shl, <<)
narshu 1:cc2a9eb0bd55 134 TVMET_IMPLEMENT_MACRO(shr, >>)
narshu 1:cc2a9eb0bd55 135
narshu 1:cc2a9eb0bd55 136 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 137
narshu 1:cc2a9eb0bd55 138
narshu 1:cc2a9eb0bd55 139 /** \class Fcnl_greater BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 140 /** \class Fcnl_greater_eq BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 141 /** \class Fcnl_less BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 142 /** \class Fcnl_less_eq BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 143 /** \class Fcnl_eq BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 144 /** \class Fcnl_not_eq BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 145 /** \class Fcnl_and BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 146 /** \class Fcnl_or BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 147 #define TVMET_IMPLEMENT_MACRO(NAME, OP) \
narshu 1:cc2a9eb0bd55 148 template <class T1, class T2> \
narshu 1:cc2a9eb0bd55 149 struct Fcnl_##NAME : public BinaryFunctional { \
narshu 1:cc2a9eb0bd55 150 typedef bool value_type; \
narshu 1:cc2a9eb0bd55 151 \
narshu 1:cc2a9eb0bd55 152 static inline \
narshu 1:cc2a9eb0bd55 153 bool apply_on(T1 lhs, T2 rhs) { \
narshu 1:cc2a9eb0bd55 154 return lhs OP rhs; \
narshu 1:cc2a9eb0bd55 155 } \
narshu 1:cc2a9eb0bd55 156 \
narshu 1:cc2a9eb0bd55 157 static \
narshu 1:cc2a9eb0bd55 158 void print_xpr(std::ostream& os, std::size_t l=0) { \
narshu 1:cc2a9eb0bd55 159 os << IndentLevel(l) \
narshu 1:cc2a9eb0bd55 160 << "Fcnl_" << #NAME << "<T1=" \
narshu 1:cc2a9eb0bd55 161 << typeid(T1).name() << ", T2=" << typeid(T2).name() << ">," \
narshu 1:cc2a9eb0bd55 162 << std::endl; \
narshu 1:cc2a9eb0bd55 163 } \
narshu 1:cc2a9eb0bd55 164 };
narshu 1:cc2a9eb0bd55 165
narshu 1:cc2a9eb0bd55 166 TVMET_IMPLEMENT_MACRO(greater, >)
narshu 1:cc2a9eb0bd55 167 TVMET_IMPLEMENT_MACRO(less, <)
narshu 1:cc2a9eb0bd55 168 TVMET_IMPLEMENT_MACRO(greater_eq, >=)
narshu 1:cc2a9eb0bd55 169 TVMET_IMPLEMENT_MACRO(less_eq, <=)
narshu 1:cc2a9eb0bd55 170 TVMET_IMPLEMENT_MACRO(eq, ==)
narshu 1:cc2a9eb0bd55 171 TVMET_IMPLEMENT_MACRO(not_eq, !=)
narshu 1:cc2a9eb0bd55 172 TVMET_IMPLEMENT_MACRO(and, &&)
narshu 1:cc2a9eb0bd55 173 TVMET_IMPLEMENT_MACRO(or, ||)
narshu 1:cc2a9eb0bd55 174
narshu 1:cc2a9eb0bd55 175 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 176
narshu 1:cc2a9eb0bd55 177
narshu 1:cc2a9eb0bd55 178 /** \class Fcnl_atan2 BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 179 /** \class Fcnl_fmod BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 180 /** \class Fcnl_pow BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 181 #define TVMET_IMPLEMENT_MACRO(NAME) \
narshu 1:cc2a9eb0bd55 182 template <class T1, class T2> \
narshu 1:cc2a9eb0bd55 183 struct Fcnl_##NAME : public BinaryFunctional { \
narshu 1:cc2a9eb0bd55 184 typedef typename PromoteTraits<T1, T2>::value_type value_type; \
narshu 1:cc2a9eb0bd55 185 \
narshu 1:cc2a9eb0bd55 186 static inline \
narshu 1:cc2a9eb0bd55 187 value_type apply_on(T1 lhs, T2 rhs) { \
narshu 1:cc2a9eb0bd55 188 return TVMET_STD_SCOPE(NAME)(lhs, rhs); \
narshu 1:cc2a9eb0bd55 189 } \
narshu 1:cc2a9eb0bd55 190 \
narshu 1:cc2a9eb0bd55 191 static \
narshu 1:cc2a9eb0bd55 192 void print_xpr(std::ostream& os, std::size_t l=0) { \
narshu 1:cc2a9eb0bd55 193 os << IndentLevel(l) \
narshu 1:cc2a9eb0bd55 194 << "Fcnl_" << #NAME << "<T1=" \
narshu 1:cc2a9eb0bd55 195 << typeid(T1).name() << ", T2=" << typeid(T2).name() << ">," \
narshu 1:cc2a9eb0bd55 196 << std::endl; \
narshu 1:cc2a9eb0bd55 197 } \
narshu 1:cc2a9eb0bd55 198 };
narshu 1:cc2a9eb0bd55 199
narshu 1:cc2a9eb0bd55 200 TVMET_IMPLEMENT_MACRO(atan2)
narshu 1:cc2a9eb0bd55 201 TVMET_IMPLEMENT_MACRO(fmod)
narshu 1:cc2a9eb0bd55 202 TVMET_IMPLEMENT_MACRO(pow)
narshu 1:cc2a9eb0bd55 203
narshu 1:cc2a9eb0bd55 204 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 205
narshu 1:cc2a9eb0bd55 206
narshu 1:cc2a9eb0bd55 207 /** \class Fcnl_drem BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 208 /** \class Fcnl_hypot BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 209 /** \class Fcnl_jn BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 210 /** \class Fcnl_yn BinaryFunctionals.h "tvmet/BinaryFunctionals.h" */
narshu 1:cc2a9eb0bd55 211 #define TVMET_IMPLEMENT_MACRO(NAME) \
narshu 1:cc2a9eb0bd55 212 template <class T1, class T2> \
narshu 1:cc2a9eb0bd55 213 struct Fcnl_##NAME : public BinaryFunctional { \
narshu 1:cc2a9eb0bd55 214 typedef typename PromoteTraits<T1, T2>::value_type value_type; \
narshu 1:cc2a9eb0bd55 215 \
narshu 1:cc2a9eb0bd55 216 static inline \
narshu 1:cc2a9eb0bd55 217 value_type apply_on(T1 lhs, T2 rhs) { \
narshu 1:cc2a9eb0bd55 218 return TVMET_GLOBAL_SCOPE(NAME)(lhs, rhs); \
narshu 1:cc2a9eb0bd55 219 } \
narshu 1:cc2a9eb0bd55 220 \
narshu 1:cc2a9eb0bd55 221 static \
narshu 1:cc2a9eb0bd55 222 void print_xpr(std::ostream& os, std::size_t l=0) { \
narshu 1:cc2a9eb0bd55 223 os << IndentLevel(l) \
narshu 1:cc2a9eb0bd55 224 << "Fcnl_" << #NAME << "<T1=" \
narshu 1:cc2a9eb0bd55 225 << typeid(T1).name() << ", T2=" << typeid(T2).name() << ">," \
narshu 1:cc2a9eb0bd55 226 << std::endl; \
narshu 1:cc2a9eb0bd55 227 } \
narshu 1:cc2a9eb0bd55 228 };
narshu 1:cc2a9eb0bd55 229
narshu 1:cc2a9eb0bd55 230 TVMET_IMPLEMENT_MACRO(drem)
narshu 1:cc2a9eb0bd55 231 TVMET_IMPLEMENT_MACRO(hypot)
narshu 1:cc2a9eb0bd55 232 TVMET_IMPLEMENT_MACRO(jn)
narshu 1:cc2a9eb0bd55 233 TVMET_IMPLEMENT_MACRO(yn)
narshu 1:cc2a9eb0bd55 234
narshu 1:cc2a9eb0bd55 235 #undef TVMET_IMPLEMENT_MACRO
narshu 1:cc2a9eb0bd55 236
narshu 1:cc2a9eb0bd55 237
narshu 1:cc2a9eb0bd55 238 #if defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 239 /**
narshu 1:cc2a9eb0bd55 240 * \class Fcnl_polar BinaryFunctionals.h "tvmet/BinaryFunctionals.h"
narshu 1:cc2a9eb0bd55 241 * \brief %Functional for polar.
narshu 1:cc2a9eb0bd55 242 */
narshu 1:cc2a9eb0bd55 243 template <class T1, class T2> struct Fcnl_polar : public BinaryFunctional { };
narshu 1:cc2a9eb0bd55 244
narshu 1:cc2a9eb0bd55 245
narshu 1:cc2a9eb0bd55 246 /**
narshu 1:cc2a9eb0bd55 247 * \class Fcnl_polar<T,T> BinaryFunctionals.h "tvmet/BinaryFunctionals.h"
narshu 1:cc2a9eb0bd55 248 * \brief %Functional for polar.
narshu 1:cc2a9eb0bd55 249 * \note This functional is partialy specialized due to the declaration
narshu 1:cc2a9eb0bd55 250 * of %polar in namespace std <tt>complex<T> polar(T, T)</tt>.
narshu 1:cc2a9eb0bd55 251 * This means especially that type promotion isn't avaible here.
narshu 1:cc2a9eb0bd55 252 */
narshu 1:cc2a9eb0bd55 253 template <class T>
narshu 1:cc2a9eb0bd55 254 struct Fcnl_polar<T,T> : public BinaryFunctional {
narshu 1:cc2a9eb0bd55 255 typedef std::complex<T> value_type;
narshu 1:cc2a9eb0bd55 256
narshu 1:cc2a9eb0bd55 257 static inline
narshu 1:cc2a9eb0bd55 258 value_type apply_on(T lhs, T rhs) {
narshu 1:cc2a9eb0bd55 259 return std::polar(lhs, rhs);
narshu 1:cc2a9eb0bd55 260 }
narshu 1:cc2a9eb0bd55 261
narshu 1:cc2a9eb0bd55 262 static
narshu 1:cc2a9eb0bd55 263 void print_xpr(std::ostream& os, std::size_t l=0) {
narshu 1:cc2a9eb0bd55 264 os << IndentLevel(l) << "Fcnl_polar<T1="
narshu 1:cc2a9eb0bd55 265 << typeid(T).name() << ", T2=" << typeid(T).name() << ">,"
narshu 1:cc2a9eb0bd55 266 << std::endl;
narshu 1:cc2a9eb0bd55 267 }
narshu 1:cc2a9eb0bd55 268 };
narshu 1:cc2a9eb0bd55 269 #endif // defined(TVMET_HAVE_COMPLEX)
narshu 1:cc2a9eb0bd55 270
narshu 1:cc2a9eb0bd55 271
narshu 1:cc2a9eb0bd55 272 /**
narshu 1:cc2a9eb0bd55 273 * \class Fcnl_swap BinaryFunctionals.h "tvmet/BinaryFunctionals.h"
narshu 1:cc2a9eb0bd55 274 * \brief Binary operator for swapping values using temporaries.
narshu 1:cc2a9eb0bd55 275 */
narshu 1:cc2a9eb0bd55 276 template <class T1, class T2>
narshu 1:cc2a9eb0bd55 277 struct Fcnl_swap : public BinaryFunctional {
narshu 1:cc2a9eb0bd55 278 static inline
narshu 1:cc2a9eb0bd55 279 void apply_on(T1& _tvmet_restrict lhs, T2& _tvmet_restrict rhs) {
narshu 1:cc2a9eb0bd55 280 typedef typename PromoteTraits<T1, T2>::value_type temp_type;
narshu 1:cc2a9eb0bd55 281
narshu 1:cc2a9eb0bd55 282 temp_type temp(lhs);
narshu 1:cc2a9eb0bd55 283 lhs = static_cast<T1>(rhs);
narshu 1:cc2a9eb0bd55 284 rhs = static_cast<T2>(temp);
narshu 1:cc2a9eb0bd55 285 }
narshu 1:cc2a9eb0bd55 286
narshu 1:cc2a9eb0bd55 287 static
narshu 1:cc2a9eb0bd55 288 void print_xpr(std::ostream& os, std::size_t l=0) {
narshu 1:cc2a9eb0bd55 289 os << IndentLevel(l) << "Fcnl_swap<T1="
narshu 1:cc2a9eb0bd55 290 << typeid(T1).name() << ", T2" << typeid(T2).name() << ">,"
narshu 1:cc2a9eb0bd55 291 << std::endl;
narshu 1:cc2a9eb0bd55 292 }
narshu 1:cc2a9eb0bd55 293 };
narshu 1:cc2a9eb0bd55 294
narshu 1:cc2a9eb0bd55 295
narshu 1:cc2a9eb0bd55 296 } // namespace tvmet
narshu 1:cc2a9eb0bd55 297
narshu 1:cc2a9eb0bd55 298 #endif // TVMET_BINARY_FUNCTIONAL_H
narshu 1:cc2a9eb0bd55 299
narshu 1:cc2a9eb0bd55 300 // Local Variables:
narshu 1:cc2a9eb0bd55 301 // mode:C++
narshu 1:cc2a9eb0bd55 302 // tab-width:8
narshu 1:cc2a9eb0bd55 303 // End: