00001 #ifndef PhysicsTools_Utilities_Power_h 00002 #define PhysicsTools_Utilities_Power_h 00003 #include <boost/static_assert.hpp> 00004 #include <cmath> 00005 00006 namespace funct { 00007 template<typename A, typename B> 00008 struct PowerStruct { 00009 PowerStruct(const A & a, const B & b) : _1(a), _2(b) { } 00010 double operator()() const { 00011 return std::pow(_1(), _2()); 00012 } 00013 operator double() const { 00014 return std::pow(_1(), _2()); 00015 } 00016 double operator()(double x) const { 00017 return std::pow(_1(x), _2(x)); 00018 } 00019 double operator()(double x, double y) const { 00020 return std::pow(_1(x, y), _2(x, y)); 00021 } 00022 A _1; 00023 B _2; 00024 }; 00025 00026 template<typename A, typename B> 00027 struct Power { 00028 typedef PowerStruct<A, B> type; 00029 static type combine(const A& a, const B& b) { 00030 return type(a, b); 00031 } 00032 }; 00033 00034 template<typename A, typename B> 00035 inline typename Power<A, B>::type operator^(const A& a, const B& b) { 00036 return Power<A, B>::combine(a, b); 00037 } 00038 00039 template<typename A, typename B> 00040 inline typename Power<A, B>::type pow(const A& a, const B& b) { 00041 return Power<A, B>::combine(a, b); 00042 } 00043 00044 } 00045 00046 #endif