00001 #ifndef PhysicsTools_Utilities_Minus_h 00002 #define PhysicsTools_Utilities_Minus_h 00003 00004 namespace funct { 00005 00006 template<typename A> 00007 struct MinusStruct { 00008 MinusStruct() : _() { } 00009 MinusStruct(const A & a) : _(a) { } 00010 operator double() const { 00011 return - _(); 00012 } 00013 double operator()() const { 00014 return - _(); 00015 } 00016 double operator()(double x) const { 00017 return - _(x); 00018 } 00019 double operator()(double x, double y) const { 00020 return - _(x, y); 00021 } 00022 A _; 00023 }; 00024 00025 template<typename A> 00026 struct Minus { 00027 typedef MinusStruct<A> type; 00028 static type operate(const A& a) { 00029 return type(a); 00030 } 00031 }; 00032 00033 template<typename A> 00034 inline typename Minus<A>::type operator-(const A& a) { 00035 return Minus<A>::operate(a); 00036 } 00037 } 00038 00039 #endif