diff --git a/example/clcpp_response.cpp b/example/clcpp_response.cpp index fcf11604..643a7c37 100644 --- a/example/clcpp_response.cpp +++ b/example/clcpp_response.cpp @@ -126,7 +126,7 @@ void calcs_comparison() std::cout << "In multiplication and division:\n\n"; - const quantity], float> ArA = L1A * L2A; + const quantity ArA = L1A * L2A; std::cout << UNITS_STD_FMT::format("{:%.30Q %q}\n * {:%.30Q %q}\n = {:%.30Q %q}\n\n", L1A, L2A, ArA); std::cout << "similar problems arise\n\n"; diff --git a/example/foot_pound_second.cpp b/example/foot_pound_second.cpp index 96aa9668..0c06f4e1 100644 --- a/example/foot_pound_second.cpp +++ b/example/foot_pound_second.cpp @@ -58,7 +58,7 @@ auto fmt_line(const Q& q) // Print the ship details in the units as defined in the Ship struct, in other si::imperial units, and in SI void print_details(std::string_view description, const Ship& ship) { - const auto waterDensity = 62.4 * isq::density[lb / cubic]; + const auto waterDensity = 62.4 * isq::density[lb / cubic(ft)]; std::cout << UNITS_STD_FMT::format("{}\n", description); std::cout << UNITS_STD_FMT::format("{:20} : {}\n", "length", fmt_line(ship.length)) << UNITS_STD_FMT::format("{:20} : {}\n", "draft", fmt_line(ship.draft)) diff --git a/src/core/include/mp-units/unit.h b/src/core/include/mp-units/unit.h index d51819ea..1906ab3f 100644 --- a/src/core/include/mp-units/unit.h +++ b/src/core/include/mp-units/unit.h @@ -78,7 +78,7 @@ inline constexpr bool is_specialization_of_scaled_unit> = true * inline constexpr struct second : named_unit<"s", time> {} second; * inline constexpr struct metre : named_unit<"m", length> {} metre; * inline constexpr struct hertz : named_unit<"Hz", 1 / second> {} hertz; - * inline constexpr struct newton : named_unit<"N", kilogram * metre / square> {} newton; + * inline constexpr struct newton : named_unit<"N", kilogram * metre / square(second)> {} newton; * inline constexpr struct degree_Celsius : named_unit {} degree_Celsius; * inline constexpr struct minute : named_unit<"min", mag<60> * second> {} minute; * @endcode @@ -180,7 +180,7 @@ struct named_unit : std::remove_const_t { * * @code{.cpp} * inline constexpr struct standard_gravity_unit : - * constant_unit<"g", mag * metre / square> {} standard_gravity_unit; + * constant_unit<"g", mag * metre / square(second)> {} standard_gravity_unit; * @endcode * * @note A common convention in this library is to assign the same name for a type and an object of this type. @@ -253,7 +253,7 @@ struct is_one : std::false_type {}; * static_assert(is_of_type>>); * static_assert(is_of_type>); * static_assert(is_of_type>>); - * static_assert(is_of_type, derived_unit>>>); + * static_assert(is_of_type>>>); * static_assert(is_of_type>>); * @endcode * @@ -564,18 +564,30 @@ template else return derived_unit>{}; } else if constexpr (detail::is_specialization_of_scaled_unit) { - return scaled_unit(U::mag), std::remove_const_t(U::reference_unit))>>{}; + return scaled_unit(U::mag), std::remove_const_t(U::reference_unit))>>{}; } else { return detail::expr_pow(u); } } -// Helper variable templates to create common powers -template -inline constexpr decltype(U * U) square; +/** + * @brief Computes the square power of a unit + * + * @param u Unit being the base of the operation + * + * @return Unit The result of computation + */ +[[nodiscard]] consteval Unit auto square(Unit auto u) { return pow<2>(u); } + +/** + * @brief Computes the cubic power of a unit + * + * @param u Unit being the base of the operation + * + * @return Unit The result of computation + */ +[[nodiscard]] consteval Unit auto cubic(Unit auto u) { return pow<3>(u); } -template -inline constexpr decltype(U * U * U) cubic; // common dimensionless units // clang-format off diff --git a/src/systems/angular/include/mp-units/systems/angular/angular.h b/src/systems/angular/include/mp-units/systems/angular/angular.h index b24e3cc2..cfe1e192 100644 --- a/src/systems/angular/include/mp-units/systems/angular/angular.h +++ b/src/systems/angular/include/mp-units/systems/angular/angular.h @@ -37,7 +37,7 @@ inline constexpr struct radian : named_unit<"rad", kind_of> {} radian; inline constexpr struct revolution : named_unit<"rev", mag<2> * mag_pi * radian> {} revolution; inline constexpr struct degree : named_unit * revolution> {} degree; inline constexpr struct gradian : named_unit * revolution> {} gradian; -inline constexpr struct steradian : named_unit<"sr", square> {} steradian; +inline constexpr struct steradian : named_unit<"sr", square(radian)> {} steradian; // clang-format on namespace unit_symbols { @@ -47,8 +47,8 @@ inline constexpr auto rev = revolution; inline constexpr auto deg = degree; inline constexpr auto grad = gradian; inline constexpr auto sr = steradian; -inline constexpr auto rad2 = square; -inline constexpr auto deg2 = square; +inline constexpr auto rad2 = square(radian); +inline constexpr auto deg2 = square(degree); } // namespace unit_symbols diff --git a/src/systems/cgs/include/mp-units/systems/cgs/cgs.h b/src/systems/cgs/include/mp-units/systems/cgs/cgs.h index bbcea163..69f4dcf8 100644 --- a/src/systems/cgs/include/mp-units/systems/cgs/cgs.h +++ b/src/systems/cgs/include/mp-units/systems/cgs/cgs.h @@ -31,12 +31,12 @@ namespace mp_units::cgs { inline constexpr struct centimetre : decltype(si::centi) {} centimetre; inline constexpr struct gram : decltype(si::gram) {} gram; inline constexpr struct second : decltype(si::second) {} second; -inline constexpr struct gal : named_unit<"Gal", centimetre / square> {} gal; -inline constexpr struct dyne : named_unit<"dyn", gram * centimetre / square> {} dyne; +inline constexpr struct gal : named_unit<"Gal", centimetre / square(second)> {} gal; +inline constexpr struct dyne : named_unit<"dyn", gram * centimetre / square(second)> {} dyne; inline constexpr struct erg : named_unit<"erg", dyne * centimetre> {} erg; -inline constexpr struct barye : named_unit<"Ba", gram / (centimetre * square)> {} barye; +inline constexpr struct barye : named_unit<"Ba", gram / (centimetre * square(second))> {} barye; inline constexpr struct poise : named_unit<"P", gram / (centimetre * second)> {} poise; -inline constexpr struct stokes : named_unit<"St", square / second> {} stokes; +inline constexpr struct stokes : named_unit<"St", square(centimetre) / second> {} stokes; inline constexpr struct kayser : named_unit<"K", 1 / centimetre> {} kayser; // clang-format on @@ -53,10 +53,10 @@ inline constexpr auto St = stokes; inline constexpr auto K = kayser; // commonly used squared and cubic units -inline constexpr auto cm2 = square; -inline constexpr auto cm3 = cubic; -inline constexpr auto s2 = square; -inline constexpr auto s3 = cubic; +inline constexpr auto cm2 = square(centimetre); +inline constexpr auto cm3 = cubic(centimetre); +inline constexpr auto s2 = square(second); +inline constexpr auto s3 = cubic(second); } // namespace unit_symbols diff --git a/src/systems/hep/include/mp-units/systems/hep/hep.h b/src/systems/hep/include/mp-units/systems/hep/hep.h index ffa52f3d..e9e1dfc0 100644 --- a/src/systems/hep/include/mp-units/systems/hep/hep.h +++ b/src/systems/hep/include/mp-units/systems/hep/hep.h @@ -36,7 +36,7 @@ using si::electronvolt; // effective cross-sectional area according to EU council directive 80/181/EEC // https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:01980L0181-20090527#page=10 // https://www.fedlex.admin.ch/eli/cc/1994/3109_3109_3109/de -inline constexpr struct barn : named_unit<"b", mag_power<10, -28> * square> {} barn; +inline constexpr struct barn : named_unit<"b", mag_power<10, -28> * square(si::metre)> {} barn; // mass inline constexpr struct electron_mass : named_unit<"m_e", mag * mag_power<10, -31> * si::kilogram> {} electron_mass; @@ -90,7 +90,7 @@ inline constexpr auto m_p = proton_mass; inline constexpr auto m_n = neutron_mass; inline constexpr auto c = si::si2019::speed_of_light_in_vacuum_unit; -inline constexpr auto c2 = square; +inline constexpr auto c2 = square(si::si2019::speed_of_light_in_vacuum_unit); } // namespace unit_symbols diff --git a/src/systems/imperial/include/mp-units/systems/imperial/imperial.h b/src/systems/imperial/include/mp-units/systems/imperial/imperial.h index 8f43b059..e99ae860 100644 --- a/src/systems/imperial/include/mp-units/systems/imperial/imperial.h +++ b/src/systems/imperial/include/mp-units/systems/imperial/imperial.h @@ -46,7 +46,7 @@ inline constexpr struct link : named_unit<"li", mag * chain> {} l inline constexpr struct rod : named_unit<"rd", mag<25> * link> {} rod; // https://en.wikipedia.org/wiki/Imperial_units#Area -inline constexpr struct perch : decltype(square) {} perch; +inline constexpr struct perch : decltype(square(rod)) {} perch; inline constexpr struct rood : decltype(mag<40> * perch) {} rood; inline constexpr struct acre : decltype(mag<4> * rood) {} acre; diff --git a/src/systems/international/include/mp-units/systems/international/international.h b/src/systems/international/include/mp-units/systems/international/international.h index fa5c5d9c..0b103eba 100644 --- a/src/systems/international/include/mp-units/systems/international/international.h +++ b/src/systems/international/include/mp-units/systems/international/international.h @@ -52,7 +52,7 @@ inline constexpr struct knot : named_unit<"kn", nautical_mile / si::hour> {} kno // force // https://en.wikipedia.org/wiki/Poundal -inline constexpr struct poundal : named_unit<"pdl", pound * foot / square> {} poundal; +inline constexpr struct poundal : named_unit<"pdl", pound * foot / square(si::second)> {} poundal; // https://en.wikipedia.org/wiki/Pound_(force) inline constexpr struct pound_force : named_unit<"lbf", pound * si::standard_gravity_unit> {} pound_force; @@ -61,7 +61,7 @@ inline constexpr struct pound_force : named_unit<"lbf", pound * si::standard_gra inline constexpr struct kip : decltype(si::kilo) {} kip; // pressure -inline constexpr struct psi : named_unit<"psi", pound_force / square> {} psi; +inline constexpr struct psi : named_unit<"psi", pound_force / square(inch)> {} psi; // power // https://en.wikipedia.org/wiki/Horsepower#Definitions diff --git a/src/systems/natural/include/mp-units/systems/natural/natural.h b/src/systems/natural/include/mp-units/systems/natural/natural.h index a5379e3a..99095912 100644 --- a/src/systems/natural/include/mp-units/systems/natural/natural.h +++ b/src/systems/natural/include/mp-units/systems/natural/natural.h @@ -43,7 +43,7 @@ inline constexpr struct velocity : system_reference {} veloc inline constexpr struct speed : system_reference {} speed; inline constexpr struct acceleration : system_reference {} acceleration; inline constexpr struct momentum : system_reference {} momentum; -inline constexpr struct force : system_reference> {} force; +inline constexpr struct force : system_reference {} force; inline constexpr struct energy : system_reference {} energy; // clang-format on @@ -53,7 +53,7 @@ inline constexpr auto speed_of_light_in_vacuum = speed[one]; namespace unit_symbols { inline constexpr auto GeV = gigaelectronvolt; -inline constexpr auto GeV2 = square; +inline constexpr auto GeV2 = square(gigaelectronvolt); } // namespace unit_symbols diff --git a/src/systems/si/include/mp-units/systems/si/constants.h b/src/systems/si/include/mp-units/systems/si/constants.h index d466736a..26ee967e 100644 --- a/src/systems/si/include/mp-units/systems/si/constants.h +++ b/src/systems/si/include/mp-units/systems/si/constants.h @@ -61,7 +61,7 @@ inline constexpr auto avogadro_constant = (1 / isq::amount_of_substance)[avogadr // clang-format off inline constexpr struct standard_gravity_unit : - constant_unit * metre / square> {} standard_gravity_unit; + constant_unit * metre / square(second)> {} standard_gravity_unit; inline constexpr struct magnetic_constant_unit : constant_unit * mag_pi * mag_power<10, -7> * henry / metre> {} magnetic_constant_unit; // clang-format on diff --git a/src/systems/si/include/mp-units/systems/si/unit_symbols.h b/src/systems/si/include/mp-units/systems/si/unit_symbols.h index 5c4ce0fe..8e37c53f 100644 --- a/src/systems/si/include/mp-units/systems/si/unit_symbols.h +++ b/src/systems/si/include/mp-units/systems/si/unit_symbols.h @@ -747,10 +747,10 @@ inline constexpr auto h = hour; inline constexpr auto d = day; // commonly used squared and cubic units -inline constexpr auto m2 = square; -inline constexpr auto m3 = cubic; +inline constexpr auto m2 = square(metre); +inline constexpr auto m3 = cubic(metre); inline constexpr auto m4 = pow<4>(metre); -inline constexpr auto s2 = square; -inline constexpr auto s3 = cubic; +inline constexpr auto s2 = square(second); +inline constexpr auto s3 = cubic(second); } // namespace mp_units::si::unit_symbols diff --git a/src/systems/si/include/mp-units/systems/si/units.h b/src/systems/si/include/mp-units/systems/si/units.h index 949b49ca..bbb830d4 100644 --- a/src/systems/si/include/mp-units/systems/si/units.h +++ b/src/systems/si/include/mp-units/systems/si/units.h @@ -42,15 +42,15 @@ inline constexpr struct candela : named_unit<"cd", kind_of> {} radian; -inline constexpr struct steradian : named_unit<"sr", square / square, kind_of> {} steradian; +inline constexpr struct steradian : named_unit<"sr", square(metre) / square(metre), kind_of> {} steradian; inline constexpr struct hertz : named_unit<"Hz", 1 / second, kind_of> {} hertz; -inline constexpr struct newton : named_unit<"N", kilogram * metre / square> {} newton; +inline constexpr struct newton : named_unit<"N", kilogram * metre / square(second)> {} newton; #ifdef pascal #pragma push_macro("pascal") #undef pascal #define UNITS_REDEFINE_PASCAL #endif -inline constexpr struct pascal : named_unit<"Pa", newton / square> {} pascal; +inline constexpr struct pascal : named_unit<"Pa", newton / square(metre)> {} pascal; #ifdef UNITS_REDEFINE_PASCAL #pragma pop_macro("pascal") #undef UNITS_REDEFINE_PASCAL @@ -63,12 +63,12 @@ inline constexpr struct farad : named_unit<"F", coulomb / volt> {} farad; inline constexpr struct ohm : named_unit {} ohm; inline constexpr struct siemens : named_unit<"S", 1 / ohm> {} siemens; inline constexpr struct weber : named_unit<"Wb", volt * second> {} weber; -inline constexpr struct tesla : named_unit<"T", weber / square> {} tesla; +inline constexpr struct tesla : named_unit<"T", weber / square(metre)> {} tesla; inline constexpr struct henry : named_unit<"H", weber / ampere> {} henry; // inline constexpr struct degree_Celsius : named_unit * milli, only_for {} degree_Celsius; inline constexpr struct degree_Celsius : named_unit {} degree_Celsius; inline constexpr struct lumen : named_unit<"lm", candela * steradian> {} lumen; -inline constexpr struct lux : named_unit<"lx", lumen / square> {} lux; +inline constexpr struct lux : named_unit<"lx", lumen / square(metre)> {} lux; // inline constexpr struct becquerel : named_unit<"Bq", 1 / second, kind_of> {} becquerel; inline constexpr struct becquerel : named_unit<"Bq", 1 / second> {} becquerel; inline constexpr struct gray : named_unit<"Gy", joule / kilogram> {} gray; @@ -84,9 +84,9 @@ inline constexpr struct degree : named_unit * degree> {} minute; // inline constexpr struct second : named_unit * minute> {} second; -inline constexpr struct are : named_unit<"a", square>> {} are; +inline constexpr struct are : named_unit<"a", square(deca)> {} are; inline constexpr struct hectare : decltype(hecto) {} hectare; -inline constexpr struct litre : named_unit<"l", cubic>> {} litre; +inline constexpr struct litre : named_unit<"l", cubic(deci)> {} litre; inline constexpr struct tonne : named_unit<"t", mag<1000> * kilogram> {} tonne; inline constexpr struct dalton : named_unit<"Da", mag * mag_power<10, -27> * kilogram> {} dalton; // TODO A different value is provided in the SI Brochure and different in the ISO 80000 diff --git a/src/systems/usc/include/mp-units/systems/usc/usc.h b/src/systems/usc/include/mp-units/systems/usc/usc.h index 456f9f8a..98c1ea41 100644 --- a/src/systems/usc/include/mp-units/systems/usc/usc.h +++ b/src/systems/usc/include/mp-units/systems/usc/usc.h @@ -68,11 +68,11 @@ inline constexpr struct league : named_unit<"lea", mag<3> * us_survey_mile> {} l // clang-format off // https://en.wikipedia.org/wiki/United_States_customary_units#Area -inline constexpr struct acre : named_unit<"acre", mag<10> * square> {} acre; +inline constexpr struct acre : named_unit<"acre", mag<10> * square(survey1893::chain)> {} acre; inline constexpr struct section : named_unit<"section", mag<640> * acre> {} section; // https://en.wikipedia.org/wiki/United_States_customary_units#Fluid_volume -inline constexpr struct gallon : named_unit<"gal", mag<231> * cubic> {} gallon; +inline constexpr struct gallon : named_unit<"gal", mag<231> * cubic(inch)> {} gallon; inline constexpr struct pottle : named_unit<"pot", mag * gallon> {} pottle; inline constexpr struct quart : named_unit<"qt", mag * pottle> {} quart; inline constexpr struct pint : named_unit<"pt", mag * quart> {} pint; @@ -89,7 +89,7 @@ inline constexpr struct oil_barrel : named_unit<"bbl", mag * barrel inline constexpr struct hogshead : decltype(mag<63> * gallon) {} hogshead; // https://en.wikipedia.org/wiki/United_States_customary_units#Dry_volume -inline constexpr struct dry_barrel : named_unit<"bbl", mag<7056> * cubic> {} dry_barrel; +inline constexpr struct dry_barrel : named_unit<"bbl", mag<7056> * cubic(inch)> {} dry_barrel; inline constexpr struct bushel : named_unit<"bu", mag * si::litre> {} bushel; inline constexpr struct peck : named_unit<"pk", mag * bushel> {} peck; inline constexpr struct dry_gallon : named_unit<"gal", mag * peck> {} dry_gallon; diff --git a/test/unit_test/static/cgs_test.cpp b/test/unit_test/static/cgs_test.cpp index 7bd900f5..34897a9d 100644 --- a/test/unit_test/static/cgs_test.cpp +++ b/test/unit_test/static/cgs_test.cpp @@ -40,13 +40,13 @@ static_assert(isq::length(100 * cm) == isq::length(1 * si::metre)); static_assert(isq::mass(1000 * g) == isq::mass(1 * si::kilogram)); static_assert(isq::time(1 * s) == isq::time(1 * si::second)); static_assert(isq::speed(100 * (cm / s)) == isq::speed(1 * (si::metre / si::second))); -static_assert(isq::acceleration(100 * Gal) == isq::acceleration(1 * (si::metre / square))); +static_assert(isq::acceleration(100 * Gal) == isq::acceleration(1 * (si::metre / square(si::second)))); static_assert(isq::force(100'000 * dyn) == isq::force(1 * si::newton)); static_assert(isq::energy(10'000'000 * erg) == isq::energy(1 * si::joule)); static_assert(isq::power(10'000'000 * (erg / s)) == isq::power(1 * si::watt)); static_assert(isq::pressure(10 * Ba) == isq::pressure(1 * si::pascal)); static_assert(isq::dynamic_viscosity(10 * P) == isq::dynamic_viscosity(1 * (si::pascal * si::second))); -static_assert(isq::kinematic_viscosity(10'000 * St) == isq::kinematic_viscosity(1 * (square / si::second))); +static_assert(isq::kinematic_viscosity(10'000 * St) == isq::kinematic_viscosity(1 * (square(si::metre) / si::second))); static_assert(isq::wavenumber(1 * K) == isq::wavenumber(100 * (1 / si::metre))); } // namespace diff --git a/test/unit_test/static/concepts_test.cpp b/test/unit_test/static/concepts_test.cpp index a4045afa..085cb3b3 100644 --- a/test/unit_test/static/concepts_test.cpp +++ b/test/unit_test/static/concepts_test.cpp @@ -146,7 +146,7 @@ static_assert(Unit); static_assert(Unit>); static_assert(Unit>); static_assert(Unit * si::second)>>); -static_assert(Unit)>>); +static_assert(Unit>); static_assert(Unit(si::metre))>>); static_assert(Unit); static_assert(Unit, struct si::second>>); @@ -171,7 +171,7 @@ static_assert(!detail::NamedUnit static_assert(!detail::NamedUnit>); static_assert(!detail::NamedUnit>); static_assert(!detail::NamedUnit * si::second)>>); -static_assert(!detail::NamedUnit)>>); +static_assert(!detail::NamedUnit>); static_assert(!detail::NamedUnit(si::metre))>>); static_assert(!detail::NamedUnit); static_assert(!detail::NamedUnit, struct si::second>>); @@ -196,7 +196,7 @@ static_assert(!PrefixableUnit)>> static_assert(!PrefixableUnit>); static_assert(!PrefixableUnit>); static_assert(!PrefixableUnit * si::second)>>); -static_assert(!PrefixableUnit)>>); +static_assert(!PrefixableUnit>); static_assert(!PrefixableUnit(si::metre))>>); static_assert(!PrefixableUnit); static_assert(!PrefixableUnit, struct si::second>>); @@ -221,7 +221,7 @@ static_assert(AssociatedUnit)>>) static_assert(AssociatedUnit>); static_assert(AssociatedUnit>); static_assert(AssociatedUnit * si::second)>>); -static_assert(AssociatedUnit)>>); +static_assert(AssociatedUnit>); static_assert(AssociatedUnit(si::metre))>>); static_assert(AssociatedUnit); static_assert(AssociatedUnit, struct si::second>>); diff --git a/test/unit_test/static/reference_test.cpp b/test/unit_test/static/reference_test.cpp index 83f98484..923cfb5a 100644 --- a/test/unit_test/static/reference_test.cpp +++ b/test/unit_test/static/reference_test.cpp @@ -90,11 +90,11 @@ inline constexpr struct force : system_reference {} // derived named units inline constexpr struct radian_ : named_unit<"rad", metre / metre, kind_of> {} radian; -inline constexpr struct steradian_ : named_unit<"sr", square / square, kind_of> {} steradian; +inline constexpr struct steradian_ : named_unit<"sr", square(metre) / square(metre), kind_of> {} steradian; inline constexpr struct hertz_ : named_unit<"Hz", 1 / second, kind_of> {} hertz; inline constexpr struct becquerel_ : named_unit<"Bq", 1 / second, kind_of> {} becquerel; -inline constexpr struct newton_ : named_unit<"N", kilogram * metre / square> {} newton; -inline constexpr struct pascal_ : named_unit<"Pa", newton / square> {} pascal; +inline constexpr struct newton_ : named_unit<"N", kilogram * metre / square(second)> {} newton; +inline constexpr struct pascal_ : named_unit<"Pa", newton / square(metre)> {} pascal; inline constexpr struct joule_ : named_unit<"J", newton * metre> {} joule; inline constexpr struct watt_ : named_unit<"W", joule / second> {} watt; @@ -108,8 +108,8 @@ inline constexpr struct bit_ : named_unit<"bit", one, kind_of> // Unit as a reference static_assert(is_of_type<42 * metre, quantity>); static_assert(quantity::quantity_spec == length); -static_assert(is_of_type<42 * square, quantity, int>>); -static_assert(quantity, int>::quantity_spec == pow<2>(length)); +static_assert(is_of_type<42 * square(metre), quantity>); +static_assert(quantity::quantity_spec == pow<2>(length)); static_assert(is_of_type<42 * (metre / second), quantity>); static_assert(quantity::quantity_spec == length / time); static_assert(is_of_type<42 * newton, quantity>); @@ -201,8 +201,8 @@ static_assert( quantity>{}, derived_unit>{}>{}, long double>>); -static_assert(is_of_type<1. / 4 * area[square], decltype(1. * area[square] / 4)>); -static_assert(1. / 4 * area[square] == 1. * area[square] / 4); +static_assert(is_of_type<1. / 4 * area[square(metre)], decltype(1. * area[square(metre)] / 4)>); +static_assert(1. / 4 * area[square(metre)] == 1. * area[square(metre)] / 4); // Natural Units static_assert(is_of_type<42 * nu::time[nu::second], quantity{}, int>>); diff --git a/test/unit_test/static/unit_symbol_test.cpp b/test/unit_test/static/unit_symbol_test.cpp index d8b3fffc..9ded737f 100644 --- a/test/unit_test/static/unit_symbol_test.cpp +++ b/test/unit_test/static/unit_symbol_test.cpp @@ -115,10 +115,10 @@ static_assert(unit_symbol(one) == ""); static_assert(unit_symbol(percent) == "%"); static_assert(unit_symbol(per_mille) == "‰"); static_assert(unit_symbol(per_mille, {.encoding = ascii}) == "%o"); -static_assert(unit_symbol(square) == "m²"); -static_assert(unit_symbol(square, {.encoding = ascii}) == "m^2"); -static_assert(unit_symbol(cubic) == "m³"); -static_assert(unit_symbol(cubic, {.encoding = ascii}) == "m^3"); +static_assert(unit_symbol(square(metre)) == "m²"); +static_assert(unit_symbol(square(metre), {.encoding = ascii}) == "m^2"); +static_assert(unit_symbol(cubic(metre)) == "m³"); +static_assert(unit_symbol(cubic(metre), {.encoding = ascii}) == "m^3"); static_assert(unit_symbol(kilo * metre) == "km m"); static_assert(unit_symbol(kilo * metre, {.separator = dot}) == "km⋅m"); static_assert(unit_symbol(metre / metre) == ""); @@ -130,29 +130,29 @@ static_assert(unit_symbol(metre / second, {.solidus = always}) == "m/s"); static_assert(unit_symbol(metre / second, {.solidus = never}) == "m s⁻¹"); static_assert(unit_symbol(metre / second, {.encoding = ascii, .solidus = never}) == "m s^-1"); static_assert(unit_symbol(metre / second, {.solidus = never, .separator = dot}) == "m⋅s⁻¹"); -static_assert(unit_symbol(metre / square) == "m/s²"); -static_assert(unit_symbol(metre / square, {.encoding = ascii}) == "m/s^2"); -static_assert(unit_symbol(metre / square, {.solidus = always}) == "m/s²"); -static_assert(unit_symbol(metre / square, {.encoding = ascii, .solidus = always}) == "m/s^2"); -static_assert(unit_symbol(metre / square, {.solidus = never}) == "m s⁻²"); -static_assert(unit_symbol(metre / square, {.encoding = ascii, .solidus = never}) == "m s^-2"); -static_assert(unit_symbol(metre / square, {.solidus = never, .separator = dot}) == "m⋅s⁻²"); -static_assert(unit_symbol(kilogram * metre / square) == "kg m/s²"); -static_assert(unit_symbol(kilogram * metre / square, {.separator = dot}) == "kg⋅m/s²"); -static_assert(unit_symbol(kilogram * metre / square, {.encoding = ascii}) == "kg m/s^2"); -static_assert(unit_symbol(kilogram * metre / square, {.solidus = always}) == "kg m/s²"); -static_assert(unit_symbol(kilogram * metre / square, {.encoding = ascii, .solidus = always}) == "kg m/s^2"); -static_assert(unit_symbol(kilogram * metre / square, {.solidus = never}) == "kg m s⁻²"); -static_assert(unit_symbol(kilogram * metre / square, {.encoding = ascii, .solidus = never}) == "kg m s^-2"); -static_assert(unit_symbol(kilogram * metre / square, {.solidus = never, .separator = dot}) == "kg⋅m⋅s⁻²"); -static_assert(unit_symbol(kilogram / metre / square) == "kg m⁻¹ s⁻²"); -static_assert(unit_symbol(kilogram / metre / square, {.separator = dot}) == "kg⋅m⁻¹⋅s⁻²"); -static_assert(unit_symbol(kilogram / metre / square, {.encoding = ascii}) == "kg m^-1 s^-2"); -static_assert(unit_symbol(kilogram / metre / square, {.solidus = always}) == "kg/(m s²)"); -static_assert(unit_symbol(kilogram / metre / square, {.encoding = ascii, .solidus = always}) == "kg/(m s^2)"); -static_assert(unit_symbol(kilogram / metre / square, {.solidus = never}) == "kg m⁻¹ s⁻²"); -static_assert(unit_symbol(kilogram / metre / square, {.encoding = ascii, .solidus = never}) == "kg m^-1 s^-2"); -static_assert(unit_symbol(kilogram / metre / square, {.solidus = never, .separator = dot}) == "kg⋅m⁻¹⋅s⁻²"); +static_assert(unit_symbol(metre / square(second)) == "m/s²"); +static_assert(unit_symbol(metre / square(second), {.encoding = ascii}) == "m/s^2"); +static_assert(unit_symbol(metre / square(second), {.solidus = always}) == "m/s²"); +static_assert(unit_symbol(metre / square(second), {.encoding = ascii, .solidus = always}) == "m/s^2"); +static_assert(unit_symbol(metre / square(second), {.solidus = never}) == "m s⁻²"); +static_assert(unit_symbol(metre / square(second), {.encoding = ascii, .solidus = never}) == "m s^-2"); +static_assert(unit_symbol(metre / square(second), {.solidus = never, .separator = dot}) == "m⋅s⁻²"); +static_assert(unit_symbol(kilogram * metre / square(second)) == "kg m/s²"); +static_assert(unit_symbol(kilogram * metre / square(second), {.separator = dot}) == "kg⋅m/s²"); +static_assert(unit_symbol(kilogram * metre / square(second), {.encoding = ascii}) == "kg m/s^2"); +static_assert(unit_symbol(kilogram * metre / square(second), {.solidus = always}) == "kg m/s²"); +static_assert(unit_symbol(kilogram * metre / square(second), {.encoding = ascii, .solidus = always}) == "kg m/s^2"); +static_assert(unit_symbol(kilogram * metre / square(second), {.solidus = never}) == "kg m s⁻²"); +static_assert(unit_symbol(kilogram * metre / square(second), {.encoding = ascii, .solidus = never}) == "kg m s^-2"); +static_assert(unit_symbol(kilogram * metre / square(second), {.solidus = never, .separator = dot}) == "kg⋅m⋅s⁻²"); +static_assert(unit_symbol(kilogram / metre / square(second)) == "kg m⁻¹ s⁻²"); +static_assert(unit_symbol(kilogram / metre / square(second), {.separator = dot}) == "kg⋅m⁻¹⋅s⁻²"); +static_assert(unit_symbol(kilogram / metre / square(second), {.encoding = ascii}) == "kg m^-1 s^-2"); +static_assert(unit_symbol(kilogram / metre / square(second), {.solidus = always}) == "kg/(m s²)"); +static_assert(unit_symbol(kilogram / metre / square(second), {.encoding = ascii, .solidus = always}) == "kg/(m s^2)"); +static_assert(unit_symbol(kilogram / metre / square(second), {.solidus = never}) == "kg m⁻¹ s⁻²"); +static_assert(unit_symbol(kilogram / metre / square(second), {.encoding = ascii, .solidus = never}) == "kg m^-1 s^-2"); +static_assert(unit_symbol(kilogram / metre / square(second), {.solidus = never, .separator = dot}) == "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)"); diff --git a/test/unit_test/static/unit_test.cpp b/test/unit_test/static/unit_test.cpp index 20104c89..598504e7 100644 --- a/test/unit_test/static/unit_test.cpp +++ b/test/unit_test/static/unit_test.cpp @@ -58,11 +58,11 @@ inline constexpr struct nu_second_ : named_unit<"s"> {} nu_second; // derived named units inline constexpr struct radian_ : named_unit<"rad", metre / metre> {} radian; -inline constexpr struct steradian_ : named_unit<"sr", square / square> {} steradian; +inline constexpr struct steradian_ : named_unit<"sr", square(metre) / square(metre)> {} steradian; inline constexpr struct hertz_ : named_unit<"Hz", 1 / second> {} hertz; inline constexpr struct becquerel_ : named_unit<"Bq", 1 / second> {} becquerel; -inline constexpr struct newton_ : named_unit<"N", kilogram * metre / square> {} newton; -inline constexpr struct pascal_ : named_unit<"Pa", newton / square> {} pascal; +inline constexpr struct newton_ : named_unit<"N", kilogram * metre / square(second)> {} newton; +inline constexpr struct pascal_ : named_unit<"Pa", newton / square(metre)> {} pascal; inline constexpr struct joule_ : named_unit<"J", newton * metre> {} joule; inline constexpr struct watt_ : named_unit<"W", joule / second> {} watt; inline constexpr struct degree_Celsius_ : named_unit {} degree_Celsius; @@ -72,9 +72,9 @@ inline constexpr struct hour_ : named_unit<"h", mag<60> * minute> {} hour; inline constexpr struct day_ : named_unit<"d", mag<24> * hour> {} day; inline constexpr struct astronomical_unit_ : named_unit<"au", mag<149'597'870'700> * metre> {} astronomical_unit; inline constexpr struct degree_ : named_unit * radian> {} degree; -inline constexpr struct are_ : named_unit<"a", square>> {} are; +inline constexpr struct are_ : named_unit<"a", square(si::deca)> {} are; inline constexpr struct hectare_ : decltype(si::hecto) {} hectare; -inline constexpr struct litre_ : named_unit<"l", cubic>> {} litre; +inline constexpr struct litre_ : named_unit<"l", cubic(si::deci)> {} litre; inline constexpr struct tonne_ : named_unit<"t", mag<1000> * kilogram> {} tonne; inline constexpr struct dalton_ : named_unit<"Da", mag * mag_power<10, -27> * kilogram> {} dalton; inline constexpr struct electronvolt_ : named_unit<"eV", mag * mag_power<10, -19> * joule> {} electronvolt; @@ -87,7 +87,7 @@ inline constexpr struct kilometre_ : decltype(si::kilo) {} kilometre; inline constexpr struct kilojoule_ : decltype(si::kilo) {} kilojoule; // physical constant units -inline constexpr struct standard_gravity_unit_ : constant_unit<"g", mag * metre / square> {} standard_gravity_unit; +inline constexpr struct standard_gravity_unit_ : constant_unit<"g", mag * metre / square(second)> {} standard_gravity_unit; inline constexpr struct speed_of_light_in_vacuum_unit_ : constant_unit<"c", mag<299'792'458> * metre / second> {} speed_of_light_in_vacuum_unit; // clang-format on @@ -101,8 +101,8 @@ static_assert(Unit); static_assert(Unit); static_assert(Unit); static_assert(Unit)>); -static_assert(Unit)>); -static_assert(Unit)>); +static_assert(Unit); +static_assert(Unit); static_assert(Unit * second)>); static_assert(Unit); static_assert(Unit); @@ -110,19 +110,19 @@ static_assert(Unit); static_assert(Unit); static_assert(Unit); -static_assert(NamedUnit); -static_assert(NamedUnit); -static_assert(NamedUnit); -static_assert(NamedUnit); -static_assert(NamedUnit); -static_assert(!NamedUnit); -static_assert(!NamedUnit); -static_assert(!NamedUnit); -static_assert(!NamedUnit)>); -static_assert(!NamedUnit)>); -static_assert(!NamedUnit)>); -static_assert(!NamedUnit * second)>); -static_assert(!NamedUnit); +static_assert(detail::NamedUnit); +static_assert(detail::NamedUnit); +static_assert(detail::NamedUnit); +static_assert(detail::NamedUnit); +static_assert(detail::NamedUnit); +static_assert(!detail::NamedUnit); +static_assert(!detail::NamedUnit); +static_assert(!detail::NamedUnit); +static_assert(!detail::NamedUnit)>); +static_assert(!detail::NamedUnit); +static_assert(!detail::NamedUnit); +static_assert(!detail::NamedUnit * second)>); +static_assert(!detail::NamedUnit); // named unit static_assert(is_of_type); @@ -195,9 +195,9 @@ static_assert( is_of_type>>>); static_assert(get_canonical_unit(standard_gravity_unit).mag == mag); static_assert(convertible(standard_gravity_unit, standard_gravity_unit)); -static_assert(convertible(standard_gravity_unit, metre / square)); +static_assert(convertible(standard_gravity_unit, metre / square(second))); static_assert(standard_gravity_unit == standard_gravity_unit); -static_assert(standard_gravity_unit != metre / square); // magnitude is different +static_assert(standard_gravity_unit != metre / square(second)); // magnitude is different static_assert(standard_gravity_unit.symbol == "[g]"); // prefixed_unit @@ -285,17 +285,17 @@ static_assert(is_of_type<1 / second * one, derived_unit>>); static_assert(is_of_type>); static_assert(is_of_type>>); -static_assert(is_of_type, derived_unit>>); -static_assert(is_of_type, derived_unit>>); -static_assert(is_of_type * metre, derived_unit>>); -static_assert(is_of_type, derived_unit>>); -static_assert(is_of_type / metre, metre_>); -static_assert(is_of_type / metre, derived_unit>>); -static_assert(is_of_type / square, metre_>); +static_assert(is_of_type>>); +static_assert(is_of_type>>); +static_assert(is_of_type>>); +static_assert(is_of_type>>); +static_assert(is_of_type); +static_assert(is_of_type>>); +static_assert(is_of_type); static_assert(is_of_type>>); -static_assert(is_of_type, derived_unit>>>); -static_assert(is_of_type / second, derived_unit>>>); +static_assert(is_of_type>>>); +static_assert(is_of_type>>>); static_assert(is_of_type, second_>>); static_assert(is_of_type, second_>>); @@ -326,12 +326,12 @@ static_assert(is_of_type<1 / (1 / second), second_>); static_assert(is_of_type); static_assert(is_of_type<1 / pascal, derived_unit>>); -static_assert(is_of_type<1 / gram * metre * square, derived_unit, per>>); -static_assert(is_of_type<1 / (gram / (metre * square)), derived_unit, per>>); -static_assert(is_of_type / gram), derived_unit, per>>); -static_assert(is_of_type / gram, derived_unit, per>>); -static_assert(is_of_type<(metre * square / gram) * one, derived_unit, per>>); -static_assert(is_of_type / gram * one, derived_unit, per>>); +static_assert(is_of_type<1 / gram * metre * square(second), derived_unit, per>>); +static_assert(is_of_type<1 / (gram / (metre * square(second))), derived_unit, per>>); +static_assert(is_of_type, per>>); +static_assert(is_of_type, per>>); +static_assert(is_of_type<(metre * square(second) / gram) * one, derived_unit, per>>); +static_assert(is_of_type, per>>); static_assert(is_of_type>); static_assert(is_of_type>); @@ -347,7 +347,7 @@ static_assert(std::is_same_v); static_assert(std::is_same_v); static_assert(std::is_same_v); -static_assert(std::is_same_v)>); +static_assert(std::is_same_v); // derived unit normalization @@ -474,11 +474,11 @@ static_assert(metre / metre == one); static_assert(hertz * second == one); static_assert(hertz == 1 / second); -static_assert(newton == kilogram * metre / square); -static_assert(joule == kilogram * square / square); +static_assert(newton == kilogram * metre / square(second)); +static_assert(joule == kilogram * square(metre) / square(second)); static_assert(joule == newton * metre); static_assert(watt == joule / second); -static_assert(watt == kilogram * square / cubic); +static_assert(watt == kilogram * square(metre) / cubic(second)); // power static_assert(is_same_v(metre)), decltype(metre * metre)>); diff --git a/test/unit_test/static/usc_test.cpp b/test/unit_test/static/usc_test.cpp index 9480251c..cfdf26c4 100644 --- a/test/unit_test/static/usc_test.cpp +++ b/test/unit_test/static/usc_test.cpp @@ -72,16 +72,16 @@ static_assert(isq::length(1 * survey1893::us_survey_mile) == isq::length(8 * sur static_assert(isq::length(1 * survey1893::league) == isq::length(3 * survey1893::us_survey_mile)); // Area -// static_assert(isq::area(1 * square) == isq::area(144 * square)); -static_assert(isq::area(1 * square) == isq::area(4356 * square)); -static_assert(isq::area(1 * acre) == isq::area(43560 * square)); -static_assert(isq::area(1 * section) == isq::area(1 * square)); +// static_assert(isq::area(1 * square(survey1893::us_survey_foot)) == isq::area(144 * square(inch))); +static_assert(isq::area(1 * square(survey1893::chain)) == isq::area(4356 * square(survey1893::us_survey_foot))); +static_assert(isq::area(1 * acre) == isq::area(43560 * square(survey1893::us_survey_foot))); +static_assert(isq::area(1 * section) == isq::area(1 * square(survey1893::us_survey_mile))); // Volume -static_assert(isq::volume(1 * cubic) == isq::volume(1'728 * cubic)); -static_assert(isq::volume(1 * cubic) == isq::volume(27 * cubic)); +static_assert(isq::volume(1 * cubic(foot)) == isq::volume(1'728 * cubic(inch))); +static_assert(isq::volume(1 * cubic(yard)) == isq::volume(27 * cubic(foot))); static_assert(isq::volume(1 * (acre * survey1893::us_survey_foot)) == - isq::volume(43'560 * cubic)); + isq::volume(43'560 * cubic(survey1893::us_survey_foot))); // Fluid volume static_assert(isq::volume(1 * fl_dr) == isq::volume(60 * min)); @@ -104,7 +104,7 @@ static_assert(isq::volume(1 * dry_qt) == isq::volume(2 * dry_pt)); static_assert(isq::volume(1 * dry_gal) == isq::volume(4 * dry_qt)); static_assert(isq::volume(1 * pk) == isq::volume(2 * dry_gal)); static_assert(isq::volume(1 * bu) == isq::volume(4 * pk)); -static_assert(isq::volume(1 * dry_bbl) == isq::volume(7056 * cubic)); +static_assert(isq::volume(1 * dry_bbl) == isq::volume(7056 * cubic(inch))); // Mass static_assert(isq::mass(7'000 * gr) == isq::mass(1 * lb));