mirror of
https://github.com/mpusz/mp-units.git
synced 2025-08-02 03:44:27 +02:00
feat: common unit symbols now use EQUIV{u1, u2, ...}
syntax
This commit is contained in:
@@ -272,8 +272,8 @@ kg⋅m⋅s⁻²
|
||||
|
||||
Some [common units](systems_of_units.md#common-units) expressed with a specialization of the
|
||||
`common_unit` class template need special printing rules for their symbols. As they represent
|
||||
a minimum set of common units resulting from the addition or subtraction of multiple quantities,
|
||||
we print all of them as a scaled version of the source unit. For example the following:
|
||||
a minimum set of equivalent common units resulting from the addition or subtraction of multiple
|
||||
quantities, we print all of them as a scaled version of the source unit. For example the following:
|
||||
|
||||
```cpp
|
||||
std::cout << 1 * km + 1 * mi << "\n";
|
||||
@@ -284,9 +284,9 @@ std::cout << 1 * km / h + 1 * m / s << "\n";
|
||||
will print:
|
||||
|
||||
```text
|
||||
40771 ([1/25146] mi = [1/15625] km)
|
||||
108167 ([1/50292] mi = [1/57875] nmi)
|
||||
23 ([1/5] km/h = [1/18] m/s)
|
||||
40771 EQUIV{[1/25146] mi, [1/15625] km}
|
||||
108167 EQUIV{[1/50292] mi, [1/57875] nmi}
|
||||
23 EQUIV{[1/5] km/h, [1/18] m/s}
|
||||
```
|
||||
|
||||
Thanks to the above, it might be easier for the user to reason about the magnitude of the resulting
|
||||
|
@@ -854,18 +854,19 @@ template<typename CharT, std::output_iterator<CharT> Out, typename U, typename..
|
||||
constexpr Out unit_symbol_impl(Out out, const common_unit<U, Rest...>&, const unit_symbol_formatting& fmt,
|
||||
bool negative_power)
|
||||
{
|
||||
constexpr std::string_view separator(" = ");
|
||||
constexpr std::string_view prefix("EQUIV{");
|
||||
constexpr std::string_view separator(", ");
|
||||
auto print_unit = [&]<Unit Arg>(Arg) {
|
||||
constexpr auto u = get_common_unit_in(common_unit<U, Rest...>{}, Arg{});
|
||||
unit_symbol_impl<CharT>(out, u, fmt, negative_power);
|
||||
};
|
||||
*out++ = '(';
|
||||
detail::copy(std::begin(prefix), std::end(prefix), out);
|
||||
print_unit(U{});
|
||||
for_each(std::tuple<Rest...>{}, [&]<Unit Arg>(Arg) {
|
||||
detail::copy(std::begin(separator), std::end(separator), out);
|
||||
print_unit(Arg{});
|
||||
});
|
||||
*out++ = ')';
|
||||
*out++ = '}';
|
||||
return out;
|
||||
}
|
||||
|
||||
|
@@ -117,12 +117,12 @@ static_assert(unit_symbol<unit_symbol_formatting{.encoding = ascii}>(mag<60> * s
|
||||
static_assert(unit_symbol(mag_ratio<1, 18> * metre / second) == "[1/18] m/s");
|
||||
|
||||
// common units
|
||||
static_assert(unit_symbol(get_common_unit(kilo<metre>, mile)) == "([1/25146] mi = [1/15625] km)");
|
||||
static_assert(unit_symbol(get_common_unit(kilo<metre> / hour, metre / second)) == "([1/5] km/h = [1/18] m/s)");
|
||||
static_assert(unit_symbol(get_common_unit(kilo<metre>, mile)) == "EQUIV{[1/25146] mi, [1/15625] km}");
|
||||
static_assert(unit_symbol(get_common_unit(kilo<metre> / hour, metre / second)) == "EQUIV{[1/5] km/h, [1/18] m/s}");
|
||||
static_assert(unit_symbol(get_common_unit(kilo<metre> / hour, metre / second) / second) ==
|
||||
"([1/5] km/h = [1/18] m/s)/s");
|
||||
"EQUIV{[1/5] km/h, [1/18] m/s}/s");
|
||||
static_assert(unit_symbol(get_common_unit(kilo<metre> / hour, metre / second) * second) ==
|
||||
"([1/5] km/h = [1/18] m/s) s");
|
||||
"EQUIV{[1/5] km/h, [1/18] m/s} s");
|
||||
|
||||
// derived units
|
||||
static_assert(unit_symbol(one) == ""); // NOLINT(readability-container-size-empty)
|
||||
|
Reference in New Issue
Block a user