29 inline static const std::map<std::string, std::pair<double,std::array<int,7>>>
base_units =
31 {
"1", {1.0, {0,0,0,0,0,0,0}}},
32 {
"m", {1.0, {1,0,0,0,0,0,0}}},
33 {
"s", {1.0, {0,1,0,0,0,0,0}}},
34 {
"kg", {1.0, {0,0,1,0,0,0,0}}},
35 {
"K", {1.0, {0,0,0,1,0,0,0}}},
36 {
"A", {1.0, {0,0,0,0,1,0,0}}},
37 {
"mol",{1.0, {0,0,0,0,0,1,0}}},
38 {
"cd", {1.0, {0,0,0,0,0,0,1}}}
253 Unit(
const std::pair<
double, std::array<int, 7>>& p) : std::pair<double, std::array<int, 7>>(p) {}
266 std::vector<std::string> split;
267 std::stringstream ss(unit);
269 while (std::getline(ss, item,
'_')) {
270 split.push_back(item);
272 if (split.size() == 2)
274 return Parse(std::stod(split[0]),split[1]);
276 else if (split.size() == 1)
286 value = std::strtod(unit.c_str(), &end);
290 if (end != unit.data() && *end ==
'\0')
304 throw std::runtime_error(
"Invalid unit string "+unit);
413 auto join = [] (std::vector<std::string>vec,std::string sep){
414 std::ostringstream oss;
415 for (
size_t i = 0; i < vec.size(); ++i) {
417 if (i < vec.size() - 1) {
424 std::vector<std::string> num, den;
425 for (
unsigned int i = 0 ; i < this->second.size(); i++)
427 if (this->second[i] > 1)
428 num.push_back(
normalization[i].first +
"^" + std::to_string(this->second[i]));
429 else if (this->second[i] == 1)
431 else if (this->second[i] == -1)
433 else if (this->second[i] < -1)
434 den.push_back(
normalization[i].first +
"^" + std::to_string(std::abs(this->second[i])));
438 if (num.size()) ret = join(num,
"*");
440 if (den.size()) ret +=
"/" + join(den,
"/");