1 // -*- C++ -*-
2 // $Id: AbsParameter.hh,v 1.2 2003/09/06 14:04:13 boudreau Exp $
3 #ifndef _AbsParameter_h_
4 #define _AbsParameter_h_
5 
6 namespace Genfun {
7   class Parameter;
8   class ParameterSum;
9   class ParameterDifference;
10   class ParameterProduct;
11   class ParameterQuotient;
12   class ParameterNegation;
13   class ConstPlusParameter;
14   class ConstMinusParameter;
15   class ConstTimesParameter;
16   class ConstOverParameter;
17 
18   /**
19    * @author
20    * @ingroup genfun
21    */
22   class AbsParameter {
23 
24   public:
25 
26     // Default Constructor
27     AbsParameter();
28 
29     // Copy constructor:
30     AbsParameter(const AbsParameter &);
31 
32     // Destructor
33     virtual ~AbsParameter();
34 
35     // Parameter value
36     virtual double getValue()  const=0;
37 
38     // Every parameter must override this:
39     AbsParameter * clone() const;
40 
41     // Extra lingual type information:
parameter()42     virtual Parameter *parameter() {return 0;}
parameter() const43     virtual const Parameter *parameter() const {return 0;}
44 
45   private:
46 
47     // Cannot assign an AbsParameter:
48     AbsParameter & operator= (const AbsParameter &);
49 
50     virtual AbsParameter *_clone() const=0;
51 
52   };
53 
54 // Now for some additional operations:
55 
56 
57 ConstTimesParameter               operator * (double c, const AbsParameter &op2);
58 ConstPlusParameter                operator + (double c, const AbsParameter &op2);
59 ConstMinusParameter               operator - (double c, const AbsParameter &op2);
60 ConstOverParameter                operator / (double c, const AbsParameter &op2);
61 
62 ConstTimesParameter               operator * (const AbsParameter &op2, double c);
63 ConstPlusParameter                operator + (const AbsParameter &op2, double c);
64 ConstPlusParameter                operator - (const AbsParameter &op2, double c);
65 ConstTimesParameter               operator / (const AbsParameter &op2, double c);
66 
67 
68 ParameterProduct                  operator * (const AbsParameter &op1, const AbsParameter &op2);
69 ParameterSum                      operator + (const AbsParameter &op1, const AbsParameter &op2);
70 ParameterDifference               operator - (const AbsParameter &op1, const AbsParameter &op2);
71 ParameterQuotient                 operator / (const AbsParameter &op1, const AbsParameter &op2);
72 ParameterNegation                 operator - (const AbsParameter &op1);
73 
74 typedef const AbsParameter & GENPARAMETER;
75 
76 } // namespace Genfun
77 
78 // Poor man's covariant return type:
79 #define PARAMETER_OBJECT_DEF(classname)              \
80 public:                                              \
81   classname *clone() const;                          \
82 private:                                             \
83   virtual AbsParameter* _clone() const;
84 
85 // Poor man's covariant return type:
86 #define PARAMETER_OBJECT_IMP(classname)              \
87 classname *classname::clone () const {               \
88   return (classname *) _clone();                     \
89 }                                                    \
90 AbsParameter *classname::_clone () const {           \
91   return new classname(*this);                       \
92 }
93 
94 
95 #include "CLHEP/GenericFunctions/ParameterProduct.hh"
96 #include "CLHEP/GenericFunctions/ParameterSum.hh"
97 #include "CLHEP/GenericFunctions/ParameterDifference.hh"
98 #include "CLHEP/GenericFunctions/ParameterQuotient.hh"
99 #include "CLHEP/GenericFunctions/ParameterNegation.hh"
100 #include "CLHEP/GenericFunctions/ConstPlusParameter.hh"
101 #include "CLHEP/GenericFunctions/ConstMinusParameter.hh"
102 #include "CLHEP/GenericFunctions/ConstTimesParameter.hh"
103 #include "CLHEP/GenericFunctions/ConstOverParameter.hh"
104 
105 #endif
106