diff --git a/example/avg_speed.cpp b/example/avg_speed.cpp index 11072bb3..dc2d24d2 100644 --- a/example/avg_speed.cpp +++ b/example/avg_speed.cpp @@ -45,26 +45,26 @@ namespace { using namespace mp_units; -constexpr quantity fixed_int_si_avg_speed(quantity<(si::metre), int> d, - quantity<(si::second), int> t) +constexpr quantity fixed_int_si_avg_speed(quantity d, + quantity t) { return d / t; } -constexpr quantity fixed_double_si_avg_speed(quantity<(si::metre)> d, quantity<(si::second)> t) +constexpr quantity fixed_double_si_avg_speed(quantity d, quantity t) { return d / t; } -constexpr QuantityOf<(isq::speed)> auto avg_speed(QuantityOf<(isq::length)> auto d, QuantityOf<(isq::time)> auto t) +constexpr QuantityOf auto avg_speed(QuantityOf auto d, QuantityOf auto t) { return d / t; } -template D, QuantityOf<(isq::time)> T, QuantityOf<(isq::speed)> V> +template D, QuantityOf T, QuantityOf V> void print_result(D distance, T duration, V speed) { - const auto result_in_kmph = speed.force_in((si::kilo<(si::metre)> / non_si::hour)); + const auto result_in_kmph = speed.force_in(si::kilo / non_si::hour); std::cout << "Average speed of a car that makes " << distance << " in " << duration << " is " << result_in_kmph << ".\n"; } diff --git a/example/capacitor_time_curve.cpp b/example/capacitor_time_curve.cpp index 2f2f7fdb..4cf363fe 100644 --- a/example/capacitor_time_curve.cpp +++ b/example/capacitor_time_curve.cpp @@ -48,7 +48,7 @@ int main() constexpr auto RR = isq::resistance(4.7 * si::kilo); for (auto tt = 0 * ms; tt <= 50 * ms; ++tt) { - const QuantityOf<(isq::voltage)> auto Vt = V0 * exp(dimensionless(-tt / (RR * CC))); + const QuantityOf auto Vt = V0 * exp(dimensionless(-tt / (RR * CC))); // TODO try to make the below work instead // const QuantityOf auto Vt = V0 * exp(-tt / (RR * CC)); diff --git a/example/clcpp_response.cpp b/example/clcpp_response.cpp index 9a74de52..42ed6d0b 100644 --- a/example/clcpp_response.cpp +++ b/example/clcpp_response.cpp @@ -44,8 +44,8 @@ void simple_quantities() using namespace mp_units::si; using namespace mp_units::international; - using distance = quantity<(isq::distance[kilo])>; - using duration = quantity<(isq::duration[second])>; + using distance = quantity]>; + using duration = quantity; constexpr distance km = 1. * kilo; constexpr distance miles = 1. * mile; diff --git a/example/currency.cpp b/example/currency.cpp index 0eb46040..6f280659 100644 --- a/example/currency.cpp +++ b/example/currency.cpp @@ -90,11 +90,11 @@ template #endif -// template auto To, ReferenceOf auto From, typename Rep> -// quantity exchange_to(quantity q) -// { -// return static_cast(exchange_rate() * q.numerical_value()) * To; -// } +template auto To, ReferenceOf auto From, typename Rep> +quantity exchange_to(quantity q) +{ + return static_cast(exchange_rate() * q.numerical_value()) * To; +} template auto To, ReferenceOf auto From, auto PO, typename Rep> quantity_point exchange_to(quantity_point q) @@ -107,8 +107,8 @@ int main() { using namespace unit_symbols; - const mp_units::quantity_point price_usd{100 * USD}; - const mp_units::quantity_point price_euro = exchange_to(price_usd); + const quantity_point price_usd{100 * USD}; + const quantity_point price_euro = exchange_to(price_usd); std::cout << price_usd.quantity_from_zero() << " -> " << price_euro.quantity_from_zero() << "\n"; // std::cout << price_usd.quantity_from_zero() + price_euro.quantity_from_zero() << "\n"; // does diff --git a/example/glide_computer.cpp b/example/glide_computer.cpp index f06062fe..133a7713 100644 --- a/example/glide_computer.cpp +++ b/example/glide_computer.cpp @@ -169,7 +169,7 @@ void example() const auto gliders = get_gliders(); const auto waypoints = get_waypoints(); const auto weather_conditions = get_weather_conditions(); - const task glider_task = {waypoints[0], waypoints[1], waypoints[0]}; + const task t = {waypoints[0], waypoints[1], waypoints[0]}; const aircraft_tow tow = {400 * m, 1.6 * m / s}; const timestamp start_time(std::chrono::system_clock::now()); @@ -177,16 +177,16 @@ void example() print(gliders); print(waypoints); print(weather_conditions); - print(glider_task); + print(t); print(tow); - for (const auto& glider : gliders) { + for (const auto& g : gliders) { for (const auto& c : weather_conditions) { - const std::string txt = "Scenario: Glider = " + glider.name + ", Weather = " + c.first; + const std::string txt = "Scenario: Glider = " + g.name + ", Weather = " + c.first; std::cout << txt << "\n"; std::cout << MP_UNITS_STD_FMT::format("{0:=^{1}}\n\n", "", txt.size()); - estimate(start_time, glider, c.second, glider_task, sfty, tow); + estimate(start_time, g, c.second, t, sfty, tow); std::cout << "\n\n"; } diff --git a/example/glide_computer_lib/include/glide_computer_lib.h b/example/glide_computer_lib/include/glide_computer_lib.h index e8fafbf3..5e2ac4db 100644 --- a/example/glide_computer_lib/include/glide_computer_lib.h +++ b/example/glide_computer_lib/include/glide_computer_lib.h @@ -90,7 +90,7 @@ struct glider { std::array polar; }; -constexpr mp_units::QuantityOf<(mp_units::dimensionless)> auto glide_ratio(const glider::polar_point& polar) +constexpr mp_units::QuantityOf auto glide_ratio(const glider::polar_point& polar) { return polar.v / -polar.climb; } diff --git a/example/hello_units.cpp b/example/hello_units.cpp index 95b5e6d6..e635bc25 100644 --- a/example/hello_units.cpp +++ b/example/hello_units.cpp @@ -45,7 +45,7 @@ import mp_units; using namespace mp_units; -constexpr QuantityOf<(isq::speed)> auto avg_speed(QuantityOf<(isq::length)> auto d, QuantityOf<(isq::time)> auto t) +constexpr QuantityOf auto avg_speed(QuantityOf auto d, QuantityOf auto t) { return d / t; } diff --git a/example/include/geographic.h b/example/include/geographic.h index 4f7ca94a..ba26b3f1 100644 --- a/example/include/geographic.h +++ b/example/include/geographic.h @@ -79,10 +79,10 @@ inline constexpr struct prime_meridian final : mp_units::absolute_point_origin -using latitude = mp_units::quantity_point<(mp_units::si::degree), equator, ranged_representation>; +using latitude = mp_units::quantity_point>; template -using longitude = mp_units::quantity_point<(mp_units::si::degree), prime_meridian, ranged_representation>; +using longitude = mp_units::quantity_point>; template std::basic_ostream& operator<<(std::basic_ostream& os, const latitude& lat) @@ -176,7 +176,7 @@ template distance spherical_distance(position from, position to) { using namespace mp_units; - constexpr quantity earth_radius = 6'371 * isq::radius[si::kilo<(si::metre)>]; + constexpr quantity earth_radius = 6'371 * isq::radius[si::kilo]; using si::sin, si::cos, si::asin, si::acos; @@ -193,7 +193,7 @@ distance spherical_distance(position from, position to) // const auto central_angle = 2 * asin(sqrt(0.5 - cos(to_lat - from_lat) / 2 + cos(from_lat) * cos(to_lat) * (1 // - cos(lon2_rad - from_lon)) / 2)); - return quantity_cast<(isq::distance)>(earth_radius * central_angle); + return quantity_cast(earth_radius * central_angle); } else { // the haversine formula const quantity sin_lat = sin((to_lat - from_lat) / 2); diff --git a/example/kalman_filter/kalman.h b/example/kalman_filter/kalman.h index 80179790..90d0d506 100644 --- a/example/kalman_filter/kalman.h +++ b/example/kalman_filter/kalman.h @@ -116,15 +116,15 @@ template } // state update -template K> +template K> requires(implicitly_convertible(QM::quantity_spec, QP::quantity_spec)) [[nodiscard]] constexpr system_state state_update(const system_state& predicted, QM measured, K gain) { return system_state{get<0>(predicted) + gain * (measured - get<0>(predicted))}; } -template K, - mp_units::QuantityOf<(mp_units::isq::time)> T> +template K, + mp_units::QuantityOf T> requires(implicitly_convertible(QM::quantity_spec, QP1::quantity_spec)) [[nodiscard]] constexpr system_state state_update(const system_state& predicted, QM measured, std::array gain, T interval) @@ -135,7 +135,7 @@ template K, mp_units::QuantityOf<(mp_units::isq::time)> T> + mp_units::QuantityOf K, mp_units::QuantityOf T> requires(implicitly_convertible(QM::quantity_spec, QP1::quantity_spec)) [[nodiscard]] constexpr system_state state_update(const system_state& predicted, QM measured, std::array gain, T interval) @@ -147,13 +147,13 @@ template K> +template K> [[nodiscard]] constexpr Q covariance_update(Q uncertainty, K gain) { return (1 * mp_units::one - gain) * uncertainty; } -template K> +template K> [[nodiscard]] constexpr system_state_estimate state_estimate_update( const system_state_estimate& previous, QP measurement, K gain) { @@ -162,7 +162,7 @@ template T> +template T> [[nodiscard]] constexpr system_state state_extrapolation(const system_state& estimated, T interval) { auto to_quantity = [](const auto& qp) { return qp.quantity_ref_from(qp.point_origin); }; @@ -171,7 +171,7 @@ template return system_state{qp1, qp2}; } -template T> +template T> [[nodiscard]] constexpr system_state state_extrapolation(const system_state& estimated, T interval) { diff --git a/example/measurement.cpp b/example/measurement.cpp index d7650c21..d61c8d2e 100644 --- a/example/measurement.cpp +++ b/example/measurement.cpp @@ -151,7 +151,7 @@ void example() const auto acceleration = isq::acceleration(measurement{9.8, 0.1} * m / s2); const auto time = measurement{1.2, 0.1} * s; - const QuantityOf<(isq::velocity)> auto velocity = acceleration * time; + const MP_UNITS_CONSTRAINED_AUTO_WORKAROUND(QuantityOf) auto velocity = acceleration * time; std::cout << acceleration << " * " << time << " = " << velocity << " = " << velocity.in(km / h) << '\n'; const auto length = measurement{123., 1.} * m; diff --git a/example/spectroscopy_units.cpp b/example/spectroscopy_units.cpp index d618b3b3..3fce6a8b 100644 --- a/example/spectroscopy_units.cpp +++ b/example/spectroscopy_units.cpp @@ -54,8 +54,8 @@ constexpr auto h = 1 * si::si2019::planck_constant; constexpr auto kb = 1 * si::si2019::boltzmann_constant; // prints quantities in the resulting unit -template T1, QuantityOf<(isq::wavenumber)> T2, QuantityOf<(isq::frequency)> T3, - QuantityOf<(isq::thermodynamic_temperature)> T4, QuantityOf<(isq::wavelength)> T5> +template T1, QuantityOf T2, QuantityOf T3, + QuantityOf T4, QuantityOf T5> void print_line(const std::tuple& t) { std::cout << MP_UNITS_STD_FMT::format( @@ -65,8 +65,8 @@ void print_line(const std::tuple& t) // prints quantities in semi-SI units // (eV is not an official SI unit) -template T1, QuantityOf<(isq::wavenumber)> T2, QuantityOf<(isq::frequency)> T3, - QuantityOf<(isq::thermodynamic_temperature)> T4, QuantityOf<(isq::wavelength)> T5> +template T1, QuantityOf T2, QuantityOf T3, + QuantityOf T4, QuantityOf T5> void print_line_si(const std::tuple& t) { std::cout << MP_UNITS_STD_FMT::format( diff --git a/example/storage_tank.cpp b/example/storage_tank.cpp index 44b24738..86bc32ff 100644 --- a/example/storage_tank.cpp +++ b/example/storage_tank.cpp @@ -77,10 +77,10 @@ public: density_ = density; } - [[nodiscard]] constexpr QuantityOf<(isq::weight)> auto filled_weight() const + [[nodiscard]] constexpr QuantityOf auto filled_weight() const { const auto volume = isq::volume(base_ * height_); // TODO check if we can remove that cast - const QuantityOf<(isq::mass)> auto mass = density_ * volume; + const QuantityOf auto mass = density_ * volume; return isq::weight(mass * g); } @@ -130,9 +130,9 @@ int main() const quantity spare_capacity = tank.spare_capacity(measured_mass); const quantity filled_weight = tank.filled_weight(); - const QuantityOf<(isq::mass_change_rate)> auto input_flow_rate = measured_mass / fill_time; - const QuantityOf<(isq::speed)> auto float_rise_rate = fill_level / fill_time; - const QuantityOf<(isq::time)> auto fill_time_left = (height / fill_level - 1 * one) * fill_time; + const QuantityOf auto input_flow_rate = measured_mass / fill_time; + const QuantityOf auto float_rise_rate = fill_level / fill_time; + const QuantityOf auto fill_time_left = (height / fill_level - 1 * one) * fill_time; const quantity fill_ratio = fill_level / height; diff --git a/example/total_energy.cpp b/example/total_energy.cpp index 28963f6b..75416bb7 100644 --- a/example/total_energy.cpp +++ b/example/total_energy.cpp @@ -45,8 +45,8 @@ namespace { using namespace mp_units; -QuantityOf<(isq::mechanical_energy)> auto total_energy(QuantityOf<(isq::momentum)> auto p, - QuantityOf<(isq::mass)> auto m, QuantityOf<(isq::speed)> auto c) +QuantityOf auto total_energy(QuantityOf auto p, QuantityOf auto m, + QuantityOf auto c) { return isq::mechanical_energy(sqrt(pow<2>(p * c) + pow<2>(m * pow<2>(c)))); } @@ -59,19 +59,19 @@ void si_example() const quantity c2 = pow<2>(c); const quantity p1 = isq::momentum(4. * GeV / c); - const QuantityOf<(isq::mass)> auto m1 = 3. * GeV / c2; - const quantity E1 = total_energy(p1, m1, c); + const QuantityOf auto m1 = 3. * GeV / c2; + const quantity E = total_energy(p1, m1, c); std::cout << "\n*** SI units (c = " << c << " = " << c.in(si::metre / s) << ") ***\n"; std::cout << "\n[in `GeV` and `c`]\n" << "p = " << p1 << "\n" << "m = " << m1 << "\n" - << "E = " << E1 << "\n"; + << "E = " << E << "\n"; const quantity p2 = p1.in(GeV / (m / s)); - const quantity metre2 = m1.in(GeV / pow<2>(m / s)); - const quantity E2 = total_energy(p2, metre2, c).in(GeV); + const quantity m2 = m1.in(GeV / pow<2>(m / s)); + const quantity E2 = total_energy(p2, m2, c).in(GeV); std::cout << "\n[in `GeV`]\n" << "p = " << p2 << "\n" @@ -79,8 +79,8 @@ void si_example() << "E = " << E2 << "\n"; const quantity p3 = p1.in(kg * m / s); - const quantity metre3 = m1.in(kg); - const quantity E3 = total_energy(p3, metre3, c).in(J); + const quantity m3 = m1.in(kg); + const quantity E3 = total_energy(p3, m3, c).in(J); std::cout << "\n[in SI base units]\n" << "p = " << p3 << "\n" diff --git a/example/unmanned_aerial_vehicle.cpp b/example/unmanned_aerial_vehicle.cpp index 9cb32bfc..064e8055 100644 --- a/example/unmanned_aerial_vehicle.cpp +++ b/example/unmanned_aerial_vehicle.cpp @@ -70,7 +70,6 @@ constexpr const char* to_text(earth_gravity_model m) return "EGM2008-1"; } assert(false && "unsupported enum value"); - return "unsupported enum value"; } template diff --git a/test/runtime/CMakeLists.txt b/test/runtime/CMakeLists.txt index 70e13650..d79ed54b 100644 --- a/test/runtime/CMakeLists.txt +++ b/test/runtime/CMakeLists.txt @@ -37,11 +37,11 @@ if(${projectPrefix}BUILD_CXX_MODULES) endif() target_link_libraries(unit_tests_runtime PRIVATE mp-units::mp-units Catch2::Catch2WithMain) -# if(${projectPrefix}DEV_BUILD_LA) -# find_package(wg21_linear_algebra REQUIRED) -# target_sources(unit_tests_runtime PRIVATE linear_algebra_test.cpp) -# target_link_libraries(unit_tests_runtime PRIVATE wg21_linear_algebra::wg21_linear_algebra) -# endif() +if(${projectPrefix}DEV_BUILD_LA) + find_package(wg21_linear_algebra REQUIRED) + target_sources(unit_tests_runtime PRIVATE linear_algebra_test.cpp) + target_link_libraries(unit_tests_runtime PRIVATE wg21_linear_algebra::wg21_linear_algebra) +endif() if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") target_compile_options( diff --git a/test/static/chrono_test.cpp b/test/static/chrono_test.cpp index 2785041f..8c532390 100644 --- a/test/static/chrono_test.cpp +++ b/test/static/chrono_test.cpp @@ -57,43 +57,41 @@ static_assert(!QuantityPoint); // construction - same rep type static_assert( - std::constructible_from, std::chrono::seconds>); -static_assert(std::convertible_to>); -static_assert(std::constructible_from, std::chrono::hours>); -static_assert(std::convertible_to>); -static_assert(std::constructible_from, std::chrono::hours>); -static_assert(std::convertible_to>); + std::constructible_from, std::chrono::seconds>); +static_assert(std::convertible_to>); +static_assert(std::constructible_from, std::chrono::hours>); +static_assert(std::convertible_to>); +static_assert(std::constructible_from, std::chrono::hours>); +static_assert(std::convertible_to>); +static_assert(!std::constructible_from, std::chrono::seconds>); +static_assert(!std::convertible_to>); static_assert( - !std::constructible_from, std::chrono::seconds>); -static_assert(!std::convertible_to>); + std::constructible_from, sys_seconds>); static_assert( - std::constructible_from, sys_seconds>); -static_assert( - !std::constructible_from, sys_seconds>); -static_assert(std::convertible_to>); -static_assert(std::constructible_from, sys_days>); -static_assert(!std::constructible_from, sys_days>); -static_assert(std::convertible_to>); -static_assert(std::constructible_from, sys_days>); -static_assert(!std::constructible_from, sys_days>); -static_assert(std::convertible_to>); -static_assert( - !std::constructible_from, sys_seconds>); -static_assert(!std::convertible_to>); + !std::constructible_from, sys_seconds>); +static_assert(std::convertible_to>); +static_assert(std::constructible_from, sys_days>); +static_assert(!std::constructible_from, sys_days>); +static_assert(std::convertible_to>); +static_assert(std::constructible_from, sys_days>); +static_assert(!std::constructible_from, sys_days>); +static_assert(std::convertible_to>); +static_assert(!std::constructible_from, sys_seconds>); +static_assert(!std::convertible_to>); // construction - different rep type (integral to a floating-point) -static_assert(std::constructible_from, std::chrono::seconds>); -static_assert(std::convertible_to>); -static_assert(std::constructible_from, std::chrono::hours>); -static_assert(std::convertible_to>); -static_assert(std::constructible_from, std::chrono::seconds>); -static_assert(std::convertible_to>); -static_assert(std::constructible_from, sys_seconds>); -static_assert(std::convertible_to>); -static_assert(std::constructible_from, sys_days>); -static_assert(std::convertible_to>); -static_assert(std::constructible_from, sys_seconds>); -static_assert(std::convertible_to>); +static_assert(std::constructible_from, std::chrono::seconds>); +static_assert(std::convertible_to>); +static_assert(std::constructible_from, std::chrono::hours>); +static_assert(std::convertible_to>); +static_assert(std::constructible_from, std::chrono::seconds>); +static_assert(std::convertible_to>); +static_assert(std::constructible_from, sys_seconds>); +static_assert(std::convertible_to>); +static_assert(std::constructible_from, sys_days>); +static_assert(std::convertible_to>); +static_assert(std::constructible_from, sys_seconds>); +static_assert(std::convertible_to>); static_assert(quantity{1s} == 1 * s); static_assert(quantity{1s} == 1 * s); @@ -109,13 +107,13 @@ static_assert(is_of_type>); -static_assert(std::convertible_to, std::chrono::seconds>); -static_assert(std::constructible_from>); -static_assert(std::convertible_to, std::chrono::hours>); + std::constructible_from>); +static_assert(std::convertible_to, std::chrono::seconds>); +static_assert(std::constructible_from>); +static_assert(std::convertible_to, std::chrono::hours>); static_assert( - std::constructible_from>); -static_assert(std::convertible_to, sys_seconds>); + std::constructible_from>); +static_assert(std::convertible_to, sys_seconds>); // units mapping static_assert(quantity{1ns} == 1 * ns); @@ -129,6 +127,15 @@ static_assert(quantity{std::chrono::weeks{1}} == 7 * d); static_assert(quantity{std::chrono::months{1}} == 2629746 * s); static_assert(quantity{std::chrono::years{1}} == 31556952 * s); +// conversion from chrono +static_assert(quantity{1ns} == 1 * ns); +static_assert(quantity{1s} == 1 * s); +static_assert(quantity{1ms} == 1 * ms); + +// conversion to chrono +static_assert(std::chrono::nanoseconds(quantity{1 * ns}) == 1ns); +static_assert(std::chrono::nanoseconds(quantity{1 * s}) == 1s); + // operators static_assert(quantity{1s} + 1 * s == 2 * s); static_assert(quantity{1s} + 1 * min == 61 * s); diff --git a/test/static/concepts_test.cpp b/test/static/concepts_test.cpp index 9564ed22..c67ff710 100644 --- a/test/static/concepts_test.cpp +++ b/test/static/concepts_test.cpp @@ -83,7 +83,7 @@ inline constexpr auto speed = isq::length / isq::time; static_assert(QuantitySpec); static_assert(QuantitySpec); static_assert(QuantitySpec); -static_assert(QuantitySpec)>); +static_assert(QuantitySpec)>); static_assert(QuantitySpec); static_assert(QuantitySpec(isq::length))>); static_assert(QuantitySpec); @@ -95,7 +95,7 @@ static_assert(!QuantitySpec); static_assert(detail::NamedQuantitySpec); static_assert(detail::NamedQuantitySpec); static_assert(detail::NamedQuantitySpec); -static_assert(!detail::NamedQuantitySpec)>>); +static_assert(!detail::NamedQuantitySpec)>>); static_assert(!detail::NamedQuantitySpec); static_assert(!detail::NamedQuantitySpec(isq::length))>); static_assert(detail::NamedQuantitySpec); @@ -106,7 +106,7 @@ static_assert(!detail::NamedQuantitySpec); // DerivedQuantitySpec static_assert(!detail::DerivedQuantitySpec); static_assert(!detail::DerivedQuantitySpec); -static_assert(!detail::DerivedQuantitySpec)>); +static_assert(!detail::DerivedQuantitySpec)>); static_assert(!detail::DerivedQuantitySpec); static_assert(detail::DerivedQuantitySpec); static_assert(detail::DerivedQuantitySpec(isq::length))>); @@ -118,7 +118,7 @@ static_assert(!detail::DerivedQuantitySpec); // QuantityKindSpec static_assert(!detail::QuantityKindSpec); static_assert(!detail::QuantityKindSpec); -static_assert(detail::QuantityKindSpec)>>); +static_assert(detail::QuantityKindSpec)>>); static_assert(!detail::QuantityKindSpec); static_assert(!detail::QuantityKindSpec); static_assert(!detail::QuantityKindSpec(isq::length))>); @@ -133,7 +133,7 @@ static_assert(!detail::QuantityKindSpec); // Unit static_assert(Unit); static_assert(Unit); -static_assert(Unit)>); +static_assert(Unit)>); static_assert(Unit); static_assert(Unit); static_assert(Unit); @@ -144,11 +144,11 @@ static_assert(Unit); static_assert(Unit, struct si::second>>); static_assert(Unit>>); static_assert(Unit); -static_assert(!Unit>>); +static_assert(!Unit>>); static_assert(!Unit>); static_assert(!Unit>); -static_assert(!Unit>>); -static_assert(!Unit, (si::second)>>); +static_assert(!Unit>>); +static_assert(!Unit, si::second>>); static_assert(!Unit); static_assert(!Unit); #if MP_UNITS_HOSTED @@ -159,7 +159,7 @@ static_assert(!Unit); static_assert(PrefixableUnit); static_assert(PrefixableUnit); static_assert(!PrefixableUnit); -static_assert(!PrefixableUnit)>); +static_assert(!PrefixableUnit)>); static_assert(!PrefixableUnit); static_assert(!PrefixableUnit); static_assert(!PrefixableUnit * si::second)>); @@ -169,11 +169,11 @@ static_assert(PrefixableUnit); static_assert(!PrefixableUnit, struct si::second>>); static_assert(!PrefixableUnit>>); static_assert(!PrefixableUnit); -static_assert(!PrefixableUnit>>); +static_assert(!PrefixableUnit>>); static_assert(!PrefixableUnit>); static_assert(!PrefixableUnit>); -static_assert(!PrefixableUnit>>); -static_assert(!PrefixableUnit, (si::second)>>); +static_assert(!PrefixableUnit>>); +static_assert(!PrefixableUnit, si::second>>); static_assert(!PrefixableUnit); static_assert(!PrefixableUnit); #if MP_UNITS_HOSTED @@ -184,7 +184,7 @@ static_assert(!PrefixableUnit); static_assert(AssociatedUnit); static_assert(!AssociatedUnit); static_assert(AssociatedUnit); -static_assert(AssociatedUnit)>); +static_assert(AssociatedUnit)>); static_assert(AssociatedUnit); static_assert(AssociatedUnit); static_assert(AssociatedUnit * si::second)>); @@ -194,11 +194,11 @@ static_assert(AssociatedUnit); static_assert(AssociatedUnit, struct si::second>>); static_assert(AssociatedUnit>>); static_assert(AssociatedUnit); -static_assert(!AssociatedUnit>>); +static_assert(!AssociatedUnit>>); static_assert(!AssociatedUnit>); static_assert(!AssociatedUnit>); -static_assert(!AssociatedUnit>>); -static_assert(!AssociatedUnit, (si::second)>>); +static_assert(!AssociatedUnit>>); +static_assert(!AssociatedUnit, si::second>>); static_assert(!AssociatedUnit); static_assert(!AssociatedUnit); #if MP_UNITS_HOSTED @@ -206,19 +206,19 @@ static_assert(!AssociatedUnit); #endif // UnitOf -static_assert(UnitOf); -static_assert(UnitOf); -static_assert(UnitOf); -static_assert(UnitOf); +static_assert(UnitOf); +static_assert(UnitOf); +static_assert(UnitOf); +static_assert(UnitOf); static_assert(UnitOf); static_assert(UnitOf); static_assert(UnitOf); -static_assert(UnitOf); -static_assert(UnitOf); -static_assert(UnitOf); +static_assert(UnitOf); +static_assert(UnitOf); +static_assert(UnitOf); static_assert(!UnitOf); -static_assert(!UnitOf); -static_assert(!UnitOf); +static_assert(!UnitOf); +static_assert(!UnitOf); // Reference static_assert(Reference); @@ -228,32 +228,32 @@ static_assert(Reference); static_assert(Reference); static_assert(!Reference); static_assert(!Reference); -static_assert(!Reference)>); +static_assert(!Reference)>); static_assert(!Reference); static_assert(!Reference); // ReferenceOf -static_assert(ReferenceOf); -static_assert(ReferenceOf); -static_assert(!ReferenceOf); -static_assert(ReferenceOf); -static_assert(!ReferenceOf); -static_assert(ReferenceOf); -static_assert(ReferenceOf); -static_assert(!ReferenceOf); +static_assert(ReferenceOf); +static_assert(ReferenceOf); +static_assert(!ReferenceOf); +static_assert(ReferenceOf); +static_assert(!ReferenceOf); +static_assert(ReferenceOf); +static_assert(ReferenceOf); +static_assert(!ReferenceOf); static_assert(ReferenceOf); static_assert(ReferenceOf); -static_assert(ReferenceOf); +static_assert(ReferenceOf); static_assert(ReferenceOf); -static_assert(ReferenceOf); +static_assert(ReferenceOf); static_assert(!ReferenceOf); -static_assert(ReferenceOf); +static_assert(ReferenceOf); static_assert(!ReferenceOf); -static_assert(ReferenceOf); -static_assert(ReferenceOf); -static_assert(!ReferenceOf); -static_assert(!ReferenceOf); +static_assert(ReferenceOf); +static_assert(ReferenceOf); +static_assert(!ReferenceOf); +static_assert(!ReferenceOf); // Representation static_assert(Representation); @@ -278,57 +278,57 @@ static_assert(!RepresentationOf); #endif // Quantity -static_assert(Quantity>); -static_assert(Quantity>); -static_assert(Quantity>); -static_assert(Quantity>); +static_assert(Quantity>); +static_assert(Quantity>); +static_assert(Quantity>); +static_assert(Quantity>); #if MP_UNITS_HOSTED static_assert(!Quantity); #endif -static_assert(!Quantity>); +static_assert(!Quantity>); static_assert(!Quantity); // QuantityOf -static_assert(QuantityOf, (isq::length)>); -static_assert(QuantityOf, (isq::radius)>); -static_assert(!QuantityOf, (isq::length)>); -static_assert(QuantityOf, (isq::length)>); -static_assert(!QuantityOf, (isq::radius)>); -static_assert(QuantityOf, (isq::length)>); -static_assert(QuantityOf, (isq::radius)>); -static_assert(!QuantityOf, (isq::dim_length)>); +static_assert(QuantityOf, isq::length>); +static_assert(QuantityOf, isq::radius>); +static_assert(!QuantityOf, isq::length>); +static_assert(QuantityOf, isq::length>); +static_assert(!QuantityOf, isq::radius>); +static_assert(QuantityOf, isq::length>); +static_assert(QuantityOf, isq::radius>); +static_assert(!QuantityOf, isq::dim_length>); static_assert(QuantityOf, dimensionless>); static_assert(QuantityOf, dimensionless>); -static_assert(QuantityOf, (isq::rotation)>); -static_assert(QuantityOf, dimensionless>); -static_assert(QuantityOf, (isq::angular_measure)>); -static_assert(!QuantityOf, dimensionless>); -static_assert(QuantityOf, (isq::angular_measure)>); -static_assert(!QuantityOf, dimensionless>); -static_assert(QuantityOf, (isq::rotation)>); -static_assert(QuantityOf, (isq::angular_measure)>); -static_assert(!QuantityOf, (isq::rotation)>); -static_assert(!QuantityOf, (isq::angular_measure)>); +static_assert(QuantityOf, isq::rotation>); +static_assert(QuantityOf, dimensionless>); +static_assert(QuantityOf, isq::angular_measure>); +static_assert(!QuantityOf, dimensionless>); +static_assert(QuantityOf, isq::angular_measure>); +static_assert(!QuantityOf, dimensionless>); +static_assert(QuantityOf, isq::rotation>); +static_assert(QuantityOf, isq::angular_measure>); +static_assert(!QuantityOf, isq::rotation>); +static_assert(!QuantityOf, isq::angular_measure>); // QuantityLike #if MP_UNITS_HOSTED static_assert(QuantityLike); static_assert(QuantityLike); #endif -static_assert(!QuantityLike>); -static_assert(!QuantityLike>); +static_assert(!QuantityLike>); +static_assert(!QuantityLike>); static_assert(!QuantityLike); // QuantityPoint -static_assert(QuantityPoint>); -static_assert(QuantityPoint>); -static_assert(QuantityPoint>); -static_assert(QuantityPoint>); -static_assert(QuantityPoint>); -static_assert(QuantityPoint>); +static_assert(QuantityPoint>); +static_assert(QuantityPoint>); +static_assert(QuantityPoint>); +static_assert(QuantityPoint>); +static_assert(QuantityPoint>); +static_assert(QuantityPoint>); static_assert(!QuantityPoint); -static_assert(!QuantityPoint>); +static_assert(!QuantityPoint>); static_assert(!QuantityPoint); static_assert(!QuantityPoint); #if MP_UNITS_HOSTED @@ -338,35 +338,35 @@ static_assert(!QuantityPoint> static_assert(!QuantityPoint); // QuantityPointOf -static_assert(QuantityPointOf, (isq::length)>); -static_assert(QuantityPointOf, (isq::radius)>); -static_assert(QuantityPointOf, (isq::length)>); -static_assert(!QuantityPointOf, (isq::radius)>); -static_assert(QuantityPointOf, (isq::length)>); -static_assert(QuantityPointOf, (isq::radius)>); -static_assert(QuantityPointOf, (isq::length)>); -static_assert(QuantityPointOf, (isq::radius)>); -static_assert(QuantityPointOf, my_origin>); -static_assert(QuantityPointOf, my_relative_origin>); -static_assert(QuantityPointOf, my_relative_origin>); -static_assert(QuantityPointOf, my_origin>); -static_assert(QuantityPointOf, my_origin>); -static_assert(QuantityPointOf, my_relative_origin>); -static_assert(QuantityPointOf, my_relative_origin>); -static_assert(QuantityPointOf, my_origin>); -static_assert(QuantityPointOf, my_origin>); -static_assert(QuantityPointOf, my_relative_origin>); -static_assert(QuantityPointOf, my_relative_origin>); -static_assert(QuantityPointOf, my_origin>); +static_assert(QuantityPointOf, isq::length>); +static_assert(QuantityPointOf, isq::radius>); +static_assert(QuantityPointOf, isq::length>); +static_assert(!QuantityPointOf, isq::radius>); +static_assert(QuantityPointOf, isq::length>); +static_assert(QuantityPointOf, isq::radius>); +static_assert(QuantityPointOf, isq::length>); +static_assert(QuantityPointOf, isq::radius>); +static_assert(QuantityPointOf, my_origin>); +static_assert(QuantityPointOf, my_relative_origin>); +static_assert(QuantityPointOf, my_relative_origin>); +static_assert(QuantityPointOf, my_origin>); +static_assert(QuantityPointOf, my_origin>); +static_assert(QuantityPointOf, my_relative_origin>); +static_assert(QuantityPointOf, my_relative_origin>); +static_assert(QuantityPointOf, my_origin>); +static_assert(QuantityPointOf, my_origin>); +static_assert(QuantityPointOf, my_relative_origin>); +static_assert(QuantityPointOf, my_relative_origin>); +static_assert(QuantityPointOf, my_origin>); // PointOrigin static_assert(PointOrigin); static_assert(PointOrigin); -static_assert(!PointOrigin>); +static_assert(!PointOrigin>); static_assert(!PointOrigin>); -static_assert(!PointOrigin>); -static_assert(!PointOrigin>); -static_assert(!PointOrigin>); +static_assert(!PointOrigin>); +static_assert(!PointOrigin>); +static_assert(!PointOrigin>); static_assert(!PointOrigin); #if MP_UNITS_HOSTED static_assert(!PointOrigin); @@ -375,38 +375,38 @@ static_assert(!PointOrigin>); static_assert(!PointOrigin); // PointOriginFor -static_assert(PointOriginFor); -static_assert(PointOriginFor); -static_assert(!PointOriginFor); -static_assert(PointOriginFor); -static_assert(PointOriginFor); -static_assert(!PointOriginFor); -static_assert(!PointOriginFor, (isq::length)>); -static_assert(!PointOriginFor, (isq::radius)>); -static_assert(!PointOriginFor, (isq::time)>); -static_assert(!PointOriginFor, (isq::length)>); -static_assert(!PointOriginFor, (isq::radius)>); -static_assert(!PointOriginFor, (isq::time)>); -static_assert(!PointOriginFor, (isq::length)>); -static_assert(!PointOriginFor, (isq::radius)>); -static_assert(!PointOriginFor, (isq::time)>); -static_assert(!PointOriginFor, (isq::length)>); -static_assert(!PointOriginFor, (isq::radius)>); -static_assert(!PointOriginFor, (isq::time)>); -static_assert(!PointOriginFor); +static_assert(PointOriginFor); +static_assert(PointOriginFor); +static_assert(!PointOriginFor); +static_assert(PointOriginFor); +static_assert(PointOriginFor); +static_assert(!PointOriginFor); +static_assert(!PointOriginFor, isq::length>); +static_assert(!PointOriginFor, isq::radius>); +static_assert(!PointOriginFor, isq::time>); +static_assert(!PointOriginFor, isq::length>); +static_assert(!PointOriginFor, isq::radius>); +static_assert(!PointOriginFor, isq::time>); +static_assert(!PointOriginFor, isq::length>); +static_assert(!PointOriginFor, isq::radius>); +static_assert(!PointOriginFor, isq::time>); +static_assert(!PointOriginFor, isq::length>); +static_assert(!PointOriginFor, isq::radius>); +static_assert(!PointOriginFor, isq::time>); +static_assert(!PointOriginFor); #if MP_UNITS_HOSTED -static_assert(!PointOriginFor); -static_assert(!PointOriginFor, (isq::length)>); +static_assert(!PointOriginFor); +static_assert(!PointOriginFor, isq::length>); #endif -static_assert(!PointOriginFor); +static_assert(!PointOriginFor); // QuantityPointLike #if MP_UNITS_HOSTED static_assert(QuantityPointLike>); static_assert(!QuantityPointLike); #endif -static_assert(!QuantityPointLike>); -static_assert(!QuantityPointLike>); +static_assert(!QuantityPointLike>); +static_assert(!QuantityPointLike>); static_assert(!QuantityPointLike); } // namespace diff --git a/test/static/custom_rep_test_min_impl.cpp b/test/static/custom_rep_test_min_impl.cpp index 8b328557..4fb2537b 100644 --- a/test/static/custom_rep_test_min_impl.cpp +++ b/test/static/custom_rep_test_min_impl.cpp @@ -78,18 +78,18 @@ static_assert(Representation>); static_assert(Representation>); // construction from a value is not allowed -static_assert(!std::constructible_from>, min_impl>); -static_assert(!std::convertible_to, quantity<(si::metre), min_impl>>); +static_assert(!std::constructible_from>, min_impl>); +static_assert(!std::convertible_to, quantity>>); -static_assert(!std::constructible_from>, min_impl>); -static_assert(!std::convertible_to, quantity<(si::metre), min_impl>>); +static_assert(!std::constructible_from>, min_impl>); +static_assert(!std::convertible_to, quantity>>); // multiply syntax should work template concept creates_quantity = Unit && requires { T{} * U; }; -static_assert(creates_quantity, (si::metre)>); -static_assert(creates_quantity, (si::metre)>); +static_assert(creates_quantity, si::metre>); +static_assert(creates_quantity, si::metre>); // multiply syntax static_assert(creates_quantity, one>); @@ -99,47 +99,46 @@ static_assert(creates_quantity, percent>); // construction from a quantity // min_impl -> min_impl -static_assert(std::constructible_from>, quantity<(si::metre), min_impl>>); -static_assert(std::convertible_to>, quantity<(si::metre), min_impl>>); +static_assert(std::constructible_from>, quantity>>); +static_assert(std::convertible_to>, quantity>>); -static_assert( - std::constructible_from>, quantity<(si::metre), min_impl>>); -static_assert(std::convertible_to>, quantity<(si::metre), min_impl>>); +static_assert(std::constructible_from>, quantity>>); +static_assert(std::convertible_to>, quantity>>); -static_assert(std::constructible_from>, quantity<(si::metre), min_impl>>); -static_assert(std::convertible_to>, quantity<(si::metre), min_impl>>); +static_assert(std::constructible_from>, quantity>>); +static_assert(std::convertible_to>, quantity>>); -static_assert(!std::constructible_from>, - quantity<(si::metre), min_impl>>); // narrowing conversion -static_assert(!std::convertible_to>, quantity<(si::metre), min_impl>>); +static_assert(!std::constructible_from>, + quantity>>); // narrowing conversion +static_assert(!std::convertible_to>, quantity>>); // T -> min_impl -static_assert(std::constructible_from>, quantity<(si::metre), int>>); -static_assert(std::convertible_to, quantity<(si::metre), min_impl>>); +static_assert(std::constructible_from>, quantity>); +static_assert(std::convertible_to, quantity>>); -static_assert(std::constructible_from>, quantity<(si::metre), double>>); -static_assert(std::convertible_to, quantity<(si::metre), min_impl>>); +static_assert(std::constructible_from>, quantity>); +static_assert(std::convertible_to, quantity>>); -static_assert(std::constructible_from>, quantity<(si::metre), int>>); -static_assert(std::convertible_to, quantity<(si::metre), min_impl>>); +static_assert(std::constructible_from>, quantity>); +static_assert(std::convertible_to, quantity>>); -static_assert(!std::constructible_from>, - quantity<(si::metre), double>>); // narrowing conversion -static_assert(!std::convertible_to, quantity<(si::metre), min_impl>>); +static_assert( + !std::constructible_from>, quantity>); // narrowing conversion +static_assert(!std::convertible_to, quantity>>); // min_impl -> T -static_assert(std::constructible_from, quantity<(si::metre), min_impl>>); -static_assert(std::convertible_to>, quantity<(si::metre), int>>); +static_assert(std::constructible_from, quantity>>); +static_assert(std::convertible_to>, quantity>); -static_assert(std::constructible_from, quantity<(si::metre), min_impl>>); -static_assert(std::convertible_to>, quantity<(si::metre), double>>); +static_assert(std::constructible_from, quantity>>); +static_assert(std::convertible_to>, quantity>); -static_assert(std::constructible_from, quantity<(si::metre), min_impl>>); -static_assert(std::convertible_to>, quantity<(si::metre), double>>); +static_assert(std::constructible_from, quantity>>); +static_assert(std::convertible_to>, quantity>); -static_assert(!std::constructible_from, - quantity<(si::metre), min_impl>>); // narrowing conversion -static_assert(!std::convertible_to>, quantity<(si::metre), int>>); +static_assert( + !std::constructible_from, quantity>>); // narrowing conversion +static_assert(!std::convertible_to>, quantity>); // arithmetic operators diff --git a/test/static/dimension_test.cpp b/test/static/dimension_test.cpp index f1d64590..8064831e 100644 --- a/test/static/dimension_test.cpp +++ b/test/static/dimension_test.cpp @@ -33,7 +33,7 @@ namespace { using namespace mp_units; -using dimension_one_ = struct mp_units::dimension_one; +using dimension_one_ = struct dimension_one; // clang-format off inline constexpr struct length_ final : base_dimension<"L"> {} length; diff --git a/test/static/quantity_point_test.cpp b/test/static/quantity_point_test.cpp index 50dfb67e..f04e9c1a 100644 --- a/test/static/quantity_point_test.cpp +++ b/test/static/quantity_point_test.cpp @@ -58,24 +58,24 @@ inline constexpr struct mean_sea_level final : absolute_point_origin { +inline constexpr struct same_mean_sea_level final : relative_point_origin { } same_mean_sea_level; -inline constexpr struct ground_level final : relative_point_origin { +inline constexpr struct ground_level final : relative_point_origin { } ground_level; inline constexpr auto my_ground_level = ground_level; -inline constexpr struct same_ground_level1 final : relative_point_origin { +inline constexpr struct same_ground_level1 final : relative_point_origin { } same_ground_level1; -inline constexpr struct same_ground_level2 final : relative_point_origin { +inline constexpr struct same_ground_level2 final : relative_point_origin { } same_ground_level2; -inline constexpr struct tower_peak final : relative_point_origin { +inline constexpr struct tower_peak final : relative_point_origin { } tower_peak; -inline constexpr struct other_ground_level final : relative_point_origin { +inline constexpr struct other_ground_level final : relative_point_origin { } other_ground_level; inline constexpr struct other_absolute_level final : absolute_point_origin { @@ -152,10 +152,10 @@ static_assert(zeroth_point_origin != zeroth_point_origin) == sizeof(double)); -static_assert(sizeof(quantity_point<(isq::height[m]), mean_sea_level>) == sizeof(double)); -static_assert(sizeof(quantity_point<(si::metre), ground_level, short>) == sizeof(short)); -static_assert(sizeof(quantity_point<(isq::height[m]), ground_level, short>) == sizeof(short)); +static_assert(sizeof(quantity_point) == sizeof(double)); +static_assert(sizeof(quantity_point) == sizeof(double)); +static_assert(sizeof(quantity_point) == sizeof(short)); +static_assert(sizeof(quantity_point) == sizeof(short)); template typename QP> concept invalid_types = requires { @@ -188,15 +188,15 @@ static_assert(invalid_types); template typename QP> concept valid_types = requires { - typename QP<(si::metre), mean_sea_level, int>; - typename QP<(isq::height[m]), mean_sea_level, int>; - typename QP<(special_height[m]), mean_sea_level, int>; - typename QP<(si::metre), ground_level, int>; - typename QP<(isq::height[m]), ground_level, int>; - typename QP<(special_height[m]), ground_level, int>; - typename QP<(isq::height[m]), zeroth_point_origin<(isq::length)>, int>; - typename QP<(isq::height[m]), zeroth_point_origin>, int>; - typename QP<(si::metre), zeroth_point_origin<(isq::height)>, int>; + typename QP; + typename QP; + typename QP; + typename QP; + typename QP; + typename QP; + typename QP, int>; + typename QP>, int>; + typename QP, int>; }; static_assert(valid_types); @@ -217,14 +217,14 @@ static_assert(std::is_nothrow_destructible_v>); static_assert(std::is_standard_layout_v>); -static_assert(std::default_initializable>); -static_assert(std::move_constructible>); -static_assert(std::copy_constructible>); -static_assert(std::equality_comparable>); -static_assert(std::totally_ordered>); -static_assert(std::regular>); +static_assert(std::default_initializable>); +static_assert(std::move_constructible>); +static_assert(std::copy_constructible>); +static_assert(std::equality_comparable>); +static_assert(std::totally_ordered>); +static_assert(std::regular>); -static_assert(std::three_way_comparable>); +static_assert(std::three_way_comparable>); ////////////////// @@ -235,53 +235,51 @@ static_assert(quantity_point::reference == si::metre); static_assert(quantity_point::quantity_spec == kind_of); static_assert(quantity_point::dimension == isq::dim_length); static_assert(quantity_point::unit == si::metre); -static_assert(is_of_type::point_origin, zeroth_point_origin_>>); -static_assert( - is_of_type::absolute_point_origin, zeroth_point_origin_>>); +static_assert(is_of_type::point_origin, zeroth_point_origin_>>); +static_assert(is_of_type::absolute_point_origin, zeroth_point_origin_>>); static_assert(quantity_point::reference == isq::height[m]); static_assert(quantity_point::quantity_spec == isq::height); static_assert(quantity_point::dimension == isq::dim_length); static_assert(quantity_point::unit == si::metre); -static_assert(is_of_type::point_origin, zeroth_point_origin_>); -static_assert(is_of_type::absolute_point_origin, zeroth_point_origin_>); +static_assert(is_of_type::point_origin, zeroth_point_origin_>); +static_assert(is_of_type::absolute_point_origin, zeroth_point_origin_>); static_assert(quantity_point::reference == si::metre); static_assert(quantity_point::quantity_spec == kind_of); static_assert(quantity_point::dimension == isq::dim_length); static_assert(quantity_point::unit == si::metre); -static_assert(is_of_type::point_origin, struct mean_sea_level>); -static_assert(is_of_type::absolute_point_origin, struct mean_sea_level>); +static_assert(is_of_type::point_origin, struct mean_sea_level>); +static_assert(is_of_type::absolute_point_origin, struct mean_sea_level>); static_assert(quantity_point::reference == isq::height[m]); static_assert(quantity_point::quantity_spec == isq::height); static_assert(quantity_point::dimension == isq::dim_length); static_assert(quantity_point::unit == si::metre); -static_assert(is_of_type::point_origin, struct mean_sea_level>); -static_assert( - is_of_type::absolute_point_origin, struct mean_sea_level>); +static_assert(is_of_type::point_origin, struct mean_sea_level>); +static_assert(is_of_type::absolute_point_origin, struct mean_sea_level>); static_assert(quantity_point::reference == isq::height[m]); static_assert(quantity_point::quantity_spec == isq::height); static_assert(quantity_point::dimension == isq::dim_length); static_assert(quantity_point::unit == si::metre); -static_assert(is_of_type::point_origin, struct ground_level>); -static_assert(is_of_type::absolute_point_origin, struct mean_sea_level>); +static_assert(is_of_type::point_origin, struct ground_level>); +static_assert(is_of_type::absolute_point_origin, struct mean_sea_level>); static_assert(quantity_point::reference == isq::height[m]); static_assert(quantity_point::quantity_spec == isq::height); static_assert(quantity_point::dimension == isq::dim_length); static_assert(quantity_point::unit == si::metre); -static_assert(is_of_type::point_origin, struct tower_peak>); -static_assert(is_of_type::absolute_point_origin, struct mean_sea_level>); +static_assert(is_of_type::point_origin, struct tower_peak>); +static_assert(is_of_type::absolute_point_origin, struct mean_sea_level>); static_assert(quantity_point::reference == si::kelvin); static_assert(quantity_point::quantity_spec == kind_of); static_assert(quantity_point::dimension == isq::dim_thermodynamic_temperature); static_assert(quantity_point::unit == si::kelvin); -static_assert(is_of_type::point_origin, struct si::absolute_zero>); +static_assert(is_of_type::point_origin, struct si::absolute_zero>); static_assert( - is_of_type::absolute_point_origin, struct si::absolute_zero>); + is_of_type::absolute_point_origin, struct si::absolute_zero>); static_assert(quantity_point::reference == isq::thermodynamic_temperature[si::kelvin]); @@ -290,11 +288,10 @@ static_assert(quantity_point::dimension == isq::dim_thermodynamic_temperature); static_assert(quantity_point::unit == si::kelvin); +static_assert(is_of_type::point_origin, + struct si::absolute_zero>); static_assert( - is_of_type::point_origin, - struct si::absolute_zero>); -static_assert( - is_of_type::absolute_point_origin, + is_of_type::absolute_point_origin, struct si::absolute_zero>); static_assert(quantity_point::reference == @@ -304,20 +301,19 @@ static_assert(quantity_point::dimension == isq::dim_thermodynamic_temperature); static_assert(quantity_point::unit == si::kelvin); -static_assert(is_of_type::point_origin, +static_assert(is_of_type::point_origin, + struct si::absolute_zero>); +static_assert(is_of_type::absolute_point_origin, struct si::absolute_zero>); -static_assert( - is_of_type::absolute_point_origin, - struct si::absolute_zero>); static_assert(quantity_point::reference == si::degree_Celsius); static_assert(quantity_point::quantity_spec == kind_of); static_assert(quantity_point::dimension == isq::dim_thermodynamic_temperature); static_assert(quantity_point::unit == si::degree_Celsius); -static_assert(is_of_type::point_origin, struct si::ice_point>); +static_assert(is_of_type::point_origin, struct si::ice_point>); static_assert( - is_of_type::absolute_point_origin, struct si::absolute_zero>); + is_of_type::absolute_point_origin, struct si::absolute_zero>); static_assert(quantity_point::reference == isq::Celsius_temperature[si::degree_Celsius]); @@ -326,10 +322,10 @@ static_assert(quantity_point::dimension == isq::dim_thermodynamic_temperature); static_assert(quantity_point::unit == si::degree_Celsius); -static_assert(is_of_type::point_origin, +static_assert(is_of_type::point_origin, struct si::ice_point>); static_assert( - is_of_type::absolute_point_origin, + is_of_type::absolute_point_origin, struct si::absolute_zero>); @@ -337,18 +333,18 @@ static_assert( // member types ////////////////// -static_assert(is_same_v::rep, double>); -static_assert(is_same_v::quantity_type, quantity>); +static_assert(is_same_v::rep, double>); +static_assert(is_same_v::quantity_type, quantity>); -static_assert(is_same_v::rep, int>); -static_assert(is_same_v::quantity_type, quantity>); +static_assert(is_same_v::rep, int>); +static_assert(is_same_v::quantity_type, quantity>); -static_assert(is_same_v::rep, double>); -static_assert(is_same_v::quantity_type, quantity>); +static_assert(is_same_v::rep, double>); +static_assert(is_same_v::quantity_type, quantity>); -static_assert(is_same_v::rep, int>); +static_assert(is_same_v::rep, int>); static_assert( - is_same_v::quantity_type, quantity>); + is_same_v::quantity_type, quantity>); //////////////////////////// @@ -375,11 +371,11 @@ static_assert( ////////////////////////////// // there is no construction from a value -static_assert(!std::constructible_from, double>); -static_assert(!std::convertible_to>); +static_assert(!std::constructible_from, double>); +static_assert(!std::convertible_to>); -static_assert(!std::constructible_from, int>); -static_assert(!std::convertible_to>); +static_assert(!std::constructible_from, int>); +static_assert(!std::convertible_to>); static_assert(!std::constructible_from, double>); static_assert(!std::convertible_to>); @@ -400,135 +396,135 @@ static_assert(!std::convertible_to, quantity<(si::metre)>>); -static_assert(!std::convertible_to, quantity_point<(si::metre)>>); +static_assert(std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); -static_assert(std::constructible_from, quantity<(isq::height[m])>>); -static_assert(!std::convertible_to, quantity_point<(isq::height[m])>>); +static_assert(std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); -static_assert(std::constructible_from, quantity<(si::metre)>>); -static_assert(!std::convertible_to, quantity_point<(isq::height[m])>>); +static_assert(std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); -static_assert(std::constructible_from, quantity<(isq::height[m])>>); -static_assert(!std::convertible_to, quantity_point<(si::metre)>>); +static_assert(std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); -static_assert(std::constructible_from, quantity<(isq::speed[m / s])>>); -static_assert(!std::convertible_to, quantity_point>); +static_assert(std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); -static_assert(std::constructible_from, quantity>); -static_assert(!std::convertible_to, quantity_point<(isq::speed[m / s])>>); +static_assert(std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); -static_assert(std::constructible_from, quantity<(isq::speed[m / s])>>); -static_assert(!std::convertible_to, quantity_point<(isq::length[m] / isq::time[s])>>); +static_assert(std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); -static_assert(std::constructible_from, quantity<(isq::length[m] / isq::time[s])>>); -static_assert(!std::convertible_to, quantity_point<(isq::speed[m / s])>>); +static_assert(std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); -static_assert(std::constructible_from, quantity>); -static_assert(!std::convertible_to, quantity_point<(isq::speed[m / s])>>); +static_assert(std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); static_assert(std::constructible_from, quantity>); static_assert(!std::convertible_to, quantity_point>); // different dimensions -static_assert(!std::constructible_from, quantity<(si::second)>>); -static_assert(!std::convertible_to, quantity_point<(isq::height[m])>>); +static_assert(!std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); // convertible but different quantity_specs -static_assert(std::constructible_from, quantity<(isq::height[m])>>); -static_assert(!std::convertible_to, quantity_point<(isq::length[m])>>); +static_assert(std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); -static_assert(std::constructible_from, quantity<(special_height[m])>>); -static_assert(!std::convertible_to, quantity_point<(isq::height[m])>>); +static_assert(std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); // quantity_specs with common_quantity_spec -static_assert(!std::constructible_from, quantity<(isq::height[m])>>); -static_assert(!std::convertible_to, quantity_point<(isq::width[m])>>); +static_assert(!std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); -static_assert(!std::constructible_from, quantity<(isq::width[m])>>); -static_assert(!std::convertible_to, quantity_point<(isq::height[m])>>); +static_assert(!std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); // non-convertible quantity_specs -static_assert(!std::constructible_from, quantity<(isq::length[m])>>); -static_assert(!std::convertible_to, quantity_point<(isq::height[m])>>); +static_assert(!std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); -static_assert(!std::constructible_from, quantity<(isq::height[m])>>); -static_assert(!std::convertible_to, quantity_point<(isq::height[m])>>); +static_assert(!std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); #if MP_UNITS_HOSTED // quantity-like -static_assert(!std::constructible_from, std::chrono::seconds>); -static_assert(!std::convertible_to>); +static_assert(!std::constructible_from, std::chrono::seconds>); +static_assert(!std::convertible_to>); -static_assert(!std::constructible_from, std::chrono::seconds>); -static_assert(!std::convertible_to>); +static_assert(!std::constructible_from, std::chrono::seconds>); +static_assert(!std::convertible_to>); -static_assert(!std::constructible_from, std::chrono::seconds>); -static_assert(!std::convertible_to>); +static_assert(!std::constructible_from, std::chrono::seconds>); +static_assert(!std::convertible_to>); #endif // ---------------------- // explicit point origins // ---------------------- -static_assert(!std::constructible_from, quantity<(si::metre)>>); -static_assert(!std::convertible_to, quantity_point<(si::metre), mean_sea_level>>); +static_assert(!std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); -static_assert(!std::constructible_from, quantity<(isq::height[m])>>); -static_assert(!std::convertible_to, quantity_point<(isq::height[m]), mean_sea_level>>); +static_assert(!std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); -static_assert(!std::constructible_from, quantity<(si::metre)>>); -static_assert(!std::convertible_to, quantity_point<(isq::height[m]), mean_sea_level>>); +static_assert(!std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); -static_assert(!std::constructible_from, quantity<(isq::height[m])>>); -static_assert(!std::convertible_to, quantity_point<(si::metre), mean_sea_level>>); +static_assert(!std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); -static_assert(!std::constructible_from, quantity>); -static_assert(!std::convertible_to, quantity_point<(isq::height[m]), mean_sea_level>>); +static_assert(!std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); static_assert(!std::constructible_from, quantity>); static_assert(!std::convertible_to, quantity_point>); // quantity_specs with common_quantity_spec -static_assert(!std::constructible_from, quantity<(isq::height[m])>>); -static_assert(!std::convertible_to, quantity_point<(isq::width[m]), zeroth_length>>); +static_assert(!std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); -static_assert(!std::constructible_from, quantity<(isq::width[m])>>); -static_assert(!std::convertible_to, quantity_point<(isq::height[m]), zeroth_length>>); +static_assert(!std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); // different dimensions -static_assert(!std::constructible_from, quantity<(si::second)>>); -static_assert(!std::convertible_to, quantity_point<(isq::height[m]), mean_sea_level>>); +static_assert(!std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); // non-convertible quantity_specs -static_assert(!std::constructible_from, quantity<(isq::length[m])>>); -static_assert(!std::convertible_to, quantity_point<(isq::height[m]), mean_sea_level>>); +static_assert(!std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); -static_assert(!std::constructible_from, quantity<(isq::height[m])>>); -static_assert(!std::convertible_to, quantity_point<(isq::height[m]), mean_sea_level>>); +static_assert(!std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); // not-compatible origin -static_assert(!std::constructible_from, quantity<(isq::length[m])>>); -static_assert(!std::convertible_to, quantity_point<((si::metre)), mean_sea_level>>); +static_assert(!std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity_point>); #if MP_UNITS_HOSTED // quantity-like -static_assert(!std::constructible_from>, +static_assert(!std::constructible_from>, std::chrono::seconds>); static_assert(!std::convertible_to>>); + quantity_point>>); -static_assert(!std::constructible_from>, +static_assert(!std::constructible_from>, std::chrono::seconds>); static_assert(!std::convertible_to>>); + quantity_point>>); static_assert( - !std::constructible_from>, + !std::constructible_from>, std::chrono::seconds>); static_assert( !std::convertible_to>>); + quantity_point>>); #endif @@ -537,146 +533,140 @@ static_assert( /////////////////////////////////////// // implicit origin -static_assert(std::constructible_from, quantity_point<(si::metre)>>); -static_assert(std::convertible_to, quantity_point<(si::metre)>>); -static_assert(std::constructible_from, quantity_point<(isq::height[m])>>); -static_assert(std::convertible_to, quantity_point<(isq::height[m])>>); +static_assert(std::constructible_from, quantity_point>); +static_assert(std::convertible_to, quantity_point>); +static_assert(std::constructible_from, quantity_point>); +static_assert(std::convertible_to, quantity_point>); -static_assert(std::constructible_from, quantity_point<(isq::height[m])>>); -static_assert(std::convertible_to, quantity_point<(si::metre)>>); -static_assert(std::constructible_from, quantity_point<(si::metre)>>); -static_assert(std::convertible_to, quantity_point<(isq::height[m])>>); +static_assert(std::constructible_from, quantity_point>); +static_assert(std::convertible_to, quantity_point>); +static_assert(std::constructible_from, quantity_point>); +static_assert(std::convertible_to, quantity_point>); static_assert( - std::constructible_from, quantity_point<(isq::speed[m / s])>>); -static_assert( - std::convertible_to, quantity_point<(isq::length[m]) / isq::time[s]>>); + std::constructible_from, quantity_point>); +static_assert(std::convertible_to, quantity_point>); -static_assert(std::constructible_from, quantity_point<(isq::speed[m / s])>>); -static_assert(std::convertible_to, quantity_point>); +static_assert(std::constructible_from, quantity_point>); +static_assert(std::convertible_to, quantity_point>); -static_assert(std::constructible_from, quantity_point<(isq::length[m]) / isq::time[s]>>); -static_assert(std::convertible_to, quantity_point>); +static_assert(std::constructible_from, quantity_point>); +static_assert(std::convertible_to, quantity_point>); // convertible but different quantity_specs -static_assert(!std::constructible_from, quantity_point<(isq::height[m])>>); -static_assert(!std::convertible_to, quantity_point<(isq::length[m])>>); +static_assert(!std::constructible_from, quantity_point>); +static_assert(!std::convertible_to, quantity_point>); -static_assert(!std::constructible_from, quantity_point>); -static_assert(!std::convertible_to, quantity_point<(isq::height[m])>>); +static_assert(!std::constructible_from, quantity_point>); +static_assert(!std::convertible_to, quantity_point>); // quantity_specs with common_quantity_spec -static_assert(!std::constructible_from, quantity_point<(isq::height[m])>>); -static_assert(!std::convertible_to, quantity_point<(isq::width[m])>>); +static_assert(!std::constructible_from, quantity_point>); +static_assert(!std::convertible_to, quantity_point>); -static_assert(!std::constructible_from, quantity_point<(isq::width[m])>>); -static_assert(!std::convertible_to, quantity_point<(isq::height[m])>>); +static_assert(!std::constructible_from, quantity_point>); +static_assert(!std::convertible_to, quantity_point>); // non-convertible quantity_specs -static_assert(!std::constructible_from, quantity_point<(isq::length[m])>>); -static_assert(!std::convertible_to, quantity_point<(isq::height[m])>>); +static_assert(!std::constructible_from, quantity_point>); +static_assert(!std::convertible_to, quantity_point>); -static_assert(!std::constructible_from, quantity_point<(isq::height[m])>>); -static_assert(!std::convertible_to, quantity_point>); +static_assert(!std::constructible_from, quantity_point>); +static_assert(!std::convertible_to, quantity_point>); // mixed origins -static_assert(!std::constructible_from, quantity_point<(si::metre)>>); -static_assert(!std::convertible_to, quantity_point<(si::metre), mean_sea_level>>); -static_assert( - !std::constructible_from, quantity_point<(isq::height[m])>>); -static_assert(!std::convertible_to, quantity_point<(isq::height[m]), mean_sea_level>>); +static_assert(!std::constructible_from, quantity_point>); +static_assert(!std::convertible_to, quantity_point>); +static_assert(!std::constructible_from, quantity_point>); +static_assert(!std::convertible_to, quantity_point>); -static_assert(!std::constructible_from, quantity_point<(si::metre), mean_sea_level>>); -static_assert(!std::convertible_to, quantity_point<(si::metre)>>); -static_assert( - !std::constructible_from, quantity_point<(isq::height[m]), mean_sea_level>>); -static_assert(!std::convertible_to, quantity_point<(isq::height[m])>>); +static_assert(!std::constructible_from, quantity_point>); +static_assert(!std::convertible_to, quantity_point>); +static_assert(!std::constructible_from, quantity_point>); +static_assert(!std::convertible_to, quantity_point>); // same explicit origins static_assert( - std::constructible_from, quantity_point<(si::metre), mean_sea_level>>); + std::constructible_from, quantity_point>); static_assert( - std::convertible_to, quantity_point<(si::metre), mean_sea_level>>); + std::convertible_to, quantity_point>); -static_assert(std::constructible_from, - quantity_point<(isq::height[m]), mean_sea_level>>); -static_assert(std::convertible_to, - quantity_point<(isq::height[m]), mean_sea_level>>); - -static_assert(std::constructible_from, - quantity_point<(isq::height[m]), mean_sea_level>>); -static_assert(std::convertible_to, - quantity_point<(isq::height[km]), mean_sea_level>>); - -static_assert(std::constructible_from, - quantity_point<(isq::height[km]), mean_sea_level>>); -static_assert(std::convertible_to, - quantity_point<(isq::height[m]), mean_sea_level>>); - -static_assert(std::constructible_from, - quantity_point<(isq::height[m]), mean_sea_level>>); +static_assert(std::constructible_from, + quantity_point>); static_assert( - std::convertible_to, quantity_point<(si::metre), mean_sea_level>>); + std::convertible_to, quantity_point>); -static_assert(std::constructible_from, - quantity_point<(si::metre), mean_sea_level>>); +static_assert(std::constructible_from, + quantity_point>); static_assert( - std::convertible_to, quantity_point<(isq::height[m]), mean_sea_level>>); + std::convertible_to, quantity_point>); -static_assert(std::constructible_from, +static_assert(std::constructible_from, + quantity_point>); +static_assert( + std::convertible_to, quantity_point>); + +static_assert( + std::constructible_from, quantity_point>); +static_assert( + std::convertible_to, quantity_point>); + +static_assert( + std::constructible_from, quantity_point>); +static_assert( + std::convertible_to, quantity_point>); + +static_assert(std::constructible_from, quantity_point>); static_assert(std::convertible_to, - quantity_point<(isq::height[m]), mean_sea_level>>); + quantity_point>); static_assert( - std::constructible_from, quantity_point<(si::metre), ground_level>>); -static_assert( - std::convertible_to, quantity_point<(si::metre), ground_level>>); - -static_assert(std::constructible_from, - quantity_point<(isq::height[m]), ground_level>>); -static_assert( - std::convertible_to, quantity_point<(isq::height[m]), ground_level>>); - -static_assert(std::constructible_from, - quantity_point<(isq::height[m]), mean_sea_level>>); -static_assert(std::convertible_to, - quantity_point<(isq::height[km]), mean_sea_level>>); - -static_assert(std::constructible_from, - quantity_point<(isq::height[km]), ground_level>>); -static_assert( - std::convertible_to, quantity_point<(isq::height[m]), ground_level>>); + std::constructible_from, quantity_point>); +static_assert(std::convertible_to, quantity_point>); static_assert( - std::constructible_from, quantity_point<(isq::height[m]), ground_level>>); + std::constructible_from, quantity_point>); static_assert( - std::convertible_to, quantity_point<(si::metre), ground_level>>); + std::convertible_to, quantity_point>); + +static_assert(std::constructible_from, + quantity_point>); +static_assert( + std::convertible_to, quantity_point>); static_assert( - std::constructible_from, quantity_point<(si::metre), ground_level>>); + std::constructible_from, quantity_point>); static_assert( - std::convertible_to, quantity_point<(isq::height[m]), ground_level>>); + std::convertible_to, quantity_point>); -static_assert(std::constructible_from, +static_assert( + std::constructible_from, quantity_point>); +static_assert( + std::convertible_to, quantity_point>); + +static_assert( + std::constructible_from, quantity_point>); +static_assert( + std::convertible_to, quantity_point>); + +static_assert(std::constructible_from, quantity_point>); static_assert( - std::convertible_to, quantity_point<(isq::height[m]), ground_level>>); + std::convertible_to, quantity_point>); static_assert( - std::constructible_from, quantity_point<(si::metre), ground_level>>); -static_assert( - std::convertible_to, quantity_point<(si::metre), mean_sea_level>>); + std::constructible_from, quantity_point>); +static_assert(std::convertible_to, quantity_point>); static_assert( - std::constructible_from, quantity_point<(si::metre), mean_sea_level>>); -static_assert( - std::convertible_to, quantity_point<(si::metre), ground_level>>); + std::constructible_from, quantity_point>); +static_assert(std::convertible_to, quantity_point>); static_assert( - std::constructible_from, quantity_point<(si::metre), other_ground_level>>); + std::constructible_from, quantity_point>); static_assert( - std::convertible_to, quantity_point<(si::metre), ground_level>>); + std::convertible_to, quantity_point>); static_assert( std::constructible_from, quantity_point>); @@ -692,121 +682,121 @@ static_assert( static_assert( std::convertible_to, quantity_point>); -static_assert(std::constructible_from, - quantity_point<(isq::height[m]), zeroth_length>>); -static_assert(std::convertible_to, - quantity_point<(isq::length[m]), zeroth_length>>); +static_assert(std::constructible_from, + quantity_point>); +static_assert( + std::convertible_to, quantity_point>); // quantity_specs with common_quantity_spec -static_assert(!std::constructible_from, - quantity_point<(isq::height[m]), zeroth_length>>); -static_assert(!std::convertible_to, - quantity_point<(isq::width[m]), zeroth_length>>); +static_assert(!std::constructible_from, + quantity_point>); +static_assert( + !std::convertible_to, quantity_point>); -static_assert(!std::constructible_from, - quantity_point<(isq::width[m]), zeroth_length>>); -static_assert(!std::convertible_to, - quantity_point<(isq::height[m]), zeroth_length>>); +static_assert(!std::constructible_from, + quantity_point>); +static_assert( + !std::convertible_to, quantity_point>); // different dimensions -static_assert(!std::constructible_from, - quantity_point<(si::kelvin), (si::ice_point)>>); -static_assert(!std::convertible_to, - quantity_point<(isq::height[m]), mean_sea_level>>); +static_assert( + !std::constructible_from, quantity_point>); +static_assert( + !std::convertible_to, quantity_point>); // non-convertible quantity_specs static_assert(!std::constructible_from, - quantity_point<(isq::height[m]), mean_sea_level>>); -static_assert(!std::convertible_to, + quantity_point>); +static_assert(!std::convertible_to, quantity_point>); // implicit conversion from another quantity point only if non-truncating // int -> double OK -static_assert(std::constructible_from, - quantity_point<(isq::height[m]), mean_sea_level, int>>); -static_assert(std::convertible_to, - quantity_point<(isq::height[m]), mean_sea_level>>); +static_assert(std::constructible_from, + quantity_point>); +static_assert(std::convertible_to, + quantity_point>); // truncating double -> int not allowed -static_assert(!std::constructible_from, - quantity_point<(isq::height[m]), mean_sea_level>>); -static_assert(!std::convertible_to, - quantity_point<(isq::height[m]), mean_sea_level, int>>); +static_assert(!std::constructible_from, + quantity_point>); +static_assert(!std::convertible_to, + quantity_point>); // kilometre -> metre OK -static_assert(std::constructible_from, - quantity_point<(isq::height[km]), mean_sea_level, int>>); -static_assert(std::convertible_to, - quantity_point<(isq::height[m]), mean_sea_level, int>>); +static_assert(std::constructible_from, + quantity_point>); +static_assert(std::convertible_to, + quantity_point>); // truncating metre -> kilometre not allowed -static_assert(!std::constructible_from, - quantity_point<(isq::height[m]), mean_sea_level, int>>); -static_assert(!std::convertible_to, - quantity_point<(isq::height[km]), mean_sea_level, int>>); +static_assert(!std::constructible_from, + quantity_point>); +static_assert(!std::convertible_to, + quantity_point>); // converting to double always OK -static_assert(std::constructible_from, - quantity_point<(isq::height[km]), mean_sea_level, int>>); -static_assert(std::convertible_to, - quantity_point<(isq::height[m]), mean_sea_level>>); -static_assert(std::constructible_from, - quantity_point<(isq::height[m]), mean_sea_level, int>>); -static_assert(std::convertible_to, - quantity_point<(isq::height[km]), mean_sea_level>>); +static_assert(std::constructible_from, + quantity_point>); +static_assert(std::convertible_to, + quantity_point>); +static_assert(std::constructible_from, + quantity_point>); +static_assert(std::convertible_to, + quantity_point>); // same but not a default origin -static_assert(std::constructible_from, - quantity_point<(isq::height[m]), mean_sea_level>>); -static_assert(std::convertible_to, - quantity_point<(isq::height[m]), mean_sea_level>>); - -static_assert(std::constructible_from, - quantity_point<(isq::height[m]), mean_sea_level>>); +static_assert(std::constructible_from, + quantity_point>); static_assert( - std::convertible_to, quantity_point<(si::metre), mean_sea_level>>); + std::convertible_to, quantity_point>); -static_assert(std::constructible_from, - quantity_point<(si::metre), mean_sea_level>>); static_assert( - std::convertible_to, quantity_point<(isq::height[m]), mean_sea_level>>); + std::constructible_from, quantity_point>); +static_assert( + std::convertible_to, quantity_point>); -static_assert(std::constructible_from, +static_assert( + std::constructible_from, quantity_point>); +static_assert( + std::convertible_to, quantity_point>); + +static_assert(std::constructible_from, quantity_point>); static_assert(std::convertible_to, - quantity_point<(isq::height[m]), mean_sea_level>>); + quantity_point>); static_assert(!std::constructible_from, - quantity_point<(isq::height[m]), mean_sea_level>>); -static_assert(!std::convertible_to, + quantity_point>); +static_assert(!std::convertible_to, quantity_point>); // different origins -static_assert(!std::constructible_from, - quantity_point<(isq::height[m]), other_absolute_level>>); -static_assert(!std::convertible_to, - quantity_point<(isq::height[m]), mean_sea_level>>); -static_assert(!std::constructible_from, - quantity_point<(isq::height[m]), other_absolute_level>>); -static_assert(!std::convertible_to, - quantity_point<(isq::height[m]), ground_level>>); -static_assert(!std::constructible_from, - quantity_point<(isq::height[m]), ground_level>>); -static_assert(!std::convertible_to, - quantity_point<(isq::height[m]), other_absolute_level>>); +static_assert(!std::constructible_from, + quantity_point>); +static_assert(!std::convertible_to, + quantity_point>); +static_assert(!std::constructible_from, + quantity_point>); +static_assert(!std::convertible_to, + quantity_point>); +static_assert(!std::constructible_from, + quantity_point>); +static_assert(!std::convertible_to, + quantity_point>); #if MP_UNITS_HOSTED // quantity-point-like static_assert( - std::constructible_from>, sys_seconds>); + std::constructible_from>, sys_seconds>); static_assert( - std::convertible_to>>); + std::convertible_to>>); // incompatible origin -static_assert(!std::constructible_from>, - sys_seconds>); static_assert( - !std::convertible_to>>); + !std::constructible_from>, sys_seconds>); +static_assert( + !std::convertible_to>>); #endif @@ -835,19 +825,17 @@ static_assert((mean_sea_level + 42 * m).quantity_from(mean_sea_level) == 42 * m) static_assert((ground_level + 42 * m).quantity_from(ground_level) == 42 * m); static_assert((tower_peak + 42 * m).quantity_from(tower_peak) == 42 * m); -static_assert(quantity_point<(isq::height[m]), mean_sea_level>(ground_level + 42 * m).quantity_from(mean_sea_level) == +static_assert(quantity_point(ground_level + 42 * m).quantity_from(mean_sea_level) == 84 * m); -static_assert(quantity_point<(isq::height[m]), mean_sea_level>(tower_peak + 42 * m).quantity_from(mean_sea_level) == +static_assert(quantity_point(tower_peak + 42 * m).quantity_from(mean_sea_level) == 126 * m); -static_assert(quantity_point<(isq::height[m]), ground_level>(mean_sea_level + 84 * m).quantity_from(ground_level) == +static_assert(quantity_point(mean_sea_level + 84 * m).quantity_from(ground_level) == 42 * m); -static_assert(quantity_point<(isq::height[m]), ground_level>(tower_peak + 42 * m).quantity_from(ground_level) == - 84 * m); +static_assert(quantity_point(tower_peak + 42 * m).quantity_from(ground_level) == 84 * m); -static_assert(quantity_point<(isq::height[m]), tower_peak>(mean_sea_level + 42 * m).quantity_from(tower_peak) == - -42 * m); -static_assert(quantity_point<(isq::height[m]), tower_peak>(ground_level + 84 * m).quantity_from(tower_peak) == 42 * m); +static_assert(quantity_point(mean_sea_level + 42 * m).quantity_from(tower_peak) == -42 * m); +static_assert(quantity_point(ground_level + 84 * m).quantity_from(tower_peak) == 42 * m); static_assert((mean_sea_level + 42 * m).point_for(mean_sea_level).quantity_from(mean_sea_level) == 42 * m); static_assert((ground_level + 42 * m).point_for(mean_sea_level).quantity_from(mean_sea_level) == 84 * m); @@ -862,7 +850,7 @@ static_assert((mean_sea_level + 42 * m).point_for(tower_peak).quantity_from(towe static_assert((ground_level + 84 * m).point_for(tower_peak).quantity_from(tower_peak) == 42 * m); static_assert(is_of_type<(ground_level + isq::height(short{42} * m)).point_for(mean_sea_level), - quantity_point<(isq::height[m]), mean_sea_level, int>>); + quantity_point>); /////////////////////////////////// @@ -889,8 +877,8 @@ static_assert(is_of_type<(mean_sea_level + 2500. * m).force_in(km), quantit template typename QP> concept invalid_unit_conversion = requires { - requires !requires { QP<(isq::height[m]), mean_sea_level, int>(2000 * m).in(km); }; // truncating conversion - requires !requires { QP<(isq::height[m]), mean_sea_level, int>(2 * m).in(s); }; // invalid unit + requires !requires { QP(2000 * m).in(km); }; // truncating conversion + requires !requires { QP(2 * m).in(s); }; // invalid unit }; static_assert(invalid_unit_conversion); @@ -938,12 +926,13 @@ static_assert(quantity_point{sys_seconds{24h}}.quantity_spec == kind_of typename QP> concept invalid_compound_assignments = requires() { // truncating not allowed - requires !requires(QP<(isq::height[m]), mean_sea_level, int> l) { l += 2.5 * m; }; - requires !requires(QP<(isq::height[m]), mean_sea_level, int> l) { l -= 2.5 * m; }; - requires !requires(QP l) { l += 2 * (isq::height[m]); }; - requires !requires(QP l) { l -= 2 * (isq::height[m]); }; + requires !requires(QP l) { l += 2.5 * m; }; + requires !requires(QP l) { l -= 2.5 * m; }; + requires !requires(QP l) { l += 2 * isq::height[m]; }; + requires !requires(QP l) { l -= 2 * isq::height[m]; }; // only quantities can be added or subtracted - requires !requires(QP<(isq::height[m]), mean_sea_level, int> l) { l += 2; }; - requires !requires(QP<(isq::height[m]), mean_sea_level, int> l) { l -= 2; }; + requires !requires(QP l) { l += 2; }; + requires !requires(QP l) { l -= 2; }; // no unit constants - requires !requires(QP<(isq::height[m]), mean_sea_level, int> l) { l += m; }; - requires !requires(QP<(isq::height[m]), mean_sea_level, int> l) { l -= m; }; + requires !requires(QP l) { l += m; }; + requires !requires(QP l) { l -= m; }; }; static_assert(invalid_compound_assignments); @@ -1143,12 +1132,12 @@ concept invalid_binary_operations = requires { requires !requires { Origin - Origin; }; // unit constants - requires !requires { QP<(si::metre), mean_sea_level, int>(1) + m; }; - requires !requires { QP<(si::metre), mean_sea_level, int>(1) - m; }; + requires !requires { QP(1) + m; }; + requires !requires { QP(1) - m; }; requires !requires { Origin + m; }; requires !requires { Origin - m; }; - requires !requires { m + QP<(si::metre), mean_sea_level, int>(1); }; - requires !requires { m - QP<(si::metre), mean_sea_level, int>(1); }; + requires !requires { m + QP(1); }; + requires !requires { m - QP(1); }; requires !requires { m + Origin; }; requires !requires { m - Origin; }; }; @@ -1185,36 +1174,36 @@ static_assert(is_of_type<1 * m + (mean_sea_level + 1 * km), quantity_point>); static_assert( - is_of_type<1 * m + (mean_sea_level + isq::height(1 * m)), quantity_point<(isq::height[m]), mean_sea_level, int>>); + is_of_type<1 * m + (mean_sea_level + isq::height(1 * m)), quantity_point>); static_assert( - is_of_type<1 * m + (mean_sea_level + isq::height(1 * km)), quantity_point<(isq::height[m]), mean_sea_level, int>>); + is_of_type<1 * m + (mean_sea_level + isq::height(1 * km)), quantity_point>); static_assert( - is_of_type<1 * km + (mean_sea_level + isq::height(1 * m)), quantity_point<(isq::height[m]), mean_sea_level, int>>); + is_of_type<1 * km + (mean_sea_level + isq::height(1 * m)), quantity_point>); static_assert( - is_of_type>); + is_of_type>); static_assert( - is_of_type>); + is_of_type>); static_assert( - is_of_type>); + is_of_type>); static_assert(is_of_type>); + quantity_point>); static_assert(is_of_type>); + quantity_point>); static_assert(is_of_type>); + quantity_point>); static_assert(is_of_type>); static_assert(is_of_type, mean_sea_level, int>>); -static_assert(is_of_type>); +static_assert(is_of_type>); static_assert( is_of_type>); static_assert(is_of_type], mean_sea_level, int>>); static_assert(is_of_type<1 * m + mean_sea_level, quantity_point>); static_assert(is_of_type<1 * km + mean_sea_level, quantity_point, mean_sea_level, int>>); -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<(mean_sea_level + 1 * m) - isq::height(1 * m), quantity_point<(isq::height[m]), mean_sea_level, int>>); + is_of_type<(mean_sea_level + 1 * m) - isq::height(1 * m), quantity_point>); static_assert( - is_of_type<(mean_sea_level + 1 * m) - isq::height(1 * km), quantity_point<(isq::height[m]), mean_sea_level, int>>); + is_of_type<(mean_sea_level + 1 * m) - isq::height(1 * km), quantity_point>); static_assert( - is_of_type<(mean_sea_level + 1 * km) - isq::height(1 * m), quantity_point<(isq::height[m]), mean_sea_level, int>>); + is_of_type<(mean_sea_level + 1 * km) - isq::height(1 * m), quantity_point>); static_assert( - is_of_type<(mean_sea_level + isq::height(1 * m)) - 1 * m, quantity_point<(isq::height[m]), mean_sea_level, int>>); + is_of_type<(mean_sea_level + isq::height(1 * m)) - 1 * m, quantity_point>); static_assert( - is_of_type<(mean_sea_level + isq::height(1 * m)) - 1 * km, quantity_point<(isq::height[m]), mean_sea_level, int>>); + is_of_type<(mean_sea_level + isq::height(1 * m)) - 1 * km, quantity_point>); static_assert( - is_of_type<(mean_sea_level + isq::height(1 * km)) - 1 * m, quantity_point<(isq::height[m]), mean_sea_level, int>>); + is_of_type<(mean_sea_level + isq::height(1 * km)) - 1 * m, quantity_point>); static_assert(is_of_type<(mean_sea_level + isq::height(1 * m)) - isq::height(1 * m), - quantity_point<(isq::height[m]), mean_sea_level, int>>); + quantity_point>); static_assert(is_of_type<(mean_sea_level + isq::height(1 * m)) - isq::height(1 * km), - quantity_point<(isq::height[m]), mean_sea_level, int>>); + quantity_point>); static_assert(is_of_type<(mean_sea_level + isq::height(1 * km)) - isq::height(1 * m), - quantity_point<(isq::height[m]), mean_sea_level, int>>); + quantity_point>); static_assert(is_of_type>); static_assert(is_of_type, mean_sea_level, int>>); @@ -1265,39 +1254,39 @@ static_assert(is_of_type<(mean_sea_level + 1 * km) - (mean_sea_level + 1 * m), q static_assert(is_of_type<(mean_sea_level + 1 * m) - (mean_sea_level + 1 * km), quantity>); static_assert( - is_of_type<(mean_sea_level + 1 * m) - (mean_sea_level + isq::height(1 * m)), quantity<(isq::height[m]), int>>); + is_of_type<(mean_sea_level + 1 * m) - (mean_sea_level + isq::height(1 * m)), quantity>); static_assert( - is_of_type<(mean_sea_level + 1 * m) - (mean_sea_level + isq::height(1 * km)), quantity<(isq::height[m]), int>>); + is_of_type<(mean_sea_level + 1 * m) - (mean_sea_level + isq::height(1 * km)), quantity>); static_assert( - is_of_type<(mean_sea_level + 1 * km) - (mean_sea_level + isq::height(1 * m)), quantity<(isq::height[m]), int>>); + is_of_type<(mean_sea_level + 1 * km) - (mean_sea_level + isq::height(1 * m)), quantity>); static_assert( - is_of_type<(mean_sea_level + isq::height(1 * m)) - (mean_sea_level + 1 * m), quantity<(isq::height[m]), int>>); + is_of_type<(mean_sea_level + isq::height(1 * m)) - (mean_sea_level + 1 * m), quantity>); static_assert( - is_of_type<(mean_sea_level + isq::height(1 * m)) - (mean_sea_level + 1 * km), quantity<(isq::height[m]), int>>); + is_of_type<(mean_sea_level + isq::height(1 * m)) - (mean_sea_level + 1 * km), quantity>); static_assert( - is_of_type<(mean_sea_level + isq::height(1 * km)) - (mean_sea_level + 1 * m), quantity<(isq::height[m]), int>>); + is_of_type<(mean_sea_level + isq::height(1 * km)) - (mean_sea_level + 1 * m), quantity>); static_assert(is_of_type<(mean_sea_level + isq::height(1 * m)) - (mean_sea_level + isq::height(1 * m)), - quantity<(isq::height[m]), int>>); + quantity>); static_assert(is_of_type<(mean_sea_level + isq::height(1 * m)) - (mean_sea_level + isq::height(1 * km)), - quantity<(isq::height[m]), int>>); + quantity>); static_assert(is_of_type<(mean_sea_level + isq::height(1 * km)) - (mean_sea_level + isq::height(1 * m)), - quantity<(isq::height[m]), int>>); + quantity>); static_assert(is_of_type<(mean_sea_level + 1 * m) - (mean_sea_level + 1 * m), quantity>); static_assert(is_of_type<(ground_level + 1 * m) - (ground_level + 1 * m), quantity>); static_assert(is_of_type<(tower_peak + 1 * m) - (tower_peak + 1 * m), quantity>); -static_assert(is_of_type<(mean_sea_level + 1 * m) - (ground_level + 1 * m), quantity<(isq::height[m]), int>>); -static_assert(is_of_type<(ground_level + 1 * m) - (mean_sea_level + 1 * m), quantity<(isq::height[m]), int>>); -static_assert(is_of_type<(tower_peak + 1 * m) - (ground_level + 1 * m), quantity<(isq::height[m]), int>>); -static_assert(is_of_type<(ground_level + 1 * m) - (tower_peak + 1 * m), quantity<(isq::height[m]), int>>); -static_assert(is_of_type<(tower_peak + 1 * m) - (mean_sea_level + 1 * m), quantity<(isq::height[m]), int>>); -static_assert(is_of_type<(mean_sea_level + 1 * m) - (tower_peak + 1 * m), quantity<(isq::height[m]), int>>); -static_assert(is_of_type<(other_ground_level + 1 * m) - (ground_level + 1 * m), quantity<(isq::height[m]), int>>); -static_assert(is_of_type<(ground_level + 1 * m) - (other_ground_level + 1 * m), quantity<(isq::height[m]), int>>); -static_assert(is_of_type<(other_ground_level + 1 * m) - (tower_peak + 1 * m), quantity<(isq::height[m]), int>>); -static_assert(is_of_type<(tower_peak + 1 * m) - (other_ground_level + 1 * m), quantity<(isq::height[m]), int>>); +static_assert(is_of_type<(mean_sea_level + 1 * m) - (ground_level + 1 * m), quantity>); +static_assert(is_of_type<(ground_level + 1 * m) - (mean_sea_level + 1 * m), quantity>); +static_assert(is_of_type<(tower_peak + 1 * m) - (ground_level + 1 * m), quantity>); +static_assert(is_of_type<(ground_level + 1 * m) - (tower_peak + 1 * m), quantity>); +static_assert(is_of_type<(tower_peak + 1 * m) - (mean_sea_level + 1 * m), quantity>); +static_assert(is_of_type<(mean_sea_level + 1 * m) - (tower_peak + 1 * m), quantity>); +static_assert(is_of_type<(other_ground_level + 1 * m) - (ground_level + 1 * m), quantity>); +static_assert(is_of_type<(ground_level + 1 * m) - (other_ground_level + 1 * m), quantity>); +static_assert(is_of_type<(other_ground_level + 1 * m) - (tower_peak + 1 * m), quantity>); +static_assert(is_of_type<(tower_peak + 1 * m) - (other_ground_level + 1 * m), quantity>); static_assert(is_of_type>); static_assert(is_of_type, int>>); @@ -1309,32 +1298,32 @@ static_assert(is_of_type>); static_assert(is_of_type<(ground_level + 1 * km) - ground_level, quantity, int>>); -static_assert(is_of_type>); -static_assert(is_of_type>); -static_assert(is_of_type<(ground_level + 1 * m) - mean_sea_level, quantity<(isq::height[m]), int>>); -static_assert(is_of_type<(ground_level + 1 * km) - mean_sea_level, quantity<(isq::height[m]), int>>); +static_assert(is_of_type>); +static_assert(is_of_type>); +static_assert(is_of_type<(ground_level + 1 * m) - mean_sea_level, quantity>); +static_assert(is_of_type<(ground_level + 1 * km) - mean_sea_level, quantity>); -static_assert(is_of_type>); -static_assert(is_of_type>); -static_assert(is_of_type<(mean_sea_level + 1 * m) - ground_level, quantity<(isq::height[m]), int>>); -static_assert(is_of_type<(mean_sea_level + 1 * km) - ground_level, quantity<(isq::height[m]), int>>); +static_assert(is_of_type>); +static_assert(is_of_type>); +static_assert(is_of_type<(mean_sea_level + 1 * m) - ground_level, quantity>); +static_assert(is_of_type<(mean_sea_level + 1 * km) - ground_level, quantity>); -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>); +static_assert(is_of_type>); -static_assert(is_of_type<(1 * m + mean_sea_level) - (1 * m + ground_level), quantity<(isq::height[m]), int>>); -static_assert(is_of_type<(1 * m + ground_level) - (1 * m + mean_sea_level), quantity<(isq::height[m]), int>>); -static_assert(is_of_type<(1 * m + tower_peak) - (1 * m + ground_level), quantity<(isq::height[m]), int>>); -static_assert(is_of_type<(1 * m + ground_level) - (1 * m + tower_peak), quantity<(isq::height[m]), int>>); -static_assert(is_of_type<(1 * m + tower_peak) - (1 * m + mean_sea_level), quantity<(isq::height[m]), int>>); -static_assert(is_of_type<(1 * m + mean_sea_level) - (1 * m + tower_peak), quantity<(isq::height[m]), int>>); -static_assert(is_of_type<(1 * m + other_ground_level) - (1 * m + ground_level), quantity<(isq::height[m]), int>>); -static_assert(is_of_type<(1 * m + ground_level) - (1 * m + other_ground_level), quantity<(isq::height[m]), int>>); -static_assert(is_of_type<(1 * m + other_ground_level) - (1 * m + tower_peak), quantity<(isq::height[m]), int>>); -static_assert(is_of_type<(1 * m + tower_peak) - (1 * m + other_ground_level), quantity<(isq::height[m]), int>>); +static_assert(is_of_type<(1 * m + mean_sea_level) - (1 * m + ground_level), quantity>); +static_assert(is_of_type<(1 * m + ground_level) - (1 * m + mean_sea_level), quantity>); +static_assert(is_of_type<(1 * m + tower_peak) - (1 * m + ground_level), quantity>); +static_assert(is_of_type<(1 * m + ground_level) - (1 * m + tower_peak), quantity>); +static_assert(is_of_type<(1 * m + tower_peak) - (1 * m + mean_sea_level), quantity>); +static_assert(is_of_type<(1 * m + mean_sea_level) - (1 * m + tower_peak), quantity>); +static_assert(is_of_type<(1 * m + other_ground_level) - (1 * m + ground_level), quantity>); +static_assert(is_of_type<(1 * m + ground_level) - (1 * m + other_ground_level), quantity>); +static_assert(is_of_type<(1 * m + other_ground_level) - (1 * m + tower_peak), quantity>); +static_assert(is_of_type<(1 * m + tower_peak) - (1 * m + other_ground_level), quantity>); // check for integral types promotion @@ -1654,8 +1643,8 @@ static_assert(is_of_type<(zero_Hz + 5 * isq::frequency[Hz]) - (zero_Hz + 10 / (2 static_assert((quantity_point{10 / (2 * isq::period_duration[s])} + 5 * isq::frequency[Hz]).quantity_from_zero() == 10 * isq::frequency[Hz]); -static_assert((10 / (2 * isq::period_duration[s]) + (zero_Hz + 5 * isq::frequency[Hz])).quantity_from_zero() == - 10 * isq::frequency[Hz]); +static_assert((10 / (2 * isq::period_duration[s]) + quantity_point{zero_Hz + 5 * isq::frequency[Hz]}) + .quantity_from_zero() == 10 * isq::frequency[Hz]); static_assert((quantity_point{5 * isq::frequency[Hz]} + 10 / (2 * isq::period_duration[s])).quantity_from_zero() == 10 * isq::frequency[Hz]); static_assert((5 * isq::frequency[Hz] + quantity_point{10 / (2 * isq::period_duration[s])}).quantity_from_zero() == @@ -1729,7 +1718,7 @@ static_assert(value_cast(quantity_point{2 * km}).quantity_from_zero().numeric static_assert(value_cast(quantity_point{2000 * m}).quantity_from_zero().numerical_value_in(km) == 2); static_assert(value_cast(quantity_point{1.23 * m}).quantity_from_zero().numerical_value_in(m) == 1); static_assert( - value_cast<(km / h)>(quantity_point{2000.0 * m / (3600.0 * s)}).quantity_from_zero().numerical_value_in(km / h) == 2); + value_cast(quantity_point{2000.0 * m / (3600.0 * s)}).quantity_from_zero().numerical_value_in(km / h) == 2); // lvalue references in value_cast namespace lvalue_tests { constexpr quantity_point lvalue_qp{2 * km}; diff --git a/test/static/quantity_spec_test.cpp b/test/static/quantity_spec_test.cpp index ed4cb359..ee4e86a8 100644 --- a/test/static/quantity_spec_test.cpp +++ b/test/static/quantity_spec_test.cpp @@ -33,8 +33,8 @@ namespace { using namespace mp_units; -using dimensionless_ = struct mp_units::dimensionless; -using dim_one_ = struct mp_units::dimension_one; +using dimensionless_ = struct dimensionless; +using dim_one_ = struct dimension_one; // clang-format off inline constexpr struct dim_length_ final : base_dimension<"L"> {} dim_length; diff --git a/test/static/quantity_test.cpp b/test/static/quantity_test.cpp index 44ee65ad..89f169bb 100644 --- a/test/static/quantity_test.cpp +++ b/test/static/quantity_test.cpp @@ -84,14 +84,14 @@ static_assert(std::is_nothrow_destructible_v>); static_assert(std::is_trivially_copyable_v>); static_assert(std::is_standard_layout_v>); -static_assert(std::default_initializable>); -static_assert(std::move_constructible>); -static_assert(std::copy_constructible>); -static_assert(std::equality_comparable>); -static_assert(std::totally_ordered>); -static_assert(std::regular>); +static_assert(std::default_initializable>); +static_assert(std::move_constructible>); +static_assert(std::copy_constructible>); +static_assert(std::equality_comparable>); +static_assert(std::totally_ordered>); +static_assert(std::regular>); -static_assert(std::three_way_comparable>); +static_assert(std::three_way_comparable>); ////////////////// @@ -112,8 +112,8 @@ static_assert(quantity::unit == si::metre); // member types ///////////////// -static_assert(is_same_v::rep, double>); -static_assert(is_same_v::rep, int>); +static_assert(is_same_v::rep, double>); +static_assert(is_same_v::rep, int>); [[maybe_unused]] volatile std::int16_t vint = 123; static_assert(is_same_v); @@ -139,11 +139,11 @@ static_assert(quantity::max().numerical_value_in(m) == s ///////////////////////////////////////////////// // construction from a value is private -static_assert(!std::constructible_from, double>); -static_assert(!std::convertible_to>); +static_assert(!std::constructible_from, double>); +static_assert(!std::convertible_to>); -static_assert(!std::constructible_from, int>); -static_assert(!std::convertible_to>); +static_assert(!std::constructible_from, int>); +static_assert(!std::convertible_to>); static_assert(std::constructible_from, double>); static_assert(std::convertible_to>); @@ -163,46 +163,45 @@ static_assert(std::convertible_to>); /////////////////////////////////////// // conversion only between convertible quantities -static_assert(std::constructible_from, quantity<(isq::length[m])>>); -static_assert(std::convertible_to, quantity<(isq::length[m])>>); -static_assert(std::constructible_from, quantity<(isq::distance[m])>>); -static_assert(std::convertible_to, quantity<(isq::length[m])>>); -static_assert(std::constructible_from, quantity<(isq::length[km])>>); -static_assert(std::convertible_to, quantity<(isq::length[m])>>); +static_assert(std::constructible_from, quantity>); +static_assert(std::convertible_to, quantity>); +static_assert(std::constructible_from, quantity>); +static_assert(std::convertible_to, quantity>); +static_assert(std::constructible_from, quantity>); +static_assert(std::convertible_to, quantity>); // conversion between different quantities not allowed -static_assert(!std::constructible_from, quantity<(isq::time[s])>>); -static_assert(!std::convertible_to, quantity<(isq::length[m])>>); -static_assert(!std::constructible_from, quantity<(isq::speed[m / s])>>); -static_assert(!std::convertible_to, quantity<(isq::length[m])>>); +static_assert(!std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity>); +static_assert(!std::constructible_from, quantity>); +static_assert(!std::convertible_to, quantity>); // implicit conversion from another quantity only if non-truncating +static_assert(std::constructible_from, quantity>); // int -> double OK +static_assert(std::convertible_to, quantity>); // int -> double OK + +static_assert(!std::constructible_from, + quantity>); // truncating double -> int not allowed +static_assert(!std::convertible_to, + quantity>); // truncating double -> int not allowed + +static_assert(std::constructible_from, + quantity>); // kilometre -> metre OK +static_assert(std::convertible_to, + quantity>); // kilometre -> metre OK + +static_assert(!std::constructible_from, + quantity>); // truncating metre -> + // kilometre not allowed static_assert( - std::constructible_from, quantity<(isq::length[m]), int>>); // int -> double OK -static_assert(std::convertible_to, quantity<(isq::length[m])>>); // int -> double OK - -static_assert(!std::constructible_from, - quantity<(isq::length[m])>>); // truncating double -> int not allowed -static_assert(!std::convertible_to, - quantity<(isq::length[m]), int>>); // truncating double -> int not allowed - -static_assert(std::constructible_from, - quantity<(isq::length[km]), int>>); // kilometre -> metre OK -static_assert(std::convertible_to, - quantity<(isq::length[m]), int>>); // kilometre -> metre OK - -static_assert(!std::constructible_from, - quantity<(isq::length[m]), int>>); // truncating metre -> - // kilometre not allowed -static_assert( - !std::convertible_to, - quantity<(isq::length[km]), int>>); // truncating metre -> kilometre not allowed + !std::convertible_to, + quantity>); // truncating metre -> kilometre not allowed // converting to double always OK -static_assert(std::constructible_from, quantity<(isq::length[km]), int>>); -static_assert(std::convertible_to, quantity<(isq::length[m])>>); -static_assert(std::constructible_from, quantity<(isq::length[m]), int>>); -static_assert(std::convertible_to, quantity<(isq::length[km])>>); +static_assert(std::constructible_from, quantity>); +static_assert(std::convertible_to, quantity>); +static_assert(std::constructible_from, quantity>); +static_assert(std::convertible_to, quantity>); /////////////////////// // obtaining a number @@ -220,16 +219,16 @@ static_assert(quantity(1500 * m).numerical_value_in(km) == 1.5) static_assert(!std::convertible_to, double>); static_assert(std::constructible_from>); -static_assert(!std::convertible_to, double>); -static_assert(std::constructible_from>); +static_assert(!std::convertible_to, double>); +static_assert(std::constructible_from>); static_assert(!std::convertible_to, int>); static_assert(std::constructible_from>); -static_assert(!std::convertible_to, int>); -static_assert(std::constructible_from>); +static_assert(!std::convertible_to, int>); +static_assert(std::constructible_from>); static_assert(!std::convertible_to, double>); static_assert(std::constructible_from>); -static_assert(!std::convertible_to, double>); -static_assert(std::constructible_from>); +static_assert(!std::convertible_to, double>); +static_assert(std::constructible_from>); /////////////////////////////////// @@ -319,9 +318,9 @@ struct derived_quantity : quantity { R::operator=(t); return *this; } - constexpr derived_quantity& operator=(R&& other) + constexpr derived_quantity& operator=(R&& t) { - R::operator=(std::move(other)); + R::operator=(std::move(t)); return *this; } // NOLINTBEGIN(google-explicit-constructor, hicpp-explicit-conversions) @@ -332,9 +331,9 @@ struct derived_quantity : quantity { // NOLINTEND(google-explicit-constructor, hicpp-explicit-conversions) }; -static_assert(Quantity, "NTTP type description">>); +static_assert(Quantity, "NTTP type description">>); -constexpr QuantityOf<(isq::length)> auto get_length_derived_quantity() noexcept +constexpr QuantityOf auto get_length_derived_quantity() noexcept { derived_quantity, "NTTP type description"> dist{}; dist += 1 * m; @@ -363,8 +362,7 @@ static_assert(quantity{123}.quantity_spec == kind_of); #if MP_UNITS_HOSTED using namespace std::chrono_literals; static_assert(std::is_same_v); -// return type for "s" is not specified. is double for msvc -// static_assert(std::is_same_v); +static_assert(std::is_same_v); static_assert(quantity{24h}.unit == si::hour); static_assert(quantity{24h}.quantity_spec == kind_of); #endif @@ -463,10 +461,10 @@ static_assert((std::uint8_t{255}* m %= 257 * m).numerical_value_in(m) != [] { #if !(defined MP_UNITS_COMP_CLANG && MP_UNITS_COMP_CLANG < 18 && defined MP_UNITS_MODULES) // next two lines trigger conversions warnings // (warning disabled in CMake for this file) -static_assert(((22 * m) *= 33.33).numerical_value_in(m) == 733); -static_assert(((22 * m) /= 3.33).numerical_value_in(m) == 6); -static_assert(((22 * m) *= 33.33 * one).numerical_value_in(m) == 733); -static_assert(((22 * m) /= 3.33 * one).numerical_value_in(m) == 6); +static_assert((22 * m *= 33.33).numerical_value_in(m) == 733); +static_assert((22 * m /= 3.33).numerical_value_in(m) == 6); +static_assert((22 * m *= 33.33 * one).numerical_value_in(m) == 733); +static_assert((22 * m /= 3.33 * one).numerical_value_in(m) == 6); #endif template typename Q> @@ -852,30 +850,27 @@ static_assert(2 * one / (1 * m) == 2 / (1 * m)); // equality operators /////////////////////// -static_assert(std::equality_comparable_with, quantity<(si::metre)>>); -static_assert(std::equality_comparable_with, quantity<(si::metre), int>>); -static_assert(std::equality_comparable_with, quantity, int>>); -static_assert(std::equality_comparable_with, quantity, int>>); -static_assert(std::equality_comparable_with, quantity<(si::metre)>>); -static_assert(std::equality_comparable_with, quantity<(si::metre), int>>); +static_assert(std::equality_comparable_with, quantity>); +static_assert(std::equality_comparable_with, quantity>); +static_assert(std::equality_comparable_with, quantity, int>>); +static_assert(std::equality_comparable_with, quantity, int>>); +static_assert(std::equality_comparable_with, quantity>); +static_assert(std::equality_comparable_with, quantity>); +static_assert(std::equality_comparable_with, quantity, int>>); +static_assert(std::equality_comparable_with, quantity>); +static_assert(std::equality_comparable_with, quantity>); +static_assert(std::equality_comparable_with, quantity, int>>); +static_assert(std::equality_comparable_with, quantity>); +static_assert(std::equality_comparable_with, quantity>); static_assert( - std::equality_comparable_with, quantity, int>>); -static_assert(std::equality_comparable_with, quantity<(si::metre)>>); -static_assert(std::equality_comparable_with, quantity<(si::metre), int>>); -static_assert( - std::equality_comparable_with, quantity<(si::kilo<(si::metre)>), int>>); -static_assert(std::equality_comparable_with, quantity<(isq::height[(si::metre)])>>); -static_assert( - std::equality_comparable_with, quantity<(isq::height[(si::metre)]), int>>); -static_assert(std::equality_comparable_with, - quantity<(isq::height[(si::kilo<(si::metre)>)]), int>>); + std::equality_comparable_with, quantity], int>>); template concept no_crossdimensional_equality = requires { requires !requires { 1 * s == 1 * M; }; requires !requires { 1 * s != 1 * M; }; }; -static_assert(no_crossdimensional_equality<(si::metre)>); +static_assert(no_crossdimensional_equality); // same type static_assert(123 * m == 123 * m); @@ -928,7 +923,7 @@ concept no_crossdimensional_ordering = requires { requires !requires { 1 * s <= 1 * M; }; requires !requires { 1 * s >= 1 * M; }; }; -static_assert(no_crossdimensional_ordering<(si::metre)>); +static_assert(no_crossdimensional_ordering); // same type static_assert(123 * m < 321 * m); @@ -1042,35 +1037,34 @@ static_assert(is_of_type(lvalue_q), quantity, (isq::length)>); -static_assert(QuantityOf, (isq::length)>); -static_assert(QuantityOf, (isq::length)>); -static_assert(!QuantityOf, (isq::width)>); -static_assert(QuantityOf, (isq::width)>); -static_assert(QuantityOf, (isq::position_vector)>); -static_assert(QuantityOf[m]>, (isq::width)>); -static_assert(QuantityOf[m]>, (isq::position_vector)>); -static_assert(!QuantityOf, isq::altitude>); +static_assert(QuantityOf, isq::length>); +static_assert(QuantityOf, isq::length>); +static_assert(QuantityOf, isq::length>); +static_assert(!QuantityOf, isq::width>); +static_assert(QuantityOf, isq::width>); +static_assert(QuantityOf, isq::position_vector>); +static_assert(QuantityOf[m]>, isq::width>); +static_assert(QuantityOf[m]>, isq::position_vector>); +static_assert(!QuantityOf, isq::altitude>); -static_assert(QuantityOf, (isq::speed)>); -static_assert(QuantityOf, (isq::length) / (isq::time)>); +static_assert(QuantityOf, isq::speed>); +static_assert(QuantityOf, isq::length / isq::time>); static_assert(QuantityOf, isq::length / isq::time>); -static_assert(QuantityOf[m / s]>, (isq::length) / (isq::time)>); -static_assert(!QuantityOf, (isq::distance) / (isq::duration)>); -static_assert(!QuantityOf, (isq::width) / (isq::duration)>); +static_assert(QuantityOf[m / s]>, isq::length / isq::time>); +static_assert(!QuantityOf, isq::distance / isq::duration>); +static_assert(!QuantityOf, isq::width / isq::duration>); static_assert(QuantityOf, isq::width / isq::duration>); -static_assert(QuantityOf[m / s]>, (isq::width) / (isq::duration)>); -static_assert(!QuantityOf, (isq::position_vector) / (isq::duration)>); +static_assert(QuantityOf[m / s]>, isq::width / isq::duration>); +static_assert(!QuantityOf, isq::position_vector / isq::duration>); static_assert(QuantityOf, isq::position_vector / isq::duration>); -static_assert(QuantityOf[m / s]>, isq::position_vector / isq::duration>); -static_assert(QuantityOf, isq::position_vector / isq::duration>); +static_assert(QuantityOf[m / s]>, isq::position_vector / isq::duration>); +static_assert(QuantityOf, isq::position_vector / isq::duration>); -static_assert(QuantityOf); // kind of -static_assert(QuantityOf[m]), (isq::height)>); // kind of -static_assert(!QuantityOf); // different kinds -static_assert(!QuantityOf); // different kinds -static_assert(QuantityOf); -static_assert( - QuantityOf); // derived unnamed quantity +static_assert(QuantityOf); // kind of +static_assert(QuantityOf[m]), isq::height>); // kind of +static_assert(!QuantityOf); // different kinds +static_assert(!QuantityOf); // different kinds +static_assert(QuantityOf); +static_assert(QuantityOf); // derived unnamed quantity } // namespace diff --git a/test/static/reference_test.cpp b/test/static/reference_test.cpp index 46026702..65abe0bb 100644 --- a/test/static/reference_test.cpp +++ b/test/static/reference_test.cpp @@ -34,8 +34,8 @@ namespace { using namespace mp_units; -using dimensionless_ = struct mp_units::dimensionless; -using one_ = struct mp_units::one; +using dimensionless_ = struct dimensionless; +using one_ = struct one; // base dimensions // clang-format off @@ -238,7 +238,7 @@ template concept invalid_nu_unit = !requires { dim[unit]; }; static_assert(invalid_nu_unit); -static_assert(invalid_nu_unit<(nu::time), second>); +static_assert(invalid_nu_unit); static_assert(invalid_nu_unit); static_assert(invalid_nu_unit); static_assert(invalid_nu_unit); diff --git a/test/static/si_test.cpp b/test/static/si_test.cpp index d52a8edc..4f306fd2 100644 --- a/test/static/si_test.cpp +++ b/test/static/si_test.cpp @@ -65,7 +65,7 @@ concept can_not_be_prefixed = Unit && !requires { typename prefix< static_assert(can_not_be_prefixed); static_assert(can_not_be_prefixed); -static_assert(can_not_be_prefixed)>); +static_assert(can_not_be_prefixed>); static_assert(can_not_be_prefixed); static_assert(can_not_be_prefixed * si::degree>); diff --git a/test/static/unit_test.cpp b/test/static/unit_test.cpp index c16ea66a..ba7ecb4c 100644 --- a/test/static/unit_test.cpp +++ b/test/static/unit_test.cpp @@ -35,8 +35,8 @@ namespace { using namespace mp_units; using namespace mp_units::detail; -using one_ = struct mp_units::one; -using percent_ = struct mp_units::percent; +using one_ = struct one; +using percent_ = struct percent; // base dimensions // clang-format off