qqbarthreshold is hosted by Hepforge, IPPP Durham
QQbar_threshold
threshold.hpp
Go to the documentation of this file.
1 
40 #pragma once
41 #include <memory>
42 
43 #include "parameters.hpp"
44 
45 //-
46 namespace QQbar_threshold{
47  namespace detail{
53  template<typename E>
54  struct expression{
59  double value(double thr) const{
60  return static_cast<E const *>(this)->value(thr);
61  }
62 
66  operator E&(){
67  return static_cast<E&>(*this);
68  }
69 
70  operator E const &() const{
71  return static_cast<E const &>(*this);
72  }
73  };
74 
80  template<typename E1, typename E2>
81  class difference: public expression<difference<E1,E2>>{
82  std::shared_ptr<E1> x;
83  std::shared_ptr<E2> y;
84  public:
85  difference(expression<E1> const & e1, expression<E2> const & e2)
86  : x(std::make_shared<E1>(e1)), y(std::make_shared<E2>(e2)) {}
87 
88  double value(double thr) const{
89  return x->value(thr) - y->value(thr);
90  }
91  };
92 
96  template<typename E1, typename E2>
97  class sum: public expression<sum<E1,E2>>{
98  std::shared_ptr<E1> x;
99  std::shared_ptr<E2> y;
100  public:
101  sum(expression<E1> const & e1, expression<E2> const & e2)
102  : x(std::make_shared<E1>(e1)), y(std::make_shared<E2>(e2)) {}
103 
104  double value(double thr) const{
105  return x->value(thr) + y->value(thr);
106  }
107  };
108 
112  template<typename E1, typename E2>
113  class product: public expression<product<E1,E2>>{
114  std::shared_ptr<E1> x;
115  std::shared_ptr<E2> y;
116  public:
117  product(expression<E1> const & e1, expression<E2> const & e2)
118  : x(std::make_shared<E1>(e1)), y(std::make_shared<E2>(e2)) {}
119 
120  double value(double thr) const{
121  return x->value(thr) * y->value(thr);
122  }
123  };
124 
128  template<typename E1, typename E2>
129  class ratio: public expression<ratio<E1,E2>>{
130  std::shared_ptr<E1> x;
131  std::shared_ptr<E2> y;
132  public:
133  ratio(expression<E1> const & e1, expression<E2> const & e2)
134  : x(std::make_shared<E1>(e1)), y(std::make_shared<E2>(e2)) {}
135 
136  double value(double thr) const{
137  return x->value(thr) / y->value(thr);
138  }
139  };
140 
144  template<typename E>
145  class neg: public expression<neg<E>>{
146  std::shared_ptr<E> x;
147  public:
148  explicit neg(expression<E> const & e): x(std::make_shared<E>(e)) {}
149 
150  double value(double thr) const{
151  return -x->value(thr);
152  }
153  };
154 
159  class double_expr: public expression<double_expr>{
160  double const x;
161  public:
162  explicit double_expr(double d): x(d) {}
163 
164  double value(double) const{
165  return x;
166  }
167  };
168 
169  //arithmetic operations ...
170  template<typename E1, typename E2>
171  sum<E1, E2> operator+(expression<E1> const & e1, expression<E2> const & e2){
172  return sum<E1, E2>{e1, e2};
173  }
174 
175  template<typename E1, typename E2>
176  difference<E1, E2> operator-(expression<E1> const & e1, expression<E2> const & e2){
177  return difference<E1, E2>{e1, e2};
178  }
179 
180  template<typename E1, typename E2>
181  product<E1, E2> operator*(expression<E1> const & e1, expression<E2> const & e2){
182  return product<E1, E2>{e1, e2};
183  }
184 
185  template<typename E1, typename E2>
186  ratio<E1, E2> operator/(expression<E1> const & e1, expression<E2> const & e2){
187  return ratio<E1, E2>{e1, e2};
188  }
189 
190  template<typename E>
191  neg<E> operator-(expression<E> const & e){
192  return neg<E>(e);
193  }
194 
195  template<typename E1>
196  difference<E1, double_expr> operator-(expression<E1> const & e1, double x){
197  return e1 - double_expr{x};
198  }
199 
200  template<typename E1>
201  sum<E1, double_expr> operator+(expression<E1> const & e1, double x){
202  return e1 + double_expr{x};
203  }
204 
205  template<typename E1>
206  product<E1, double_expr> operator*(expression<E1> const & e1, double x){
207  return e1 * double_expr{x};
208  }
209 
210  template<typename E1>
211  ratio<E1, double_expr> operator/(expression<E1> const & e1, double x){
212  return e1 / double_expr{x};
213  }
214 
215  template<typename E2>
216  sum<double_expr, E2> operator+(double x, expression<E2> const & e2){
217  return double_expr{x} + e2;
218  }
219 
220  template<typename E2>
221  difference<double_expr, E2> operator-(double x, expression<E2> const & e2){
222  return double_expr{x} - e2;
223  }
224 
225  template<typename E2>
226  product<double_expr, E2> operator*(double x, expression<E2> const & e2){
227  return double_expr{x} * e2;
228  }
229 
230  template<typename E2>
231  ratio<double_expr, E2> operator/(double x, expression<E2> const & e2){
232  return double_expr{x} / e2;
233  }
234 
235  }
236 
238 
255  struct threshold : public detail::expression<threshold>{
256  double value(double thr) const{
257  return thr;
258  }
259  };
260 
261 
262 
263 }
Definition: alpha_s.hpp:37
Center-of-mass energy of a quark threshold.
Definition: threshold.hpp:255
constexpr double e
Electric charge of the electron in units of the positron charge.
Definition: constants.hpp:68
Options for functions.