diff --git a/src/core/include/units/bits/basic_concepts.h b/src/core/include/units/bits/basic_concepts.h index dfe207f7..28776ab9 100644 --- a/src/core/include/units/bits/basic_concepts.h +++ b/src/core/include/units/bits/basic_concepts.h @@ -40,11 +40,11 @@ namespace units { // Prefix namespace detail { -template +template struct prefix_base; -template -void to_prefix_base(const volatile prefix_base*); +template +void to_prefix_base(const volatile prefix_base*); } // namespace detail diff --git a/src/core/include/units/bits/unit_text.h b/src/core/include/units/bits/unit_text.h index 736492e1..f546a251 100644 --- a/src/core/include/units/bits/unit_text.h +++ b/src/core/include/units/bits/unit_text.h @@ -69,28 +69,22 @@ constexpr auto magnitude_text() } } -template -constexpr auto ratio_text() +template +constexpr auto prefix_or_magnitude_text() { - return magnitude_text()>(); -} - -template -constexpr auto prefix_or_ratio_text() -{ - if constexpr (R.num == 1 && R.den == 1 && R.exp == 0) { + if constexpr (M == as_magnitude<1>()) { // no ratio/prefix return basic_fixed_string(""); } else { // try to form a prefix - using prefix = downcast>; + using prefix = downcast>; - if constexpr (can_be_prefixed && !is_same_v>) { + if constexpr (can_be_prefixed && !is_same_v>) { // print as a prefixed unit return prefix::symbol; } else { // print as a ratio of the coherent unit - constexpr auto txt = ratio_text(); + constexpr auto txt = magnitude_text(); if constexpr (SymbolLen > 0 && txt.standard().size() > 0) return txt + basic_fixed_string(" "); else @@ -164,7 +158,7 @@ constexpr auto unit_text() }(); constexpr auto prefix_txt = - prefix_or_ratio_text(); + prefix_or_magnitude_text(); return prefix_txt + symbol_text; } } diff --git a/src/core/include/units/prefix.h b/src/core/include/units/prefix.h index 0a95499c..803cf341 100644 --- a/src/core/include/units/prefix.h +++ b/src/core/include/units/prefix.h @@ -34,9 +34,9 @@ namespace units { namespace detail { -template -struct prefix_base : downcast_base> { - static constexpr UNITS_MSVC_WORKAROUND(Magnitude) auto mag = as_magnitude(); +template +struct prefix_base : downcast_base> { + static constexpr UNITS_MSVC_WORKAROUND(Magnitude) auto mag = M; }; } // namespace detail @@ -54,8 +54,8 @@ struct prefix_base : downcast_base> { * @tparam Symbol a text representation of the prefix * @tparam R factor to be used to scale a unit */ -template -struct prefix : downcast_dispatch, downcast_mode::on> { +template +struct prefix : downcast_dispatch, downcast_mode::on> { static constexpr auto symbol = Symbol; }; diff --git a/src/systems/isq-iec80000/include/units/isq/iec80000/binary_prefixes.h b/src/systems/isq-iec80000/include/units/isq/iec80000/binary_prefixes.h index f5e472ef..e1128357 100644 --- a/src/systems/isq-iec80000/include/units/isq/iec80000/binary_prefixes.h +++ b/src/systems/isq-iec80000/include/units/isq/iec80000/binary_prefixes.h @@ -26,11 +26,11 @@ namespace units::isq::iec80000 { -struct kibi : prefix {}; -struct mebi : prefix {}; -struct gibi : prefix {}; -struct tebi : prefix {}; -struct pebi : prefix {}; -struct exbi : prefix {}; +struct kibi : prefix(as_magnitude<2>())> {}; +struct mebi : prefix(as_magnitude<2>())> {}; +struct gibi : prefix(as_magnitude<2>())> {}; +struct tebi : prefix(as_magnitude<2>())> {}; +struct pebi : prefix(as_magnitude<2>())> {}; +struct exbi : prefix(as_magnitude<2>())> {}; } // namespace units::isq::iec80000 diff --git a/src/systems/si/include/units/isq/si/prefixes.h b/src/systems/si/include/units/isq/si/prefixes.h index 81f7c553..5ee1ec04 100644 --- a/src/systems/si/include/units/isq/si/prefixes.h +++ b/src/systems/si/include/units/isq/si/prefixes.h @@ -27,26 +27,26 @@ namespace units::isq::si { // clang-format off -struct yocto : prefix {}; -struct zepto : prefix {}; -struct atto : prefix {}; -struct femto : prefix {}; -struct pico : prefix {}; -struct nano : prefix {}; -struct micro : prefix {}; -struct milli : prefix {}; -struct centi : prefix {}; -struct deci : prefix {}; -struct deca : prefix {}; -struct hecto : prefix {}; -struct kilo : prefix {}; -struct mega : prefix {}; -struct giga : prefix {}; -struct tera : prefix {}; -struct peta : prefix {}; -struct exa : prefix {}; -struct zetta : prefix {}; -struct yotta : prefix {}; +struct yocto : prefix(as_magnitude<10>())> {}; +struct zepto : prefix(as_magnitude<10>())> {}; +struct atto : prefix(as_magnitude<10>())> {}; +struct femto : prefix(as_magnitude<10>())> {}; +struct pico : prefix(as_magnitude<10>())> {}; +struct nano : prefix(as_magnitude<10>())> {}; +struct micro : prefix(as_magnitude<10>())> {}; +struct milli : prefix(as_magnitude<10>())> {}; +struct centi : prefix(as_magnitude<10>())> {}; +struct deci : prefix(as_magnitude<10>())> {}; +struct deca : prefix(as_magnitude<10>())> {}; +struct hecto : prefix(as_magnitude<10>())> {}; +struct kilo : prefix(as_magnitude<10>())> {}; +struct mega : prefix(as_magnitude<10>())> {}; +struct giga : prefix(as_magnitude<10>())> {}; +struct tera : prefix(as_magnitude<10>())> {}; +struct peta : prefix(as_magnitude<10>())> {}; +struct exa : prefix(as_magnitude<10>())> {}; +struct zetta : prefix(as_magnitude<10>())> {}; +struct yotta : prefix(as_magnitude<10>())> {}; // clang-format on } // namespace units::isq::si