From 5810420277b79386b1f44eb88bd8b85c17ce2761 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Mon, 4 Nov 2024 09:40:25 +0100 Subject: [PATCH] refactor: :boom: tag types should not expose their members --- example/currency.cpp | 6 +- .../mp-units/bits/get_associated_quantity.h | 16 ++--- .../include/mp-units/framework/dimension.h | 6 +- .../mp-units/framework/quantity_point.h | 63 +++++++++-------- .../framework/quantity_point_concepts.h | 8 +-- src/core/include/mp-units/framework/unit.h | 70 +++++++++---------- .../mp-units/framework/unit_concepts.h | 8 +-- test/static/quantity_point_test.cpp | 6 +- test/static/unit_test.cpp | 54 +++++++------- 9 files changed, 118 insertions(+), 119 deletions(-) diff --git a/example/currency.cpp b/example/currency.cpp index fbcfb915..43aa28fd 100644 --- a/example/currency.cpp +++ b/example/currency.cpp @@ -63,7 +63,7 @@ inline constexpr auto JPY = japanese_jen; static_assert(!std::equality_comparable_with, quantity>); -#if 0 // NOLINT(readability-avoid-unconditional-preprocessor-if) +#if 0 || !MP_UNITS_API_STRING_VIEW_RET // NOLINT(readability-avoid-unconditional-preprocessor-if) // if you have only a few currencies to handle template @@ -77,8 +77,6 @@ template #else -[[nodiscard]] std::string_view to_string_view(Unit auto u) { return u.symbol.portable().c_str(); } - template [[nodiscard]] double exchange_rate(std::chrono::sys_seconds timestamp) { @@ -88,7 +86,7 @@ template // ... }; - return rates.at(std::make_pair(to_string_view(From), to_string_view(To))); + return rates.at(std::make_pair(unit_symbol(From), unit_symbol(To))); } #endif diff --git a/src/core/include/mp-units/bits/get_associated_quantity.h b/src/core/include/mp-units/bits/get_associated_quantity.h index 819fe90e..56385f8b 100644 --- a/src/core/include/mp-units/bits/get_associated_quantity.h +++ b/src/core/include/mp-units/bits/get_associated_quantity.h @@ -51,10 +51,10 @@ template template [[nodiscard]] consteval auto all_are_kinds(U) { - if constexpr (requires { U::quantity_spec; }) - return QuantityKindSpec>; - else if constexpr (requires { U::reference_unit; }) - return all_are_kinds(U::reference_unit); + if constexpr (requires { U::_quantity_spec_; }) + return QuantityKindSpec>; + else if constexpr (requires { U::_reference_unit_; }) + return all_are_kinds(U::_reference_unit_); else if constexpr (requires { typename U::_num_; }) { return all_are_kinds(typename U::_num_{}, typename U::_den_{}); } @@ -75,10 +75,10 @@ template template [[nodiscard]] consteval auto get_associated_quantity_impl(U u) { - if constexpr (requires { U::quantity_spec; }) - return remove_kind(U::quantity_spec); - else if constexpr (requires { U::reference_unit; }) - return get_associated_quantity_impl(U::reference_unit); + if constexpr (requires { U::_quantity_spec_; }) + return remove_kind(U::_quantity_spec_); + else if constexpr (requires { U::_reference_unit_; }) + return get_associated_quantity_impl(U::_reference_unit_); else if constexpr (requires { typename U::_num_; }) { return expr_map(u); } diff --git a/src/core/include/mp-units/framework/dimension.h b/src/core/include/mp-units/framework/dimension.h index 2b8d3887..b39e38d9 100644 --- a/src/core/include/mp-units/framework/dimension.h +++ b/src/core/include/mp-units/framework/dimension.h @@ -120,7 +120,7 @@ struct dimension_interface { */ MP_UNITS_EXPORT template struct base_dimension : detail::dimension_interface { - static constexpr auto symbol = Symbol; ///< Unique base dimension identifier + static constexpr auto _symbol_ = Symbol; ///< Unique base dimension identifier }; /** @@ -229,10 +229,10 @@ MP_UNITS_EXPORT_END namespace detail { template Out, Dimension D> - requires requires { D::symbol; } + requires requires { D::_symbol_; } constexpr Out dimension_symbol_impl(Out out, D, const dimension_symbol_formatting& fmt, bool negative_power) { - return copy_symbol(D::symbol, fmt.encoding, negative_power, out); + return copy_symbol(D::_symbol_, fmt.encoding, negative_power, out); } template Out, typename F, int Num, int... Den> diff --git a/src/core/include/mp-units/framework/quantity_point.h b/src/core/include/mp-units/framework/quantity_point.h index a99d230b..e96220d0 100644 --- a/src/core/include/mp-units/framework/quantity_point.h +++ b/src/core/include/mp-units/framework/quantity_point.h @@ -52,14 +52,14 @@ template } struct point_origin_interface { - template Q = std::remove_cvref_t> + template Q = std::remove_cvref_t> [[nodiscard]] friend constexpr quantity_point operator+(PO, FwdQ&& q) { return quantity_point{std::forward(q), PO{}}; } - template Q = std::remove_cvref_t> + template Q = std::remove_cvref_t> [[nodiscard]] friend constexpr quantity_point operator+(FwdQ&& q, PO po) { @@ -67,7 +67,7 @@ struct point_origin_interface { } template - requires ReferenceOf, PO::quantity_spec> + requires ReferenceOf, PO::_quantity_spec_> [[nodiscard]] friend constexpr QuantityPoint auto operator-(PO po, const Q& q) requires requires { -q; } { @@ -75,17 +75,17 @@ struct point_origin_interface { } template PO2> - requires QuantitySpecOf, PO2::quantity_spec> && + requires QuantitySpecOf, PO2::_quantity_spec_> && (is_derived_from_specialization_of_v || is_derived_from_specialization_of_v) [[nodiscard]] friend constexpr Quantity auto operator-(PO1 po1, PO2 po2) { if constexpr (is_derived_from_specialization_of_v) { - return po1 - po2.quantity_point; + return po1 - po2._quantity_point_; } else if constexpr (is_derived_from_specialization_of_v) { - return po1.quantity_point - po2; + return po1._quantity_point_ - po2; } else { - return po1.quantity_point - po2.quantity_point; + return po1._quantity_point_ - po2._quantity_point_; } } @@ -95,14 +95,14 @@ struct point_origin_interface { if constexpr (is_derived_from_specialization_of_v && is_derived_from_specialization_of_v) return is_same_v || (detail::is_zeroth_point_origin(po1) && detail::is_zeroth_point_origin(po2) && - interconvertible(po1.quantity_spec, po2.quantity_spec)); + interconvertible(po1._quantity_spec_, po2._quantity_spec_)); else if constexpr (is_derived_from_specialization_of_v && is_derived_from_specialization_of_v) - return PO1::quantity_point == PO2::quantity_point; + return PO1::_quantity_point_ == PO2::_quantity_point_; else if constexpr (is_derived_from_specialization_of_v) - return detail::same_absolute_point_origins(po1, po2) && is_eq_zero(PO1::quantity_point.quantity_from_zero()); + return detail::same_absolute_point_origins(po1, po2) && is_eq_zero(PO1::_quantity_point_.quantity_from_zero()); else if constexpr (is_derived_from_specialization_of_v) - return detail::same_absolute_point_origins(po1, po2) && is_eq_zero(PO2::quantity_point.quantity_from_zero()); + return detail::same_absolute_point_origins(po1, po2) && is_eq_zero(PO2::_quantity_point_.quantity_from_zero()); } }; @@ -110,20 +110,20 @@ struct point_origin_interface { MP_UNITS_EXPORT template struct absolute_point_origin : detail::point_origin_interface { - static constexpr QuantitySpec auto quantity_spec = QS; + static constexpr QuantitySpec auto _quantity_spec_ = QS; }; MP_UNITS_EXPORT template struct relative_point_origin : detail::point_origin_interface { - static constexpr QuantityPoint auto quantity_point = QP; - static constexpr QuantitySpec auto quantity_spec = []() { + static constexpr QuantityPoint auto _quantity_point_ = QP; + static constexpr QuantitySpec auto _quantity_spec_ = []() { // select the strongest of specs if constexpr (detail::QuantityKindSpec>) - return QP.point_origin.quantity_spec; + return QP.point_origin._quantity_spec_; else return QP.quantity_spec; }(); - static constexpr PointOrigin auto absolute_point_origin = QP.absolute_point_origin; + static constexpr PointOrigin auto _absolute_point_origin_ = QP.absolute_point_origin; }; template @@ -143,8 +143,8 @@ constexpr bool is_specialization_of_zeroth_point_origin MP_UNITS_EXPORT template [[nodiscard]] consteval PointOriginFor auto default_point_origin(R) { - if constexpr (requires { get_unit(R{}).point_origin; }) - return get_unit(R{}).point_origin; + if constexpr (requires { get_unit(R{})._point_origin_; }) + return get_unit(R{})._point_origin_; else return zeroth_point_origin; } @@ -157,7 +157,7 @@ template if constexpr (is_derived_from_specialization_of_v) return po; else - return po.quantity_point.absolute_point_origin; + return po._quantity_point_.absolute_point_origin; } } // namespace detail @@ -220,7 +220,7 @@ public: { } - template Q = std::remove_cvref_t> + template Q = std::remove_cvref_t> requires std::constructible_from && detail::SameAbsolutePointOriginAs constexpr quantity_point(FwdQ&& q, PO2) : quantity_point( @@ -309,9 +309,9 @@ public: [[nodiscard]] constexpr Quantity auto quantity_from_zero() const { - if constexpr (requires { unit.point_origin; }) { + if constexpr (requires { unit._point_origin_; }) { // original quantity point unit can be lost in the below operation - const auto q = quantity_from(unit.point_origin); + const auto q = quantity_from(unit._point_origin_); if constexpr (requires { q.in(unit); }) // restore the unit if possible (non-truncating) return q.in(unit); @@ -452,7 +452,7 @@ public: // binary operators on quantity points template QP, auto R2, typename Rep2> // TODO simplify when gcc catches up - requires ReferenceOf + requires ReferenceOf [[nodiscard]] friend constexpr QuantityPoint auto operator+(const QP& qp, const quantity& q) requires requires { qp.quantity_ref_from(PO) + q; } { @@ -464,7 +464,7 @@ public: template QP> // TODO simplify when gcc catches up - requires ReferenceOf + requires ReferenceOf [[nodiscard]] friend constexpr QuantityPoint auto operator+(const quantity& q, const QP& qp) requires requires { q + qp.quantity_ref_from(PO); } { @@ -473,7 +473,7 @@ public: template QP, auto R2, typename Rep2> // TODO simplify when gcc catches up - requires ReferenceOf + requires ReferenceOf [[nodiscard]] friend constexpr QuantityPoint auto operator-(const QP& qp, const quantity& q) requires requires { qp.quantity_ref_from(PO) - q; } { @@ -497,7 +497,7 @@ public: template QP, PointOrigin PO2> requires QuantityPointOf && - ReferenceOf, PO2::quantity_spec> + ReferenceOf, PO2::_quantity_spec_> [[nodiscard]] friend constexpr Quantity auto operator-(const QP& qp, PO2 po) { if constexpr (point_origin == po) @@ -508,18 +508,19 @@ public: else return qp.quantity_ref_from(point_origin) + (qp.point_origin - qp.absolute_point_origin); } else { - if constexpr (point_origin == po.quantity_point.point_origin) - return qp.quantity_ref_from(point_origin) - po.quantity_point.quantity_ref_from(po.quantity_point.point_origin); + if constexpr (point_origin == po._quantity_point_.point_origin) + return qp.quantity_ref_from(point_origin) - + po._quantity_point_.quantity_ref_from(po._quantity_point_.point_origin); else return qp.quantity_ref_from(point_origin) - - po.quantity_point.quantity_ref_from(po.quantity_point.point_origin) + - (qp.point_origin - po.quantity_point.point_origin); + po._quantity_point_.quantity_ref_from(po._quantity_point_.point_origin) + + (qp.point_origin - po._quantity_point_.point_origin); } } template QP> requires QuantityPointOf && - ReferenceOf, PO1::quantity_spec> + ReferenceOf, PO1::_quantity_spec_> [[nodiscard]] friend constexpr Quantity auto operator-(PO1 po, const QP& qp) { return -(qp - po); diff --git a/src/core/include/mp-units/framework/quantity_point_concepts.h b/src/core/include/mp-units/framework/quantity_point_concepts.h index ddd7cb6c..91409cd6 100644 --- a/src/core/include/mp-units/framework/quantity_point_concepts.h +++ b/src/core/include/mp-units/framework/quantity_point_concepts.h @@ -73,7 +73,7 @@ concept PointOrigin = detail::TagType && std::derived_from -concept PointOriginFor = PointOrigin && QuantitySpecOf; +concept PointOriginFor = PointOrigin && QuantitySpecOf; MP_UNITS_EXPORT template auto PO, RepresentationOf Rep> @@ -100,11 +100,11 @@ template return po1 == po2; else if constexpr (is_derived_from_specialization_of_v && is_derived_from_specialization_of_v) - return po1.absolute_point_origin == po2.absolute_point_origin; + return po1._absolute_point_origin_ == po2._absolute_point_origin_; else if constexpr (is_derived_from_specialization_of_v) - return po1.absolute_point_origin == po2; + return po1._absolute_point_origin_ == po2; else if constexpr (is_derived_from_specialization_of_v) - return po1 == po2.absolute_point_origin; + return po1 == po2._absolute_point_origin_; else return false; } diff --git a/src/core/include/mp-units/framework/unit.h b/src/core/include/mp-units/framework/unit.h index 8ae78872..5b9973e3 100644 --- a/src/core/include/mp-units/framework/unit.h +++ b/src/core/include/mp-units/framework/unit.h @@ -161,10 +161,10 @@ struct unit_interface { if constexpr (std::is_same_v)>>) return u; else if constexpr (is_specialization_of_scaled_unit) { - if constexpr (M{} * U::mag == mag<1>) - return U::reference_unit; + if constexpr (M{} * U::_mag_ == mag<1>) + return U::_reference_unit_; else - return scaled_unit>{}; + return scaled_unit>{}; } else return scaled_unit{}; } @@ -221,19 +221,19 @@ struct unit_interface { } }; -template +template struct propagate_point_origin {}; template struct propagate_point_origin { - static constexpr auto point_origin = U::point_origin; + static constexpr auto _point_origin_ = U::_point_origin_; }; template struct scaled_unit_impl : detail::unit_interface, detail::propagate_point_origin { using _base_type_ = scaled_unit_impl; // exposition only - static constexpr Magnitude auto mag = M; - static constexpr U reference_unit{}; + static constexpr Magnitude auto _mag_ = M; + static constexpr U _reference_unit_{}; }; } // namespace detail @@ -306,18 +306,18 @@ struct named_unit; template requires(!Symbol.empty()) && detail::BaseDimension> struct named_unit : detail::unit_interface { - using _base_type_ = named_unit; // exposition only - static constexpr auto symbol = Symbol; ///< Unique base unit identifier - static constexpr auto quantity_spec = QS; + using _base_type_ = named_unit; // exposition only + static constexpr auto _symbol_ = Symbol; ///< Unique base unit identifier + static constexpr auto _quantity_spec_ = QS; }; template requires(!Symbol.empty()) && detail::BaseDimension> struct named_unit : detail::unit_interface { - using _base_type_ = named_unit; // exposition only - static constexpr auto symbol = Symbol; ///< Unique base unit identifier - static constexpr auto quantity_spec = QS; - static constexpr auto point_origin = PO; + using _base_type_ = named_unit; // exposition only + static constexpr auto _symbol_ = Symbol; ///< Unique base unit identifier + static constexpr auto _quantity_spec_ = QS; + static constexpr auto _point_origin_ = PO; }; /** @@ -333,8 +333,8 @@ struct named_unit : detail::unit_interface { template requires(!Symbol.empty()) struct named_unit : detail::unit_interface { - using _base_type_ = named_unit; // exposition only - static constexpr auto symbol = Symbol; ///< Unique base unit identifier + using _base_type_ = named_unit; // exposition only + static constexpr auto _symbol_ = Symbol; ///< Unique base unit identifier }; /** @@ -348,16 +348,16 @@ struct named_unit : detail::unit_interface { template requires(!Symbol.empty()) struct named_unit : decltype(U)::_base_type_ { - using _base_type_ = named_unit; // exposition only - static constexpr auto symbol = Symbol; ///< Unique unit identifier + using _base_type_ = named_unit; // exposition only + static constexpr auto _symbol_ = Symbol; ///< Unique unit identifier }; template requires(!Symbol.empty()) struct named_unit : decltype(U)::_base_type_ { - using _base_type_ = named_unit; // exposition only - static constexpr auto symbol = Symbol; ///< Unique unit identifier - static constexpr auto point_origin = PO; + using _base_type_ = named_unit; // exposition only + static constexpr auto _symbol_ = Symbol; ///< Unique unit identifier + static constexpr auto _point_origin_ = PO; }; /** @@ -372,18 +372,18 @@ struct named_unit : decltype(U)::_base_type_ { template requires(!Symbol.empty()) && (QS.dimension == detail::get_associated_quantity(U).dimension) struct named_unit : decltype(U)::_base_type_ { - using _base_type_ = named_unit; // exposition only - static constexpr auto symbol = Symbol; ///< Unique unit identifier - static constexpr auto quantity_spec = QS; + using _base_type_ = named_unit; // exposition only + static constexpr auto _symbol_ = Symbol; ///< Unique unit identifier + static constexpr auto _quantity_spec_ = QS; }; template requires(!Symbol.empty()) && (QS.dimension == detail::get_associated_quantity(U).dimension) struct named_unit : decltype(U)::_base_type_ { - using _base_type_ = named_unit; // exposition only - static constexpr auto symbol = Symbol; ///< Unique unit identifier - static constexpr auto quantity_spec = QS; - static constexpr auto point_origin = PO; + using _base_type_ = named_unit; // exposition only + static constexpr auto _symbol_ = Symbol; ///< Unique unit identifier + static constexpr auto _quantity_spec_ = QS; + static constexpr auto _point_origin_ = PO; }; /** @@ -412,7 +412,7 @@ MP_UNITS_EXPORT template Out, Unit U> - requires requires { U::symbol; } + requires requires { U::_symbol_; } constexpr Out unit_symbol_impl(Out out, U, const unit_symbol_formatting& fmt, bool negative_power) { - return copy_symbol(U::symbol, fmt.encoding, negative_power, out); + return copy_symbol(U::_symbol_, fmt.encoding, negative_power, out); } template Out, auto M, typename U> @@ -777,8 +777,8 @@ constexpr Out unit_symbol_impl(Out out, const scaled_unit_impl& u, const u { *out++ = '['; _magnitude_symbol(out, M, fmt); - if constexpr (space_before_unit_symbol::reference_unit>) *out++ = ' '; - unit_symbol_impl(out, u.reference_unit, fmt, negative_power); + if constexpr (space_before_unit_symbol::_reference_unit_>) *out++ = ' '; + unit_symbol_impl(out, u._reference_unit_, fmt, negative_power); *out++ = ']'; return out; } @@ -787,8 +787,8 @@ template [[nodiscard]] consteval Unit auto get_common_unit_in(common_unit, U u) { auto get_magnitude = [&]() { - if constexpr (requires { common_unit::mag; }) - return common_unit::mag; + if constexpr (requires { common_unit::_mag_; }) + return common_unit::_mag_; else return mag<1>; }; diff --git a/src/core/include/mp-units/framework/unit_concepts.h b/src/core/include/mp-units/framework/unit_concepts.h index 901baef6..cf4f90b1 100644 --- a/src/core/include/mp-units/framework/unit_concepts.h +++ b/src/core/include/mp-units/framework/unit_concepts.h @@ -80,9 +80,9 @@ template template [[nodiscard]] consteval bool has_associated_quantity(U) { - if constexpr (requires { U::quantity_spec; }) return true; - if constexpr (requires { U::reference_unit; }) - return has_associated_quantity(U::reference_unit); + if constexpr (requires { U::_quantity_spec_; }) return true; + if constexpr (requires { U::_reference_unit_; }) + return has_associated_quantity(U::_reference_unit_); else if constexpr (requires { typename U::_num_; }) return has_associated_quantity(typename U::_num_{}) && has_associated_quantity(typename U::_den_{}); else @@ -131,7 +131,7 @@ concept UnitCompatibleWith = (!AssociatedUnit || UnitOf) && detail::UnitConvertibleTo; template -concept OffsetUnit = Unit && requires { T::point_origin; }; +concept OffsetUnit = Unit && requires { T::_point_origin_; }; } // namespace detail diff --git a/test/static/quantity_point_test.cpp b/test/static/quantity_point_test.cpp index 6054cd2f..990312c4 100644 --- a/test/static/quantity_point_test.cpp +++ b/test/static/quantity_point_test.cpp @@ -118,9 +118,9 @@ struct relative_po_ final : relative_point_origin {}; template constexpr relative_po_ relative_po; -static_assert(relative_po + isq::height(42 * m)>.quantity_spec == isq::height); -static_assert(relative_po> + isq::height(42 * m)>.quantity_spec == isq::height); -static_assert(relative_po + 42 * m>.quantity_spec == isq::height); +static_assert(relative_po + isq::height(42 * m)>._quantity_spec_ == isq::height); +static_assert(relative_po> + isq::height(42 * m)>._quantity_spec_ == isq::height); +static_assert(relative_po + 42 * m>._quantity_spec_ == isq::height); inline constexpr struct my_kelvin final : named_unit<"my_K", mag<10> * si::kelvin> { } my_kelvin; diff --git a/test/static/unit_test.cpp b/test/static/unit_test.cpp index e42a96df..dccd3a31 100644 --- a/test/static/unit_test.cpp +++ b/test/static/unit_test.cpp @@ -191,7 +191,7 @@ static_assert(convertible(standard_gravity, standard_gravity)); static_assert(convertible(standard_gravity, metre / square(second))); static_assert(standard_gravity == standard_gravity); static_assert(standard_gravity != metre / square(second)); // magnitude is different -static_assert(standard_gravity.symbol == symbol_text{u8"g₀", "g_0"}); +static_assert(standard_gravity._symbol_ == symbol_text{u8"g₀", "g_0"}); // prefixed_unit static_assert(is_of_type)>>); @@ -199,7 +199,7 @@ static_assert(is_of_type); static_assert(get_canonical_unit(kilometre).mag == mag<1000>); static_assert(convertible(kilometre, metre)); static_assert(kilometre != metre); -static_assert(kilometre.symbol == "km"); +static_assert(kilometre._symbol_ == "km"); static_assert(is_of_type)>>); static_assert(is_of_type); static_assert(convertible(kilojoule, joule)); static_assert(kilojoule != joule); -static_assert(kilojoule.symbol == "kJ"); +static_assert(kilojoule._symbol_ == "kJ"); static_assert(is_of_type, kilo_>); static_assert(is_of_type, kilo_>); @@ -217,30 +217,30 @@ static_assert( // prefixes -static_assert(si::quecto.symbol == "qm"); -static_assert(si::ronto.symbol == "rm"); -static_assert(si::yocto.symbol == "ym"); -static_assert(si::zepto.symbol == "zm"); -static_assert(si::atto.symbol == "am"); -static_assert(si::femto.symbol == "fm"); -static_assert(si::pico.symbol == "pm"); -static_assert(si::nano.symbol == "nm"); -static_assert(si::micro.symbol == symbol_text{u8"µm", "um"}); -static_assert(si::milli.symbol == "mm"); -static_assert(si::centi.symbol == "cm"); -static_assert(si::deci.symbol == "dm"); -static_assert(si::deca.symbol == "dam"); -static_assert(si::hecto.symbol == "hm"); -static_assert(si::kilo.symbol == "km"); -static_assert(si::mega.symbol == "Mm"); -static_assert(si::giga.symbol == "Gm"); -static_assert(si::tera.symbol == "Tm"); -static_assert(si::peta.symbol == "Pm"); -static_assert(si::exa.symbol == "Em"); -static_assert(si::zetta.symbol == "Zm"); -static_assert(si::yotta.symbol == "Ym"); -static_assert(si::ronna.symbol == "Rm"); -static_assert(si::quetta.symbol == "Qm"); +static_assert(si::quecto._symbol_ == "qm"); +static_assert(si::ronto._symbol_ == "rm"); +static_assert(si::yocto._symbol_ == "ym"); +static_assert(si::zepto._symbol_ == "zm"); +static_assert(si::atto._symbol_ == "am"); +static_assert(si::femto._symbol_ == "fm"); +static_assert(si::pico._symbol_ == "pm"); +static_assert(si::nano._symbol_ == "nm"); +static_assert(si::micro._symbol_ == symbol_text{u8"µm", "um"}); +static_assert(si::milli._symbol_ == "mm"); +static_assert(si::centi._symbol_ == "cm"); +static_assert(si::deci._symbol_ == "dm"); +static_assert(si::deca._symbol_ == "dam"); +static_assert(si::hecto._symbol_ == "hm"); +static_assert(si::kilo._symbol_ == "km"); +static_assert(si::mega._symbol_ == "Mm"); +static_assert(si::giga._symbol_ == "Gm"); +static_assert(si::tera._symbol_ == "Tm"); +static_assert(si::peta._symbol_ == "Pm"); +static_assert(si::exa._symbol_ == "Em"); +static_assert(si::zetta._symbol_ == "Zm"); +static_assert(si::yotta._symbol_ == "Ym"); +static_assert(si::ronna._symbol_ == "Rm"); +static_assert(si::quetta._symbol_ == "Qm"); // scaled_unit constexpr auto m_1 = mag<1> * metre;