CMS 3D CMS Logo

SimplifyNumerical.h
Go to the documentation of this file.
1 #ifndef PhysicsTools_Utilities_SimplifyNumerical_h
2 #define PhysicsTools_Utilities_SimplifyNumerical_h
6 
7 namespace funct {
8 
9  template<int n, int m>
10  struct Sum<Numerical<n>, Numerical<m> > {
12  inline static type combine(const Numerical<n>&, const Numerical<m>&)
13  { return type(); }
14  };
15 
16  template<int n, int m>
17  struct Difference<Numerical<n>, Numerical<m> > {
18  typedef Numerical<n - m> type;
19  inline static type combine(const Numerical<n>&, const Numerical<m>&)
20  { return type(); }
21  };
22 
23 template<int n>
24  struct Minus<Numerical<n> > {
25  typedef Numerical<- n> type;
26  inline static type operate(const Numerical<n>&)
27  { return type(); }
28  };
29 
30  template<int n, int m>
31  struct Product<Numerical<n>, Numerical<m> > {
33  inline static type combine(const Numerical<n>&, const Numerical<m>&)
34  { return type(); }
35  };
36 
37  template<int n>
38  struct Ratio<Numerical<n>, Numerical<1> > {
39  typedef Numerical<n> type;
40  inline static type combine(const Numerical<n>&, const Numerical<1>&)
41  { return type(); }
42  };
43 
44  // n ^ m = n * n ^ ( m - 1 )
45  template<int n, int m, bool posM = (m > 0)>
46  struct NumPower {
48  inline static type combine(const Numerical<n>&, const Numerical<m>&)
49  { return type(); }
50  };
51 
52  // 1 ^ m = 1
53  template<int m, bool posM>
54  struct NumPower<1, m, posM> {
55  typedef Numerical<1> type;
56  inline static type combine(const Numerical<1>&, const Numerical<m>&)
57  { return type(); }
58  };
59 
60  // n ^ 1 = n
61  template<int n>
62  struct NumPower<n, 1, true> {
63  typedef Numerical<n> type;
64  inline static type combine(const Numerical<n>&, const Numerical<1>&)
65  { return type(); }
66  };
67 
68  // n ^ 0 = 1
69  template<int n>
70  struct NumPower<n, 0, true> {
71  typedef Numerical<1> type;
72  inline static type combine(const Numerical<n>&, const Numerical<0>&)
73  { return type(); }
74  };
75 
76  // n ^ (-m) = 1 / n ^ m
77  template<int n, int m>
78  struct NumPower<n, m, false> {
79  typedef typename Fraction<1, NumPower<n, -m>::type::value>::type type;
80  inline static type combine(const Numerical<n>&, const Numerical<m>&)
81  { return type(); }
82  };
83 
84  template<int n, int m>
85  struct Power<Numerical<n>, Numerical<m> > : public NumPower<n, m> {
86  };
87 
88 
89 }
90 
91 #endif
static type combine(const Numerical< n > &, const Numerical< 1 > &)
Definition: Abs.h:5
static type combine(const Numerical< n > &, const Numerical< m > &)
static type combine(const Numerical< n > &, const Numerical< 1 > &)
static type combine(const Numerical< n > &, const Numerical< m > &)
static type combine(const Numerical< n > &, const Numerical< 0 > &)
static type combine(const Numerical< n > &, const Numerical< m > &)
SumStruct< A, B > type
Definition: Sum.h:27
static type operate(const Numerical< n > &)
static type combine(const Numerical< n > &, const Numerical< m > &)
Definition: Sum.h:26
Numerical< n *NumPower< n, m-1 >::type::value > type
Fraction< 1, NumPower< n,-m >::type::value >::type type
static type combine(const Numerical< n > &, const Numerical< m > &)
static type combine(const Numerical< 1 > &, const Numerical< m > &)