00001 #ifndef PhysicsTools_Utilities_ParametricTrait_h 00002 #define PhysicsTools_Utilities_ParametricTrait_h 00003 00004 #include "PhysicsTools/Utilities/interface/Functions.h" 00005 #include "PhysicsTools/Utilities/interface/Fraction.h" 00006 #include "PhysicsTools/Utilities/interface/Operations.h" 00007 00008 namespace funct { 00009 00010 template<typename F> 00011 struct Parametric { 00012 static const int value = 1; 00013 }; 00014 00015 template<int n> 00016 struct Parametric<Numerical<n> > { 00017 static const int value = 0; 00018 }; 00019 00020 template<int n, int m> 00021 struct Parametric<FractionStruct<n, m> > { 00022 static const int value = 0; 00023 }; 00024 00025 #define NON_PARAMETRIC( FUN ) \ 00026 template<> struct Parametric<FUN> { \ 00027 static const int value = 0; \ 00028 } 00029 00030 #define NON_PARAMETRIC_UNARY(FUN) \ 00031 template<typename A> \ 00032 struct Parametric<FUN<A> > { \ 00033 static const int value = Parametric<A>::value; \ 00034 } 00035 00036 NON_PARAMETRIC_UNARY(AbsStruct); 00037 NON_PARAMETRIC_UNARY(SgnStruct); 00038 NON_PARAMETRIC_UNARY(ExpStruct); 00039 NON_PARAMETRIC_UNARY(LogStruct); 00040 NON_PARAMETRIC_UNARY(SinStruct); 00041 NON_PARAMETRIC_UNARY(CosStruct); 00042 NON_PARAMETRIC_UNARY(TanStruct); 00043 NON_PARAMETRIC_UNARY(MinusStruct); 00044 00045 #define NON_PARAMETRIC_BINARY(FUN) \ 00046 template<typename A, typename B> \ 00047 struct Parametric<FUN<A, B> > { \ 00048 static const int value = Parametric<A>::value || Parametric<A>::value; \ 00049 } 00050 00051 NON_PARAMETRIC_BINARY(SumStruct); 00052 NON_PARAMETRIC_BINARY(ProductStruct); 00053 NON_PARAMETRIC_BINARY(RatioStruct); 00054 NON_PARAMETRIC_BINARY(PowerStruct); 00055 00056 #undef NON_PARAMETRIC_UNARY 00057 #undef NON_PARAMETRIC_BINARY 00058 00059 } 00060 00061 00062 #endif