2 #include "../icedb/units/units.hpp" 3 #include "../icedb/units/unitsPlugins.hpp" 4 #include "../private/unitsBackend.hpp" 5 #include "../private/options.hpp" 9 namespace implementations {
11 const std::string in = opts->getVal<std::string>(
"inUnits");
12 const std::string out = opts->getVal<std::string>(
"outUnits");
14 if (test._valid)
return true;
19 const std::string in = opts->getVal<std::string>(
"inUnits");
20 const std::string out = opts->getVal<std::string>(
"outUnits");
21 std::shared_ptr<simpleUnits> res(
new simpleUnits(in, out,
true));
41 bool inV =
false, outV =
false;
43 if (_inUnits ==
"nm") {
_convFactor /= 1e9; inV =
true; }
44 if (_inUnits ==
"um" || _inUnits ==
"microns" || _inUnits ==
"micrometers")
48 if (_inUnits ==
"mm") {
_convFactor /= 1e3; inV =
true; }
49 if (_inUnits ==
"cm") {
_convFactor *= 0.01; inV =
true; }
50 if (_inUnits ==
"km") {
_convFactor *= 1000.; inV =
true; }
51 if (_inUnits ==
"m") inV =
true;
52 if (_outUnits ==
"nm") {
_convFactor *= 1e9; outV =
true; }
53 if (_outUnits ==
"um" || _outUnits ==
"microns" || _outUnits ==
"micrometers")
57 if (_outUnits ==
"mm") {
_convFactor *= 1e3; outV =
true; }
58 if (_outUnits ==
"cm") {
_convFactor *= 100.; outV =
true; }
59 if (_outUnits ==
"km") {
_convFactor /= 1000.; outV =
true; }
60 if (_outUnits ==
"m") outV =
true;
62 if (inV && outV) {
return true; }
66 bool inV =
false, outV =
false;
68 if (_inUnits ==
"GHz") {
_convFactor *= 1e9; inV =
true; }
69 if (_inUnits ==
"MHz") {
_convFactor *= 1e6; inV =
true; }
70 if (_inUnits ==
"KHz") {
_convFactor *= 1e3; inV =
true; }
71 if (_inUnits ==
"Hz" || _inUnits ==
"s^-1" || _inUnits ==
"1/s") inV =
true;
72 if (_outUnits ==
"GHz") {
_convFactor /= 1e9; outV =
true; }
73 if (_outUnits ==
"MHz") {
_convFactor /= 1e6; outV =
true; }
74 if (_outUnits ==
"KHz") {
_convFactor /= 1e3; outV =
true; }
75 if (_outUnits ==
"Hz" || _outUnits ==
"s^-1" || _outUnits ==
"1/s") outV =
true;
77 if (inV && outV) {
return true; }
81 bool inV =
false, outV =
false;
86 if (in.find(
"^3") == std::string::npos) in.append(
"^3");
87 if (out.find(
"^3") == std::string::npos) out.append(
"^3");
88 if (in ==
"nm^3") {
_convFactor /= 1e27; inV =
true; }
89 if (in ==
"um^3") {
_convFactor /= 1e18; inV =
true; }
90 if (in ==
"mm^3") {
_convFactor /= 1e9; inV =
true; }
91 if (in ==
"cm^3") {
_convFactor /= 1e6; inV =
true; }
92 if (in ==
"km^3") {
_convFactor *= 1e6; inV =
true; }
93 if (in ==
"m^3") inV =
true;
94 if (out ==
"nm^3") {
_convFactor *= 1e27; outV =
true; }
95 if (out ==
"um^3") {
_convFactor *= 1e18; outV =
true; }
96 if (out ==
"mm^3") {
_convFactor *= 1e9; outV =
true; }
97 if (out ==
"cm^3") {
_convFactor *= 1e6; outV =
true; }
98 if (out ==
"km^3") {
_convFactor /= 1e6; outV =
true; }
99 if (out ==
"m^3") outV =
true;
100 if (inV && outV) {
return true; }
104 bool inV =
false, outV =
false;
106 if (in ==
"mb" || in ==
"millibar") {
_convFactor *= 100; inV =
true; }
107 if (in ==
"hPa") {
_convFactor *= 100; inV =
true; }
108 if (in ==
"Pa") inV =
true;
109 if (in ==
"kPa") {
_convFactor *= 1000; inV =
true; }
110 if (in ==
"bar") {
_convFactor *= 100000; inV =
true; }
111 if (out ==
"mb" || out ==
"millibar" || out ==
"hPa") {
_convFactor /= 100; outV =
true; }
112 if (out ==
"bar") {
_convFactor /= 100000; outV =
true; }
113 if (out ==
"Pa") outV =
true;
114 if (out ==
"kPa") {
_convFactor /= 1000; outV =
true; }
115 if (inV && outV) {
return true; }
119 bool inV =
false, outV =
false;
121 if (in ==
"ug") {
_convFactor /= 1e9; inV =
true; }
122 if (in ==
"mg") {
_convFactor /= 1e6; inV =
true; }
124 if (in ==
"kg") inV =
true;
125 if (out ==
"ug") {
_convFactor *= 1e9; outV =
true; }
126 if (out ==
"mg") {
_convFactor *= 1e6; outV =
true; }
127 if (out ==
"g") {
_convFactor *= 1e3; outV =
true; }
128 if (out ==
"kg") outV =
true;
129 if (inV && outV) {
return true; }
134 bool inV =
false, outV =
false;
136 if (in ==
"K" || in ==
"degK") inV =
true;
137 if (in ==
"C" || in ==
"degC") { inV =
true;
_inOffset += 273.15; }
139 if (in ==
"R" || in ==
"degR") { inV =
true;
_convFactor *= 5. / 9; }
140 if (out ==
"K" || out ==
"degK") outV =
true;
141 if (out ==
"C" || out ==
"degC") { outV =
true;
_outOffset -= 273.15; }
143 if (out ==
"R" || out ==
"degR") { outV =
true;
_convFactor *= 9. / 5.; }
144 if (inV && outV) {
return true; }
153 bool inV =
false, outV =
false;
154 if (in ==
"m^-3") inV =
true;
155 if (in ==
"cm^-3") { inV =
true;
_convFactor *= 1e6; }
156 if (out ==
"cm^-3") { outV =
true;
_convFactor /= 1e6; }
157 if (out ==
"m^-3") outV =
true;
158 if (inV && outV) {
return true; }
159 if (in ==
"ppmv" && out ==
"ppmv") {
return true; }
175 const std::string in = opts->getVal<std::string>(
"inUnits");
176 const std::string out = opts->getVal<std::string>(
"outUnits");
181 if ((inIsLen || inIsWv) && (outIsLen || outIsWv))
return true;
186 const std::string in = opts->getVal<std::string>(
"inUnits");
187 const std::string out = opts->getVal<std::string>(
"outUnits");
194 if ((inIsLen && outIsLen) || (inIsWv && outIsWv)) {
195 return std::shared_ptr<simpleUnits>(
new simpleUnits(in, out,
true));
198 std::shared_ptr<spectralUnits> res(
new spectralUnits(in, out));
210 if (res->hIn && res->hOut) res->_valid =
true;
211 else res->_valid =
false;
227 res =
hIn->convert(res);
229 const double c = 2.99792458e8;
231 if (
_Iin) res = c / res;
233 if (
_Iout) res = c / res;
234 res =
hOut->convert(res);
static bool canConvert(Converter_registry_provider::optsType opts)
bool validMass(const std::string &in, const std::string &out)
simpleUnits(const std::string &in, const std::string &out, bool init=true)
bool validPres(const std::string &in, const std::string &out)
static bool canConvert(Converter_registry_provider::optsType opts)
static Unithandler_p getConverter(const std::string &inUnits, const std::string &outUnits)
registry::const_options_ptr optsType
virtual bool isValid() const
bool validLength(const std::string &_inUnits, const std::string &_outUnits)
static std::shared_ptr< const implementations::Unithandler > constructConverter(Converter_registry_provider::optsType opts)
virtual double convert(double input) const
static bool canConvert(const std::string &inUnits, const std::string &outUnits)
Check if two units can be interconverted.
std::shared_ptr< const implementations::Unithandler > hOut
bool validTemp(const std::string &in, const std::string &out)
std::shared_ptr< const implementations::Unithandler > hIn
bool validFreq(const std::string &_inUnits, const std::string &_outUnits)
Opaque object provided to perform unit manipulations.
virtual bool isValid() const
bool validVol(const std::string &_inUnits, const std::string &_outUnits)
double convert(double inVal) const
bool validDens(const std::string &in, const std::string &out)
spectralUnits(const std::string &in, const std::string &out)
static std::shared_ptr< const Unithandler > constructConverter(Converter_registry_provider::optsType opts)