00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef PHYSICAL_DIMENSION
00015 #define PHYSICAL_DIMENSION
00016
00017 #include "physical/fixedphysical.hpp"
00018 #include "physical/dynamicphysical.hpp"
00019 #include "physical/formatspec.hpp"
00020
00021
00022 namespace physical {
00023
00024 namespace format {
00025
00026 template<class T>
00027 struct type2type {
00028 typedef T type;
00029 };
00030
00031
00032
00033
00034
00035
00036 class Dimension {
00037 public:
00038 typedef physical::detail::DynamicExponents<SI> exponents_type;
00039
00040 Dimension(std::string name, const exponents_type& e)
00041 : dimensionname(name), exponents_(e) {};
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 template<typename T, class Exponents>
00057 Dimension(std::string name, const FixedPhysical<SI, T, Exponents>&)
00058 : dimensionname(name), exponents_(Exponents()) {};
00059
00060
00061
00062
00063
00064 template<class Quantity>
00065 Dimension(std::string name, const type2type<Quantity>&)
00066 : dimensionname(name), exponents_(typename Quantity::exponents()) {};
00067
00068 Dimension(std::string name, const DynamicPhysical<SI>& q)
00069 : dimensionname(name), exponents_(q.exponents) {};
00070
00071
00072
00073 std::string name() const {return dimensionname;};
00074
00075
00076 exponents_type exponents() const { return exponents_;};
00077
00078 Dimension& add(const FormatSpec<SI>& s) {
00079 if ( s.unit.exponents == exponents()) {
00080 specs.push_back(s);
00081 } else {
00082 throw IncompatibleUnitException("addition of incompatible formatspec");
00083 };
00084 return *this;
00085 };
00086
00087
00088
00089
00090
00091
00092 FormatSpec<SI> favourite() const {return specs[0];};
00093
00094
00095
00096
00097 FormatSpec<SI> get(std::size_t i) const {
00098 if ( 0<=i && i<specs.size() ) {
00099 return specs[0];
00100 } else {
00101 throw std::range_error("Dimension: cannot find spec");
00102 };
00103 }
00104
00105 private:
00106
00107
00108
00109 exponents_type exponents_;
00110
00111
00112 std::string dimensionname;
00113
00114 std::vector<FormatSpec<SI> > specs;
00115 };
00116
00117
00118 template<class Quantity>
00119 struct DimensionDef: public Dimension {
00120 DimensionDef(std::string name): Dimension(name, type2type<Quantity>()){};
00121 };
00122
00123 };
00124
00125 };
00126
00127
00128 #endif