Protium
Math and Design Features
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros Pages
Quantities.h
Go to the documentation of this file.
1 #ifndef Protium_Quantities_h_
2 #define Protium_Quantities_h_
3 
6 
7 namespace Protium{
8 
9  namespace Design{
10 
12 
14  template <typename T, class Dimensions>
15  struct Quantity{
16  explicit Quantity(T x) : fValue(x) {}
17 
18  template<class OtherDimensions>
19  Quantity(const OtherDimensions& rhs ) :fValue(rhs.Value()){
21  ERROR_QUANTITIES_NOT_EQUAL_DIMENSIONS() );
22  }
23 
24  T Value() const { return fValue; }
25  const T& ConstValue() const {return fValue;}
26  private:
27  T fValue;
28  };
29 
31 
33  template <class T, class D>
35  return Quantity<T,D>(x.Value() + y.Value());
36  }
37 
39 
41  template <class T, class D>
43  return Quantity<T,D>(x.Value() - y.Value());
44  }
45 
47  template <class T, class D1, class D2>
49  typedef typename DimensionAdd<D1,D2>::Type dim;
50  return Quantity<T,dim>( x.Value() * y.Value() );
51  }
52 
54  template <class T, class D1, class D2>
56  typedef typename DimensionSubtract<D1,D2>::Type dim;
57  return Quantity<T,dim>( x.Value() / y.Value() );
58  }
59 
60  }
61 
62  //everything in double, since that's the limit that we're calculating to
63 #ifdef PROTIUM_DEBUG
64  typedef Design::Quantity<double, Design::scalar> Scalar;
65  typedef Design::Quantity<double, Design::mass> Mass;
66  typedef Design::Quantity<double, Design::length> Length;
67  typedef Design::Quantity<double, Design::time> Time;
68  typedef Design::Quantity<double, Design::charge> Charge;
69  typedef Design::Quantity<double, Design::temperature> Temperature;
70  typedef Design::Quantity<double, Design::intensity> Intensity;
71  typedef Design::Quantity<double, Design::angle> Angle;
72 
73  //Derived quantities (To be partially speciallized on mec change)
74  typedef Design::Quantity<double, Design::velocity> Velocity;
75  typedef Design::Quantity<double, Design::rate> Rate;
76  typedef Design::Quantity<double, Design::energy> Energy;
77  typedef Design::Quantity<double, Design::action> Action;
78  typedef Design::Quantity<double, Design::fermiDimension> FermiQuantity;
79  typedef Design::Quantity<double, Design::magneticFluxDensity> MagneticFluxDensity;
80  typedef Design::Quantity<double, Design::eleccFluxDensity> EleccFluxDensity;
81 #else
82  typedef double Scalar;
83  typedef double Mass;
84  typedef double Length;
85  typedef double Time;
86  typedef double Charge;
87  typedef double Temperature;
88  typedef double Intensity;
89  typedef double Angle;
90 
91  //Derived quantities (To be partially speciallized on mec change)
92  typedef double Velocity;
93  typedef double Rate;
94  typedef double Energy;
95  typedef double Action;
96  typedef double FermiQuantity;
97  typedef double MagneticFluxDensity;
98  typedef double EleccFluxDensity;
99 #endif
100 }
101 
102 #endif //Protium_Quantities_h_
double Length
Definition: Quantities.h:84
double Charge
Definition: Quantities.h:86
double EleccFluxDensity
Definition: Quantities.h:98
double Angle
Definition: Quantities.h:89
double FermiQuantity
Definition: Quantities.h:96
Maps to types to a new type.
Definition: Types.h:36
Quantity< T, D > operator-(Quantity< T, D > x, Quantity< T, D > y)
Defines dimensionful quantity subtraction.
Definition: Quantities.h:42
double Temperature
Definition: Quantities.h:87
#define PROTIUM_STATIC_ASSERT(expr, msg)
Use for performing static assertion.
Definition: Assert.h:16
Defines a dimensionful quantities.
Definition: Quantities.h:15
double Mass
Definition: Quantities.h:83
double Intensity
Definition: Quantities.h:88
double Scalar
Definition: Quantities.h:82
const T & ConstValue() const
Definition: Quantities.h:25
double MagneticFluxDensity
Definition: Quantities.h:97
Quantity(const OtherDimensions &rhs)
Definition: Quantities.h:19
double Energy
Definition: Quantities.h:94
General list of types. Points to Head and Tail.
Definition: Types.h:53
Quantity< T, typename DimensionAdd< D1, D2 >::Type > operator*(Quantity< T, D1 > x, Quantity< T, D2 > y)
Defines dimensionful multiplication.
Definition: Quantities.h:48
double Time
Definition: Quantities.h:85
double Velocity
Definition: Quantities.h:92
Quantity< T, D > operator+(Quantity< T, D > x, Quantity< T, D > y)
Defines dimensionful quantity addition.
Definition: Quantities.h:34
Quantity< T, typename DimensionSubtract< D1, D2 >::Type > operator/(Quantity< T, D1 > x, Quantity< T, D2 > y)
Defines dimensionful Division.
Definition: Quantities.h:55
double Action
Definition: Quantities.h:95
double Rate
Definition: Quantities.h:93