Flow123d  release_1.8.2-1603-g0109a2b
unit_si.hh
Go to the documentation of this file.
1 /*!
2  *
3  * Copyright (C) 2015 Technical University of Liberec. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU General Public License version 3 as published by the
7  * Free Software Foundation. (http://www.gnu.org/licenses/gpl-3.0.en.html)
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12  *
13  *
14  * @file unit_si.hh
15  * @brief
16  */
17 
18 #ifndef UNIT_SI_HH_
19 #define UNIT_SI_HH_
20 
21 #include <vector>
22 #include <string>
23 
24 
25 /**
26  * @brief Class for representation SI units of Fields.
27  *
28  * Units are set through exponents of basic SI units. These exponents are set in methods with same
29  * name as unit symbols (e.g. kg(), K() etc).
30  *
31  * Class contains method that provides formated string representing full unit symbol (usable in
32  * LaTeX output).
33  *
34  * UnitSI object contains flag that says if it is defined
35  * - undefined object can't be formated
36  * - if any exponent is set, flag is set to defined
37  *
38  * Class contains static methods that return frequently used derived units (Watt, Pascal etc).
39  */
40 class UnitSI {
41 public:
42  /// Constructor
43  UnitSI();
44 
45  /// Methods return frequently used derived units
46  /// Returns Newton
47  static UnitSI & N();
48  /// Returns Joule
49  static UnitSI & J();
50  /// Returns Watt
51  static UnitSI & W();
52  /// Returns Pascal
53  static UnitSI & Pa();
54  /// Returns dimensionless unit
55  static UnitSI & dimensionless();
56 
57  /// Methods set values of exponents for SI units with similar name
58  UnitSI & m(int exp = 1);
59  UnitSI & kg(int exp = 1);
60  UnitSI & s(int exp = 1);
61  UnitSI & A(int exp = 1);
62  UnitSI & K(int exp = 1);
63  UnitSI & mol(int exp = 1);
64  UnitSI & cd(int exp = 1);
65  /// The dimension dependent meter: md^y = m^(yd), where 'd' is dimension.
66  UnitSI & md(int exp = -1);
67 
68  /**
69  * Makes unit description string in Latex format, e.g. "$[m.kg^{2}.s^{-2}]$"
70  *
71  * Have assert for undefined units.
72  */
73  std::string format_latex() const;
74 
75  std::string format_text() const;
76 
77  /**
78  * Machine readable JSON format. Units are stored as a record with keys given by
79  * SI units strings (corresponding to setters). Values of the keys are integer.
80  */
81  std::string json() const;
82 
83  /**
84  * Set flag that unit is undefined.
85  *
86  * Default value is true (set in constructor).
87  * If any exponent is set, @p undef_ flag is unset.
88  * In all fields unit must be defined by user.
89  */
90  void undef(bool val = true);
91 
92  /// Return true if the unit is defined.
93  bool is_def() const;
94 
95 private:
96  /// Values determine positions of exponents in exponents_ vector
97  enum UnitOrder {
107  };
108 
109  /// Variable parts of output format. Used in the @p format method.
110  struct OutputFormat {
111  std::string exp_open, exp_close, delimiter;
112  };
113 
114  /**
115  * Symbols for individual units. Can not use static variable due to usage in static initialization.
116  */
117  static const std::string &unit_symbol(unsigned int idx);
118 
119  /// Generic output formating method.
120  std::string format(OutputFormat form) const;
121 
122 
123  /**
124  * Stores exponents of base SI units in the order given by the
125  * UnitOrder enum
126  *
127  * where md represents value of exponent depended on dimension (m^{-d})
128  */
130 
131 
132  /**
133  * Flag if object is undefined.
134  *
135  * Value is set on true in constructor, when any exponent is changed, false value is set.
136  */
137  bool undef_;
138 
139  /// Product of two units.
140  friend UnitSI operator *(const UnitSI &a, const UnitSI &b);
141  /// Proportion of two units.
142  friend UnitSI operator /(const UnitSI &a, const UnitSI &b);
143 };
144 
145 
146 /// Product of two units.
147 UnitSI operator *(const UnitSI &a, const UnitSI &b);
148 
149 /// Proportion of two units.
150 UnitSI operator /(const UnitSI &a, const UnitSI &b);
151 
152 
153 #endif /* UNIT_SI_HH_ */
std::string format(OutputFormat form) const
Generic output formating method.
Definition: unit_si.cc:138
bool is_def() const
Return true if the unit is defined.
Definition: unit_si.cc:195
Variable parts of output format. Used in the format method.
Definition: unit_si.hh:110
std::string format_text() const
Definition: unit_si.cc:121
std::vector< int > exponents_
Definition: unit_si.hh:129
static UnitSI & Pa()
Returns Pascal.
Definition: unit_si.cc:48
UnitOrder
Values determine positions of exponents in exponents_ vector.
Definition: unit_si.hh:97
std::string format_latex() const
Definition: unit_si.cc:111
UnitSI & K(int exp=1)
Definition: unit_si.cc:82
UnitSI & A(int exp=1)
Definition: unit_si.cc:76
friend UnitSI operator/(const UnitSI &a, const UnitSI &b)
Proportion of two units.
Definition: unit_si.cc:213
std::string delimiter
Definition: unit_si.hh:111
UnitSI & cd(int exp=1)
Definition: unit_si.cc:94
static UnitSI & W()
Returns Watt.
Definition: unit_si.cc:43
UnitSI & s(int exp=1)
Definition: unit_si.cc:70
UnitSI & kg(int exp=1)
Definition: unit_si.cc:64
static UnitSI & J()
Returns Joule.
Definition: unit_si.cc:38
friend UnitSI operator*(const UnitSI &a, const UnitSI &b)
Product of two units.
Definition: unit_si.cc:200
std::string exp_close
Definition: unit_si.hh:111
static UnitSI & N()
Definition: unit_si.cc:33
static const std::string & unit_symbol(unsigned int idx)
Definition: unit_si.cc:131
bool undef_
Definition: unit_si.hh:137
UnitSI & mol(int exp=1)
Definition: unit_si.cc:88
UnitSI & m(int exp=1)
Methods set values of exponents for SI units with similar name.
Definition: unit_si.cc:58
Class for representation SI units of Fields.
Definition: unit_si.hh:40
UnitSI & md(int exp=-1)
The dimension dependent meter: md^y = m^(yd), where &#39;d&#39; is dimension.
Definition: unit_si.cc:100
static UnitSI & dimensionless()
Returns dimensionless unit.
Definition: unit_si.cc:53
void undef(bool val=true)
Definition: unit_si.cc:191
std::string exp_open
Definition: unit_si.hh:111
UnitSI()
Constructor.
Definition: unit_si.cc:27
std::string json() const
Definition: unit_si.cc:177