00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef Template_Tools_H
00010 #define Template_Tools_H
00011
00017 namespace ThePEG {
00018
00020 template <int v>
00021 struct Int2Type
00022 {
00023 enum { value = v };
00024 };
00025
00027 struct DummyType {};
00028
00030 template <typename T, typename U>
00031 struct BinaryOpTraits;
00032
00035 template <>
00036 struct BinaryOpTraits<double,double> {
00038 typedef double MulT;
00041 typedef double DivT;
00042 };
00043
00044 template <>
00045 struct BinaryOpTraits<long double, long double> {
00047 typedef long double MulT;
00050 typedef long double DivT;
00051 };
00052
00053 template <>
00054 struct BinaryOpTraits<int,int> {
00056 typedef int MulT;
00059 typedef int DivT;
00060 };
00061
00064
00065 enum ImplSelector { Dimensioned, Standard };
00066
00068 typedef Int2Type<Dimensioned> DimensionT;
00069
00071 typedef Int2Type<Standard> StandardT;
00072
00073
00075 template <typename T>
00076 struct TypeTraits
00077 {
00079 enum { hasDimension = false };
00081 typedef StandardT DimType;
00083 static const double baseunit;
00084 };
00085
00087 template<typename T>
00088 const double TypeTraits<T>::baseunit = T(1);
00089
00090 }
00091
00092 #endif