Skip to content

Commit

Permalink
Reorder the string generation (#303)
Browse files Browse the repository at this point in the history
* Reorder the string generation to prioritize base units when generating strings

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
  • Loading branch information
phlptp and pre-commit-ci[bot] authored Aug 6, 2023
1 parent f6c672f commit e873166
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 26 deletions.
6 changes: 3 additions & 3 deletions config/cppcheck_suppressions.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
unusedFunction:units/x12_conv.cpp:1024
unusedFunction:units/r20_conv.cpp:2738
unusedFunction:units/x12_conv.cpp:1009
passedByValue:units/units.cpp:215
passedByValue:units/units.cpp:1147
passedByValue:units/units.cpp:1164
passedByValue:units/units.cpp:222
passedByValue:units/units.cpp:1154
passedByValue:units/units.cpp:1171
14 changes: 12 additions & 2 deletions test/test_unit_strings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ TEST(unitStrings, squared)

TEST(unitStrings, Combos)
{
EXPECT_EQ(to_string(V / km), "V/km");
EXPECT_EQ(to_string(V / km), "mV/m");
EXPECT_EQ(to_string(currency / MWh), "$/MWh");
EXPECT_EQ(to_string(currency / mile), "$/mi");
EXPECT_EQ(to_string(kW / gal), "kW/gal");
Expand Down Expand Up @@ -416,6 +416,14 @@ TEST(unitStrings, Hertz)
EXPECT_EQ(to_string(precise::tera * precise::Hz), "THz");
}

TEST(unitStrings, singleBase)
{
EXPECT_EQ(to_string(precise::kilo * precise::J / precise::mol), "kJ/mol");
EXPECT_EQ(
to_string(precise::kilo * precise::J / precise::rad.pow(2)),
"kJ/rad^2");
}

TEST(unitStrings, watthours)
{
EXPECT_EQ(to_string(precise::A * precise::s), "C");
Expand Down Expand Up @@ -1143,7 +1151,9 @@ TEST(userDefinedUnits, definitions)

EXPECT_EQ(to_string(clucks * V), "clucks*V");

EXPECT_EQ(to_string(clucks * mol), "mol*clucks");
EXPECT_EQ(to_string(clucks * mol), "clucks*mol");

EXPECT_EQ(to_string(clucks * hp), "hp*clucks");

EXPECT_EQ(to_string(clucks.pow(2) * kg), "kg*clucks^2");

Expand Down
48 changes: 27 additions & 21 deletions units/units.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,9 +164,17 @@ static const umap base_unit_names = getDefinedBaseUnitNames();

using ustr = std::pair<precise_unit, const char*>;
// units to divide into tests to explore common multiplier units
static UNITS_CPP14_CONSTEXPR_OBJECT std::array<ustr, 23> testUnits{
static UNITS_CPP14_CONSTEXPR_OBJECT std::array<ustr, 29> testUnits{
{ustr{precise::m, "m"},
ustr{precise::s, "s"},
ustr{precise::kg, "kg"},
ustr{precise::mol, "mol"},
ustr{precise::currency, "$"},
ustr{precise::rad, "rad"},
ustr{precise::count, "item"},
ustr{precise::candela, "cd"},
ustr{precise::Ampere, "A"},
ustr{precise::Kelvin, "K"},
ustr{precise::ms, "ms"},
ustr{precise::min, "min"},
ustr{precise::hr, "hr"},
Expand All @@ -177,9 +185,7 @@ static UNITS_CPP14_CONSTEXPR_OBJECT std::array<ustr, 23> testUnits{
ustr{constants::c.as_unit(), "[c]"},
ustr{constants::h.as_unit(), "[h]"},
ustr{precise::L, "L"},
ustr{precise::kg, "kg"},
ustr{precise::km, "km"},
ustr{precise::currency, "$"},
ustr{precise::volt, "V"},
ustr{precise::watt, "W"},
ustr{precise::electrical::kW, "kW"},
Expand All @@ -191,10 +197,11 @@ static UNITS_CPP14_CONSTEXPR_OBJECT std::array<ustr, 23> testUnits{

// units to divide into tests to explore common multiplier units which can be
// multiplied by power
static UNITS_CPP14_CONSTEXPR_OBJECT std::array<ustr, 5> testPowerUnits{
static UNITS_CPP14_CONSTEXPR_OBJECT std::array<ustr, 6> testPowerUnits{
{ustr{precise::m, "m"},
ustr{precise::km, "km"},
ustr{precise::s, "s"},
ustr{precise::radian, "rad"},
ustr{precise::km, "km"},
ustr{precise::ft, "ft"},
ustr{precise::mile, "mi"}}};

Expand Down Expand Up @@ -1567,11 +1574,22 @@ static std::string
return std::string("1/") + prefix;
}

// let's try common units
// let's try common unit combinations
std::string beststr;

for (const auto& tu : testUnits) {
auto res = probeUnit(un, tu);
if (!res.empty()) {
return res;
auto str = probeUnit(un, tu);
if (!str.empty()) {
return str;
}
str = probeUnitBase(un, tu);
if (!str.empty()) {
if (!isNumericalStartCharacter(str.front())) {
return str;
}
if (beststr.empty() || str.size() < beststr.size()) {
beststr = str;
}
}
}

Expand Down Expand Up @@ -1617,19 +1635,7 @@ static std::string
return res;
}
}
std::string beststr;

for (const auto& tu : testUnits) {
auto str = probeUnitBase(un, tu);
if (!str.empty()) {
if (!isNumericalStartCharacter(str.front())) {
return str;
}
if (beststr.empty() || str.size() < beststr.size()) {
beststr = str;
}
}
}
if (allowUserDefinedUnits.load(std::memory_order_acquire)) {
for (const auto& udu : user_defined_unit_names) {
auto str = probeUnitBase(
Expand Down

0 comments on commit e873166

Please sign in to comment.