// The MIT License (MIT) // // Copyright (c) 2018 Mateusz Pusz // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include #include #include #ifdef MP_UNITS_IMPORT_STD import std; #else #include #endif namespace { using namespace mp_units; using namespace mp_units::si; using namespace mp_units::iec; using namespace mp_units::international; using enum text_encoding; using enum unit_symbol_solidus; using enum unit_symbol_separator; using usf = unit_symbol_formatting; // named units static_assert(unit_symbol(metre) == "m"); static_assert(unit_symbol(second) == "s"); static_assert(unit_symbol(joule) == "J"); static_assert(unit_symbol(degree_Celsius) == "\u2103"); static_assert(unit_symbol(degree_Celsius) == "`C"); static_assert(unit_symbol(kilogram) == "kg"); static_assert(unit_symbol(hour) == "h"); // prefixed units static_assert(unit_symbol(quecto) == "qΩ"); static_assert(unit_symbol(quecto) == "qohm"); static_assert(unit_symbol(ronto) == "rΩ"); static_assert(unit_symbol(ronto) == "rohm"); static_assert(unit_symbol(yocto) == "yΩ"); static_assert(unit_symbol(yocto) == "yohm"); static_assert(unit_symbol(zepto) == "zΩ"); static_assert(unit_symbol(zepto) == "zohm"); static_assert(unit_symbol(atto) == "aΩ"); static_assert(unit_symbol(atto) == "aohm"); static_assert(unit_symbol(femto) == "fΩ"); static_assert(unit_symbol(femto) == "fohm"); static_assert(unit_symbol(pico) == "pΩ"); static_assert(unit_symbol(pico) == "pohm"); static_assert(unit_symbol(nano) == "nΩ"); static_assert(unit_symbol(nano) == "nohm"); static_assert(unit_symbol(micro) == "µΩ"); static_assert(unit_symbol(micro) == "uohm"); static_assert(unit_symbol(milli) == "mΩ"); static_assert(unit_symbol(milli) == "mohm"); static_assert(unit_symbol(centi) == "cΩ"); static_assert(unit_symbol(centi) == "cohm"); static_assert(unit_symbol(deci) == "dΩ"); static_assert(unit_symbol(deci) == "dohm"); static_assert(unit_symbol(deca) == "daΩ"); static_assert(unit_symbol(deca) == "daohm"); static_assert(unit_symbol(hecto) == "hΩ"); static_assert(unit_symbol(hecto) == "hohm"); static_assert(unit_symbol(kilo) == "kΩ"); static_assert(unit_symbol(kilo) == "kohm"); static_assert(unit_symbol(mega) == "MΩ"); static_assert(unit_symbol(mega) == "Mohm"); static_assert(unit_symbol(giga) == "GΩ"); static_assert(unit_symbol(giga) == "Gohm"); static_assert(unit_symbol(tera) == "TΩ"); static_assert(unit_symbol(tera) == "Tohm"); static_assert(unit_symbol(peta) == "PΩ"); static_assert(unit_symbol(peta) == "Pohm"); static_assert(unit_symbol(exa) == "EΩ"); static_assert(unit_symbol(exa) == "Eohm"); static_assert(unit_symbol(zetta) == "ZΩ"); static_assert(unit_symbol(zetta) == "Zohm"); static_assert(unit_symbol(yotta) == "YΩ"); static_assert(unit_symbol(yotta) == "Yohm"); static_assert(unit_symbol(ronna) == "RΩ"); static_assert(unit_symbol(ronna) == "Rohm"); static_assert(unit_symbol(quetta) == "QΩ"); static_assert(unit_symbol(quetta) == "Qohm"); static_assert(unit_symbol(kibi) == "Kibit"); static_assert(unit_symbol(mebi) == "Mibit"); static_assert(unit_symbol(gibi) == "Gibit"); static_assert(unit_symbol(tebi) == "Tibit"); static_assert(unit_symbol(pebi) == "Pibit"); static_assert(unit_symbol(exbi) == "Eibit"); static_assert(unit_symbol(zebi) == "Zibit"); static_assert(unit_symbol(yobi) == "Yibit"); // scaled units static_assert(unit_symbol(mag<100> * metre) == "[100 m]"); static_assert(unit_symbol(mag<100> * metre) == "[100 m]"); static_assert(unit_symbol(mag<1000> * metre) == "[10³ m]"); static_assert(unit_symbol(mag_power<10, 3> * metre) == "[10³ m]"); static_assert(unit_symbol(mag<1000> * metre) == "[10^3 m]"); static_assert(unit_symbol(mag<6000> * metre) == "[6 × 10³ m]"); static_assert(unit_symbol(mag<6> * mag_power<10, 3> * metre) == "[6 × 10³ m]"); static_assert(unit_symbol(mag<6000> * metre) == "[6 x 10^3 m]"); static_assert(unit_symbol(mag<10600> * metre) == "[10600 m]"); static_assert(unit_symbol(mag<60> * second) == "[60 s]"); static_assert(unit_symbol(mag_ratio<1, 18> * metre / second) == "[1/18 m]/s"); static_assert(unit_symbol(mag_ratio<1, 18> * (metre / second)) == "[1/18 m/s]"); static_assert(unit_symbol(mag_ratio<1, 1800> * metre / second) == "[1/1800 m]/s"); static_assert(unit_symbol(mag_ratio<1, 1800> * (metre / second)) == "[1/1800 m/s]"); static_assert(unit_symbol(mag_ratio<1, 18000> * metre / second) == "[1/18 × 10⁻³ m]/s"); static_assert(unit_symbol(mag_ratio<1, 18000> * (metre / second)) == "[1/18 × 10⁻³ m/s]"); static_assert(unit_symbol(mag_ratio<1, 18000> * metre / second) == "[1/18 x 10^-3 m]/s"); static_assert(unit_symbol(mag_ratio<1, 18000> * (metre / second)) == "[1/18 x 10^-3 m/s]"); // TODO implement all the below // static_assert(unit_symbol(mag_power<2, 1, 2> * one) == "[2^(1/2)]"); // static_assert(unit_symbol(mag_power<2, 1, 2> * one) == "[2^(1/2)]"); // static_assert(unit_symbol(mag_power<2, 1, 2> * m) == "[2^(1/2) m]"); // static_assert(unit_symbol(mag_power<2, 1, 2> * m) == "[2^(1/2) m]"); // static_assert(unit_symbol(mag<1> / mag_power<2, 1, 2> * one) == "[1/2^(1/2)]"); // static_assert(unit_symbol(mag<1> / mag_power<2, 1, 2> * one) == "[1/2^(1/2)]"); // static_assert(unit_symbol(mag<1> / mag_power<2, 1, 2> * m) == "[1/2^(1/2) m]"); // static_assert(unit_symbol(mag<1> / mag_power<2, 1, 2> * m) == "[1/2^(1/2) m]"); // magnitude constants #if defined MP_UNITS_COMP_CLANG || MP_UNITS_COMP_CLANG < 18 inline constexpr struct e final : mag_constant<"e"> { static constexpr long double _value_ = std::numbers::e_v; #else inline constexpr struct e final : mag_constant<"e", std::numbers::e_v > { #endif } e; static_assert(unit_symbol(mag<𝜋> * one) == "[𝜋]"); static_assert(unit_symbol(mag<𝜋> * one) == "[pi]"); static_assert(unit_symbol(mag<𝜋> * metre) == "[𝜋 m]"); static_assert(unit_symbol(mag<𝜋> * metre) == "[pi m]"); static_assert(unit_symbol(mag<2> * mag<𝜋> * metre) == "[2 𝜋 m]"); static_assert(unit_symbol(mag<2> * mag<𝜋> * metre) == "[2 pi m]"); static_assert(unit_symbol(mag<2> * mag<𝜋> * metre) == "[2⋅𝜋 m]"); static_assert(unit_symbol(mag<1> / mag<𝜋> * one) == "[1/𝜋]"); static_assert(unit_symbol(mag<1> / mag<𝜋> * one) == "[1/pi]"); static_assert(unit_symbol(mag<1> / mag<𝜋> * one) == "[𝜋⁻¹]"); static_assert(unit_symbol(mag<1> / mag<𝜋> * one) == "[pi^-1]"); static_assert(unit_symbol(mag<1> / mag<𝜋> * metre) == "[1/𝜋 m]"); static_assert(unit_symbol(mag<1> / mag<𝜋> * metre) == "[1/pi m]"); static_assert(unit_symbol(mag<1> / mag<𝜋> * metre) == "[𝜋⁻¹ m]"); static_assert(unit_symbol(mag<1> / mag<𝜋> * metre) == "[pi^-1 m]"); static_assert(unit_symbol(mag<2> / mag<𝜋> * metre) == "[2/𝜋 m]"); static_assert(unit_symbol(mag<2> / mag<𝜋> * metre) == "[2/pi m]"); static_assert(unit_symbol(mag<2> / mag<𝜋> * metre) == "[2 𝜋⁻¹ m]"); static_assert(unit_symbol(mag<2> / mag<𝜋> * metre) == "[2 pi^-1 m]"); static_assert(unit_symbol(mag<2> / mag<𝜋> * metre) == "[2⋅𝜋⁻¹ m]"); static_assert(unit_symbol(mag<1> / (mag<2> * mag<𝜋>)*metre) == "[2⁻¹ 𝜋⁻¹ m]"); static_assert(unit_symbol(mag<1> / (mag<2> * mag<𝜋>)*metre) == "[1/(2 𝜋) m]"); static_assert(unit_symbol(mag<1> / (mag<2> * mag<𝜋>)*metre) == "[1/(2 pi) m]"); static_assert(unit_symbol(mag_ratio<1, 2> / mag<𝜋> * metre) == "[2⁻¹ 𝜋⁻¹ m]"); static_assert(unit_symbol(mag_ratio<1, 2> / mag<𝜋> * metre) == "[1/(2 𝜋) m]"); static_assert(unit_symbol(mag_ratio<1, 2> / mag<𝜋> * metre) == "[1/(2 pi) m]"); static_assert(unit_symbol(mag_ratio<1, 2> * mag<𝜋> * metre) == "[𝜋/2 m]"); static_assert(unit_symbol(mag_power * one) == "[𝜋²]"); static_assert(unit_symbol(mag_power * one) == "[pi^2]"); static_assert(unit_symbol(mag_power * metre) == "[𝜋^(1/2) m]"); static_assert(unit_symbol(mag_power * metre) == "[pi^(1/2) m]"); static_assert(unit_symbol(mag<𝜋> * mag * one) == "[e 𝜋]"); static_assert(unit_symbol(mag * mag<𝜋> * one) == "[e 𝜋]"); static_assert(unit_symbol(mag<𝜋> * mag * one) == "[e pi]"); static_assert(unit_symbol(mag<𝜋> / mag * one) == "[𝜋/e]"); static_assert(unit_symbol(mag<1> / mag * mag<𝜋> * one) == "[𝜋/e]"); static_assert(unit_symbol(mag<𝜋> / mag * one) == "[𝜋 e⁻¹]"); static_assert(unit_symbol(mag / mag<𝜋> * one) == "[e/𝜋]"); static_assert(unit_symbol(mag<1> / mag<𝜋> * mag * one) == "[e/𝜋]"); static_assert(unit_symbol(mag / mag<𝜋> * one) == "[e 𝜋⁻¹]"); static_assert(unit_symbol(mag<1> / (mag<𝜋> * mag)*one) == "[e⁻¹ 𝜋⁻¹]"); static_assert(unit_symbol(mag<1> / (mag<𝜋> * mag)*one) == "[1/(e 𝜋)]"); static_assert(unit_symbol(mag<2> / (mag<𝜋> * mag)*one) == "[2 e⁻¹ 𝜋⁻¹]"); static_assert(unit_symbol(mag<2> / (mag<𝜋> * mag)*one) == "[2/(e 𝜋)]"); // common units static_assert(unit_symbol(get_common_unit(kilo, mile)) == "EQUIV{[1/25146 mi], [1/15625 km]}"); static_assert(unit_symbol(get_common_unit(kilo / hour, metre / second)) == "EQUIV{[1/5 km/h], [1/18 m/s]}"); static_assert(unit_symbol(get_common_unit(kilo / hour, metre / second) / second) == "EQUIV{[1/5 km/h], [1/18 m/s]}/s"); static_assert(unit_symbol(get_common_unit(kilo / hour, metre / second) * second) == "EQUIV{[1/5 km/h], [1/18 m/s]} s"); static_assert(unit_symbol(get_common_unit(radian, degree)) == "EQUIV{[1/𝜋°], [1/180 rad]}"); // derived units static_assert(unit_symbol(one) == ""); // NOLINT(readability-container-size-empty) static_assert(unit_symbol(percent) == "%"); static_assert(unit_symbol(per_mille) == "‰"); static_assert(unit_symbol(per_mille) == "%o"); static_assert(unit_symbol(parts_per_million) == "ppm"); static_assert(unit_symbol(square(metre)) == "m²"); static_assert(unit_symbol(square(metre)) == "m^2"); static_assert(unit_symbol(cubic(metre)) == "m³"); static_assert(unit_symbol(cubic(metre)) == "m^3"); static_assert(unit_symbol(kilo * metre) == "km m"); static_assert(unit_symbol(kilo * metre) == "km⋅m"); static_assert(unit_symbol(metre / metre) == ""); // NOLINT(readability-container-size-empty) static_assert(unit_symbol(kilo / metre) == "km/m"); static_assert(unit_symbol(kilo / metre) == "km m⁻¹"); static_assert(unit_symbol(kilo / metre) == "km m^-1"); static_assert(unit_symbol(metre / second) == "m/s"); static_assert(unit_symbol(metre / second) == "m/s"); static_assert(unit_symbol(metre / second) == "m s⁻¹"); static_assert(unit_symbol(metre / second) == "m s^-1"); static_assert(unit_symbol(metre / second) == "m⋅s⁻¹"); static_assert(unit_symbol(metre / square(second)) == "m/s²"); static_assert(unit_symbol(metre / square(second)) == "m/s^2"); static_assert(unit_symbol(metre / square(second)) == "m/s²"); static_assert(unit_symbol(metre / square(second)) == "m/s^2"); static_assert(unit_symbol(metre / square(second)) == "m s⁻²"); static_assert(unit_symbol(metre / square(second)) == "m s^-2"); static_assert(unit_symbol(metre / square(second)) == "m⋅s⁻²"); static_assert(unit_symbol(kilogram * metre / square(second)) == "kg m/s²"); static_assert(unit_symbol(kilogram * metre / square(second)) == "kg⋅m/s²"); static_assert(unit_symbol(kilogram * metre / square(second)) == "kg m/s^2"); static_assert(unit_symbol(kilogram * metre / square(second)) == "kg m/s²"); static_assert(unit_symbol(kilogram * metre / square(second)) == "kg m/s^2"); static_assert(unit_symbol(kilogram * metre / square(second)) == "kg m s⁻²"); static_assert(unit_symbol(kilogram * metre / square(second)) == "kg m s^-2"); static_assert(unit_symbol(kilogram * metre / square(second)) == "kg⋅m⋅s⁻²"); static_assert(unit_symbol(one / metre / square(second)) == "m⁻¹ s⁻²"); static_assert(unit_symbol(one / metre / square(second)) == "1/(m s²)"); static_assert(unit_symbol(kilogram / metre / square(second)) == "kg m⁻¹ s⁻²"); static_assert(unit_symbol(kilogram / metre / square(second)) == "kg⋅m⁻¹⋅s⁻²"); static_assert(unit_symbol(kilogram / metre / square(second)) == "kg m^-1 s^-2"); static_assert(unit_symbol(kilogram / metre / square(second)) == "kg/(m s²)"); static_assert(unit_symbol(kilogram / metre / square(second)) == "kg/(m s^2)"); static_assert(unit_symbol(kilogram / metre / square(second)) == "kg m⁻¹ s⁻²"); static_assert(unit_symbol(kilogram / metre / square(second)) == "kg m^-1 s^-2"); static_assert(unit_symbol(kilogram / metre / square(second)) == "kg⋅m⁻¹⋅s⁻²"); static_assert(unit_symbol(pow<123>(metre)) == "m¹²³"); static_assert(unit_symbol(pow<1, 2>(metre)) == "m^(1/2)"); static_assert(unit_symbol(pow<3, 5>(metre)) == "m^(3/5)"); static_assert(unit_symbol(pow<1, 2>(metre / second)) == "m^(1/2)/s^(1/2)"); static_assert(unit_symbol(pow<1, 2>(metre / second)) == "m^(1/2) s^-(1/2)"); static_assert(unit_symbol(litre / (mag<100> * kilo)) == "L/[100 km]"); static_assert(unit_symbol((mag<10> * metre) / (mag<20> * second)) == "[10 m]/[20 s]"); static_assert(unit_symbol(pow<2>(mag<3600> * second)) == "[3600 s]²"); // dimensionless unit static_assert(unit_symbol(radian) == "rad"); // Physical constants static_assert(unit_symbol(si2019::speed_of_light_in_vacuum) == "c"); static_assert(unit_symbol(gram * standard_gravity * si2019::speed_of_light_in_vacuum) == "g c g₀"); static_assert(unit_symbol(gram / standard_gravity) == "g/g₀"); static_assert(unit_symbol(kilo / second / mega) == "km Mpc⁻¹ s⁻¹"); } // namespace