diff --git a/example/avg_speed.cpp b/example/avg_speed.cpp index dc2d24d2..11072bb3 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 d, - quantity t) +constexpr quantity fixed_int_si_avg_speed(quantity<(si::metre), int> d, + quantity<(si::second), int> t) { return d / t; } -constexpr quantity fixed_double_si_avg_speed(quantity d, quantity t) +constexpr quantity fixed_double_si_avg_speed(quantity<(si::metre)> d, quantity<(si::second)> t) { return d / t; } -constexpr QuantityOf auto avg_speed(QuantityOf auto d, QuantityOf auto t) +constexpr QuantityOf<(isq::speed)> auto avg_speed(QuantityOf<(isq::length)> auto d, QuantityOf<(isq::time)> auto t) { return d / t; } -template D, QuantityOf T, QuantityOf V> +template D, QuantityOf<(isq::time)> T, QuantityOf<(isq::speed)> V> void print_result(D distance, T duration, V speed) { - const auto result_in_kmph = speed.force_in(si::kilo / non_si::hour); + const auto result_in_kmph = speed.force_in((si::kilo<(si::metre)> / 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 4cf363fe..2f2f7fdb 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 auto Vt = V0 * exp(dimensionless(-tt / (RR * CC))); + const QuantityOf<(isq::voltage)> 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 42ed6d0b..9a74de52 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]>; - using duration = quantity; + using distance = quantity<(isq::distance[kilo])>; + using duration = quantity<(isq::duration[second])>; constexpr distance km = 1. * kilo; constexpr distance miles = 1. * mile; diff --git a/example/currency.cpp b/example/currency.cpp index 6f280659..0eb46040 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 quantity_point price_usd{100 * USD}; - const quantity_point price_euro = exchange_to(price_usd); + const mp_units::quantity_point price_usd{100 * USD}; + const mp_units::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 133a7713..f06062fe 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 t = {waypoints[0], waypoints[1], waypoints[0]}; + const task glider_task = {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(t); + print(glider_task); print(tow); - for (const auto& g : gliders) { + for (const auto& glider : gliders) { for (const auto& c : weather_conditions) { - const std::string txt = "Scenario: Glider = " + g.name + ", Weather = " + c.first; + const std::string txt = "Scenario: Glider = " + glider.name + ", Weather = " + c.first; std::cout << txt << "\n"; std::cout << MP_UNITS_STD_FMT::format("{0:=^{1}}\n\n", "", txt.size()); - estimate(start_time, g, c.second, t, sfty, tow); + estimate(start_time, glider, c.second, glider_task, 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 5e2ac4db..e8fafbf3 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 auto glide_ratio(const glider::polar_point& polar) +constexpr mp_units::QuantityOf<(mp_units::dimensionless)> 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 e635bc25..95b5e6d6 100644 --- a/example/hello_units.cpp +++ b/example/hello_units.cpp @@ -45,7 +45,7 @@ import mp_units; using namespace mp_units; -constexpr QuantityOf auto avg_speed(QuantityOf auto d, QuantityOf auto t) +constexpr QuantityOf<(isq::speed)> auto avg_speed(QuantityOf<(isq::length)> auto d, QuantityOf<(isq::time)> auto t) { return d / t; } diff --git a/example/include/geographic.h b/example/include/geographic.h index ba26b3f1..4f7ca94a 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>; +using latitude = mp_units::quantity_point<(mp_units::si::degree), equator, ranged_representation>; template -using longitude = mp_units::quantity_point>; +using longitude = mp_units::quantity_point<(mp_units::si::degree), prime_meridian, ranged_representation>; 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]; + constexpr quantity earth_radius = 6'371 * isq::radius[si::kilo<(si::metre)>]; 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(earth_radius * central_angle); + return quantity_cast<(isq::distance)>(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 90d0d506..80179790 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 T> +template K, + mp_units::QuantityOf<(mp_units::isq::time)> 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 T> + mp_units::QuantityOf<(mp_units::dimensionless)> K, mp_units::QuantityOf<(mp_units::isq::time)> 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 T 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 b0cf594b..d7650c21 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 auto velocity = acceleration * time; + const QuantityOf<(isq::velocity)> 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 3fce6a8b..d618b3b3 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 T2, QuantityOf T3, - QuantityOf T4, QuantityOf T5> +template T1, QuantityOf<(isq::wavenumber)> T2, QuantityOf<(isq::frequency)> T3, + QuantityOf<(isq::thermodynamic_temperature)> T4, QuantityOf<(isq::wavelength)> 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 T2, QuantityOf T3, - QuantityOf T4, QuantityOf T5> +template T1, QuantityOf<(isq::wavenumber)> T2, QuantityOf<(isq::frequency)> T3, + QuantityOf<(isq::thermodynamic_temperature)> T4, QuantityOf<(isq::wavelength)> 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 86bc32ff..44b24738 100644 --- a/example/storage_tank.cpp +++ b/example/storage_tank.cpp @@ -77,10 +77,10 @@ public: density_ = density; } - [[nodiscard]] constexpr QuantityOf auto filled_weight() const + [[nodiscard]] constexpr QuantityOf<(isq::weight)> auto filled_weight() const { const auto volume = isq::volume(base_ * height_); // TODO check if we can remove that cast - const QuantityOf auto mass = density_ * volume; + const QuantityOf<(isq::mass)> 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 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 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 quantity fill_ratio = fill_level / height; diff --git a/example/total_energy.cpp b/example/total_energy.cpp index 75416bb7..28963f6b 100644 --- a/example/total_energy.cpp +++ b/example/total_energy.cpp @@ -45,8 +45,8 @@ namespace { using namespace mp_units; -QuantityOf auto total_energy(QuantityOf auto p, QuantityOf auto m, - QuantityOf auto c) +QuantityOf<(isq::mechanical_energy)> auto total_energy(QuantityOf<(isq::momentum)> auto p, + QuantityOf<(isq::mass)> auto m, QuantityOf<(isq::speed)> 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 auto m1 = 3. * GeV / c2; - const quantity E = total_energy(p1, m1, c); + const QuantityOf<(isq::mass)> auto m1 = 3. * GeV / c2; + const quantity E1 = 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 = " << E << "\n"; + << "E = " << E1 << "\n"; const quantity p2 = p1.in(GeV / (m / s)); - const quantity m2 = m1.in(GeV / pow<2>(m / s)); - const quantity E2 = total_energy(p2, m2, c).in(GeV); + const quantity metre2 = m1.in(GeV / pow<2>(m / s)); + const quantity E2 = total_energy(p2, metre2, 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 m3 = m1.in(kg); - const quantity E3 = total_energy(p3, m3, c).in(J); + const quantity metre3 = m1.in(kg); + const quantity E3 = total_energy(p3, metre3, 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 064e8055..9cb32bfc 100644 --- a/example/unmanned_aerial_vehicle.cpp +++ b/example/unmanned_aerial_vehicle.cpp @@ -70,6 +70,7 @@ 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/src/core/include/mp-units/bits/hacks.h b/src/core/include/mp-units/bits/hacks.h index 0099be3d..4aec2a8d 100644 --- a/src/core/include/mp-units/bits/hacks.h +++ b/src/core/include/mp-units/bits/hacks.h @@ -124,7 +124,7 @@ inline constexpr from_range_t from_range{}; #else #define MP_UNITS_CONSTRAINED_NTTP_WORKAROUND(X) X -#define MP_UNITS_EXPRESSION_WORKAROUND(x) x +#define MP_UNITS_EXPRESSION_WORKAROUND(x) x #define MP_UNITS_IS_VALUE_WORKAROUND(x) x #define MP_UNITS_IS_CONST_EXPR_WORKAROUND(x) x diff --git a/src/core/include/mp-units/bits/type_list.h b/src/core/include/mp-units/bits/type_list.h index 636c1df1..61708944 100644 --- a/src/core/include/mp-units/bits/type_list.h +++ b/src/core/include/mp-units/bits/type_list.h @@ -68,7 +68,7 @@ struct type_list_map_impl, To> { }; template typename To> -using type_list_map = type_list_map_impl::type; +using type_list_map = type_list_map_impl::type; // element @@ -105,7 +105,7 @@ struct type_list_front_impl> { }; template -using type_list_front = type_list_front_impl::type; +using type_list_front = type_list_front_impl::type; // back template @@ -121,7 +121,7 @@ struct type_list_push_front_impl, NewTypes...> { }; template -using type_list_push_front = type_list_push_front_impl::type; +using type_list_push_front = type_list_push_front_impl::type; // push_back template @@ -133,7 +133,7 @@ struct type_list_push_back_impl, NewTypes...> { }; template -using type_list_push_back = type_list_push_back_impl::type; +using type_list_push_back = type_list_push_back_impl::type; // join template @@ -143,11 +143,11 @@ struct type_list_join_impl { template typename List, typename... First, typename... Second, typename... Rest> struct type_list_join_impl, List, Rest...> { - using type = type_list_join_impl, Rest...>::type; + using type = type_list_join_impl, Rest...>::type; }; template -using type_list_join = type_list_join_impl::type; +using type_list_join = type_list_join_impl::type; // split template @@ -195,19 +195,19 @@ template typename List, typename Lhs1, typename... LhsRest template typename Pred> requires Pred::value struct type_list_merge_sorted_impl, List, Pred> { - using type = type_list_push_front_impl< + using type = type_list_push_front_impl< typename type_list_merge_sorted_impl, List, Pred>::type, Lhs1>::type; }; template typename List, typename Lhs1, typename... LhsRest, typename Rhs1, typename... RhsRest, template typename Pred> struct type_list_merge_sorted_impl, List, Pred> { - using type = type_list_push_front_impl< + using type = type_list_push_front_impl< typename type_list_merge_sorted_impl, List, Pred>::type, Rhs1>::type; }; template typename Pred> -using type_list_merge_sorted = type_list_merge_sorted_impl::type; +using type_list_merge_sorted = type_list_merge_sorted_impl::type; // sort template typename Pred> @@ -227,13 +227,13 @@ template typename List, typename... Types, template, Pred> { using types = List; using split = type_list_split_half>; - using sorted_left = type_list_sort_impl::type; - using sorted_right = type_list_sort_impl::type; - using type = type_list_merge_sorted_impl::type; + using sorted_left = type_list_sort_impl::type; + using sorted_right = type_list_sort_impl::type; + using type = type_list_merge_sorted_impl::type; }; template typename Pred> -using type_list_sort = type_list_sort_impl::type; +using type_list_sort = type_list_sort_impl::type; } // namespace mp_units::detail diff --git a/src/core/include/mp-units/ext/type_traits.h b/src/core/include/mp-units/ext/type_traits.h index 2ee78e2a..77f0267b 100644 --- a/src/core/include/mp-units/ext/type_traits.h +++ b/src/core/include/mp-units/ext/type_traits.h @@ -56,7 +56,7 @@ struct conditional_impl { MP_UNITS_EXPORT_BEGIN template -using conditional = detail::conditional_impl::template type; +using conditional = detail::conditional_impl::template type; // is_same template @@ -98,7 +98,7 @@ namespace detail { template struct get_value_type { - using type = T::value_type; + using type = T::value_type; }; template @@ -111,13 +111,13 @@ struct get_element_type { template requires requires { typename T::value_type; } || requires { typename T::element_type; } struct wrapped_type { - using type = + using type = conditional, detail::get_element_type>::type; }; template requires requires { typename T::value_type; } || requires { typename T::element_type; } -using wrapped_type_t = wrapped_type::type; +using wrapped_type_t = wrapped_type::type; template struct value_type { @@ -127,11 +127,11 @@ struct value_type { template requires requires { typename wrapped_type_t; } struct value_type { - using type = wrapped_type_t; + using type = wrapped_type_t; }; template -using value_type_t = value_type::type; +using value_type_t = value_type::type; template concept one_of = (false || ... || std::same_as); diff --git a/src/core/include/mp-units/framework/expression_template.h b/src/core/include/mp-units/framework/expression_template.h index 45d3d4b6..6b5836ff 100644 --- a/src/core/include/mp-units/framework/expression_template.h +++ b/src/core/include/mp-units/framework/expression_template.h @@ -122,7 +122,7 @@ struct expr_type_impl> : std::type_identity {}; } // namespace detail template -using expr_type = detail::expr_type_impl::type; +using expr_type = detail::expr_type_impl::type; namespace detail { @@ -182,24 +182,25 @@ struct expr_consolidate_impl> { template requires(!is_specialization_of_power) struct expr_consolidate_impl> { - using type = expr_consolidate_impl, Rest...>>::type; + using type = expr_consolidate_impl, Rest...>>::type; }; // replaces the instance of a type and a power of it with one with incremented power template struct expr_consolidate_impl, Rest...>> { - using type = expr_consolidate_impl::exponent + 1>, Rest...>>::type; + using type = + expr_consolidate_impl::exponent + 1>, Rest...>>::type; }; // accumulates the powers of instances of the same type (removes the element in case the accumulation result is `0`) template struct expr_consolidate_impl, power, Rest...>> { static constexpr ratio r = power::exponent + power::exponent; - using type = expr_consolidate_impl, Rest...>>::type; + using type = expr_consolidate_impl, Rest...>>::type; }; template -using expr_consolidate = expr_consolidate_impl::type; +using expr_consolidate = expr_consolidate_impl::type; /** diff --git a/src/core/include/mp-units/framework/quantity_spec.h b/src/core/include/mp-units/framework/quantity_spec.h index 89a35c8f..934aa9b5 100644 --- a/src/core/include/mp-units/framework/quantity_spec.h +++ b/src/core/include/mp-units/framework/quantity_spec.h @@ -1343,22 +1343,19 @@ template }; if constexpr ((NamedQuantitySpec && NamedQuantitySpec) || - get_complexity(MP_UNITS_IS_CONST_EXPR_WORKAROUND(from_kind)) == - get_complexity(MP_UNITS_IS_CONST_EXPR_WORKAROUND(to_kind))) + get_complexity(MP_UNITS_IS_CONST_EXPR_WORKAROUND(from_kind)) == get_complexity(MP_UNITS_IS_CONST_EXPR_WORKAROUND(to_kind))) return convertible_impl(MP_UNITS_IS_CONST_EXPR_WORKAROUND(from_kind), MP_UNITS_IS_CONST_EXPR_WORKAROUND(to_kind)); else if constexpr (get_complexity(MP_UNITS_IS_CONST_EXPR_WORKAROUND(from_kind)) > get_complexity(MP_UNITS_IS_CONST_EXPR_WORKAROUND(to_kind))) - return exploded_kind_result( - convertible_impl(get_kind_tree_root(explode( - MP_UNITS_IS_CONST_EXPR_WORKAROUND(from_kind)) - .quantity), - MP_UNITS_IS_CONST_EXPR_WORKAROUND(to_kind))); + return exploded_kind_result(convertible_impl( + get_kind_tree_root( + explode(MP_UNITS_IS_CONST_EXPR_WORKAROUND(from_kind)).quantity), + MP_UNITS_IS_CONST_EXPR_WORKAROUND(to_kind))); else - return exploded_kind_result( - convertible_impl(MP_UNITS_IS_CONST_EXPR_WORKAROUND(from_kind), - get_kind_tree_root(explode( - MP_UNITS_IS_CONST_EXPR_WORKAROUND(to_kind)) - .quantity))); + return exploded_kind_result(convertible_impl( + MP_UNITS_IS_CONST_EXPR_WORKAROUND(from_kind), + get_kind_tree_root( + explode(MP_UNITS_IS_CONST_EXPR_WORKAROUND(to_kind)).quantity))); } template @@ -1376,12 +1373,10 @@ template else if constexpr (get_complexity(From{}) != get_complexity(To{})) { if constexpr (get_complexity(From{}) > get_complexity(To{})) return convertible_impl( - explode(MP_UNITS_IS_CONST_EXPR_WORKAROUND(from)) - .quantity, + explode(MP_UNITS_IS_CONST_EXPR_WORKAROUND(from)).quantity, MP_UNITS_IS_CONST_EXPR_WORKAROUND(to)); else { - auto res = - explode(MP_UNITS_IS_CONST_EXPR_WORKAROUND(to)); + auto res = explode(MP_UNITS_IS_CONST_EXPR_WORKAROUND(to)); return min(res.result, convertible_impl(MP_UNITS_IS_CONST_EXPR_WORKAROUND(from), res.quantity)); } } @@ -1414,8 +1409,7 @@ template auto eq = explode_to_equation(MP_UNITS_IS_CONST_EXPR_WORKAROUND(to)); return min(eq.result, convertible_impl(res.quantity, eq.equation)); } else - return are_ingredients_convertible(MP_UNITS_IS_CONST_EXPR_WORKAROUND(from), - MP_UNITS_IS_CONST_EXPR_WORKAROUND(to)); + return are_ingredients_convertible(MP_UNITS_IS_CONST_EXPR_WORKAROUND(from), MP_UNITS_IS_CONST_EXPR_WORKAROUND(to)); } else if constexpr (DerivedQuantitySpec) { auto res = explode(MP_UNITS_IS_CONST_EXPR_WORKAROUND(to)); if constexpr (NamedQuantitySpec) @@ -1423,8 +1417,7 @@ template else if constexpr (requires { MP_UNITS_IS_CONST_EXPR_WORKAROUND(from)._equation_; }) return min(res.result, convertible_impl(MP_UNITS_IS_CONST_EXPR_WORKAROUND(from)._equation_, res.quantity)); else - return min(res.result, are_ingredients_convertible(MP_UNITS_IS_CONST_EXPR_WORKAROUND(from), - MP_UNITS_IS_CONST_EXPR_WORKAROUND(to))); + return min(res.result, are_ingredients_convertible(MP_UNITS_IS_CONST_EXPR_WORKAROUND(from), MP_UNITS_IS_CONST_EXPR_WORKAROUND(to))); } // NOLINTEND(bugprone-branch-clone) return no; diff --git a/src/core/include/mp-units/framework/reference.h b/src/core/include/mp-units/framework/reference.h index 7dba6475..5a5f8262 100644 --- a/src/core/include/mp-units/framework/reference.h +++ b/src/core/include/mp-units/framework/reference.h @@ -87,48 +87,46 @@ struct reference { } template - [[nodiscard]] friend consteval detail::reference_t + [[nodiscard]] friend consteval detail::reference_t< MP_UNITS_EXPRESSION_WORKAROUND(Q{} * Q2{}), MP_UNITS_EXPRESSION_WORKAROUND(U{} * U2{})> operator*(reference, reference) { return {}; } template - [[nodiscard]] friend consteval detail::reference_t<(MP_UNITS_EXPRESSION_WORKAROUND(Q{} * get_quantity_spec(U2{}))), - MP_UNITS_EXPRESSION_WORKAROUND(U{} * U2{})> + [[nodiscard]] friend consteval detail::reference_t<( MP_UNITS_EXPRESSION_WORKAROUND(Q{} * get_quantity_spec(U2{}))), + MP_UNITS_EXPRESSION_WORKAROUND(U{} * U2{})> operator*(reference, U2) { return {}; } template - [[nodiscard]] friend consteval detail::reference_t + [[nodiscard]] friend consteval detail::reference_t< MP_UNITS_EXPRESSION_WORKAROUND(get_quantity_spec(U1{}) * Q{}), + MP_UNITS_EXPRESSION_WORKAROUND(U1{} * U{})> operator*(U1, reference) { return {}; } template - [[nodiscard]] friend consteval detail::reference_t + [[nodiscard]] friend consteval detail::reference_t< MP_UNITS_EXPRESSION_WORKAROUND(Q{} / Q2{}), MP_UNITS_EXPRESSION_WORKAROUND(U{} / U2{})> operator/(reference, reference) { return {}; } template - [[nodiscard]] friend consteval detail::reference_t + [[nodiscard]] friend consteval detail::reference_t< MP_UNITS_EXPRESSION_WORKAROUND(Q{} / get_quantity_spec(U2{})), + MP_UNITS_EXPRESSION_WORKAROUND(U{} / U2{})> operator/(reference, U2) { return {}; } template - [[nodiscard]] friend consteval detail::reference_t + [[nodiscard]] friend consteval detail::reference_t< MP_UNITS_EXPRESSION_WORKAROUND(get_quantity_spec(U1{}) / Q{}), + MP_UNITS_EXPRESSION_WORKAROUND(U1{} / U{})> operator/(U1, reference) { return {}; @@ -293,11 +291,10 @@ template } -> Unit; } { - return detail::reference_t{}; + return detail::reference_t< + common_quantity_spec(get_quantity_spec(MP_UNITS_IS_CONST_EXPR_WORKAROUND(r1)), get_quantity_spec(MP_UNITS_IS_CONST_EXPR_WORKAROUND(r2)), + get_quantity_spec(rest)...), + common_unit(get_unit(MP_UNITS_IS_CONST_EXPR_WORKAROUND(r1)), get_unit(MP_UNITS_IS_CONST_EXPR_WORKAROUND(r2)), get_unit(rest)...)>{}; } MP_UNITS_EXPORT_END diff --git a/src/core/include/mp-units/random.h b/src/core/include/mp-units/random.h index 5da89966..05251f3f 100644 --- a/src/core/include/mp-units/random.h +++ b/src/core/include/mp-units/random.h @@ -61,7 +61,7 @@ std::vector bl_qty_to_rep(std::initializer_list& bl) template std::vector fw_bl_pwc(std::initializer_list& bl, UnaryOperation fw) { - using rep = Q::rep; + using rep = Q::rep; std::vector w_bl; w_bl.reserve(bl.size()); for (const Q& qty : bl) { @@ -93,8 +93,8 @@ MP_UNITS_EXPORT_BEGIN template requires std::integral struct uniform_int_distribution : public std::uniform_int_distribution { - using rep = Q::rep; - using base = std::uniform_int_distribution; + using rep = Q::rep; + using base = std::uniform_int_distribution; uniform_int_distribution() : base() {} uniform_int_distribution(const Q& a, const Q& b) : @@ -118,8 +118,8 @@ struct uniform_int_distribution : public std::uniform_int_distribution requires std::floating_point struct uniform_real_distribution : public std::uniform_real_distribution { - using rep = Q::rep; - using base = std::uniform_real_distribution; + using rep = Q::rep; + using base = std::uniform_real_distribution; uniform_real_distribution() : base() {} uniform_real_distribution(const Q& a, const Q& b) : @@ -143,8 +143,8 @@ struct uniform_real_distribution : public std::uniform_real_distribution requires std::integral struct binomial_distribution : public std::binomial_distribution { - using rep = Q::rep; - using base = std::binomial_distribution; + using rep = Q::rep; + using base = std::binomial_distribution; binomial_distribution() : base() {} binomial_distribution(const Q& t, double p) : base(t.numerical_value_ref_in(Q::unit), p) {} @@ -164,8 +164,8 @@ struct binomial_distribution : public std::binomial_distribution requires std::integral struct negative_binomial_distribution : public std::negative_binomial_distribution { - using rep = Q::rep; - using base = std::negative_binomial_distribution; + using rep = Q::rep; + using base = std::negative_binomial_distribution; negative_binomial_distribution() : base() {} negative_binomial_distribution(const Q& k, double p) : base(k.numerical_value_ref_in(Q::unit), p) {} @@ -185,8 +185,8 @@ struct negative_binomial_distribution : public std::negative_binomial_distributi template requires std::integral struct geometric_distribution : public std::geometric_distribution { - using rep = Q::rep; - using base = std::geometric_distribution; + using rep = Q::rep; + using base = std::geometric_distribution; geometric_distribution() : base() {} explicit geometric_distribution(double p) : base(p) {} @@ -204,8 +204,8 @@ struct geometric_distribution : public std::geometric_distribution requires std::integral struct poisson_distribution : public std::poisson_distribution { - using rep = Q::rep; - using base = std::poisson_distribution; + using rep = Q::rep; + using base = std::poisson_distribution; poisson_distribution() : base() {} explicit poisson_distribution(double p) : base(p) {} @@ -223,8 +223,8 @@ struct poisson_distribution : public std::poisson_distribution template requires std::floating_point struct exponential_distribution : public std::exponential_distribution { - using rep = Q::rep; - using base = std::exponential_distribution; + using rep = Q::rep; + using base = std::exponential_distribution; exponential_distribution() : base() {} explicit exponential_distribution(const rep& lambda) : base(lambda) {} @@ -242,8 +242,8 @@ struct exponential_distribution : public std::exponential_distribution requires std::floating_point struct gamma_distribution : public std::gamma_distribution { - using rep = Q::rep; - using base = std::gamma_distribution; + using rep = Q::rep; + using base = std::gamma_distribution; gamma_distribution() : base() {} gamma_distribution(const rep& alpha, const rep& beta) : base(alpha, beta) {} @@ -261,8 +261,8 @@ struct gamma_distribution : public std::gamma_distribution { template requires std::floating_point struct weibull_distribution : public std::weibull_distribution { - using rep = Q::rep; - using base = std::weibull_distribution; + using rep = Q::rep; + using base = std::weibull_distribution; weibull_distribution() : base() {} weibull_distribution(const rep& a, const rep& b) : base(a, b) {} @@ -280,8 +280,8 @@ struct weibull_distribution : public std::weibull_distribution template requires std::floating_point struct extreme_value_distribution : public std::extreme_value_distribution { - using rep = Q::rep; - using base = std::extreme_value_distribution; + using rep = Q::rep; + using base = std::extreme_value_distribution; extreme_value_distribution() : base() {} extreme_value_distribution(const Q& a, const rep& b) : base(a.numerical_value_ref_in(Q::unit), b) {} @@ -301,8 +301,8 @@ struct extreme_value_distribution : public std::extreme_value_distribution requires std::floating_point struct normal_distribution : public std::normal_distribution { - using rep = Q::rep; - using base = std::normal_distribution; + using rep = Q::rep; + using base = std::normal_distribution; normal_distribution() : base() {} normal_distribution(const Q& mean, const Q& stddev) : @@ -326,8 +326,8 @@ struct normal_distribution : public std::normal_distribution { template requires std::floating_point struct lognormal_distribution : public std::lognormal_distribution { - using rep = Q::rep; - using base = std::lognormal_distribution; + using rep = Q::rep; + using base = std::lognormal_distribution; lognormal_distribution() : base() {} lognormal_distribution(const Q& m, const Q& s) : @@ -351,8 +351,8 @@ struct lognormal_distribution : public std::lognormal_distribution requires std::floating_point struct chi_squared_distribution : public std::chi_squared_distribution { - using rep = Q::rep; - using base = std::chi_squared_distribution; + using rep = Q::rep; + using base = std::chi_squared_distribution; chi_squared_distribution() : base() {} explicit chi_squared_distribution(const rep& n) : base(n) {} @@ -370,8 +370,8 @@ struct chi_squared_distribution : public std::chi_squared_distribution requires std::floating_point struct cauchy_distribution : public std::cauchy_distribution { - using rep = Q::rep; - using base = std::cauchy_distribution; + using rep = Q::rep; + using base = std::cauchy_distribution; cauchy_distribution() : base() {} cauchy_distribution(const Q& a, const Q& b) : @@ -395,8 +395,8 @@ struct cauchy_distribution : public std::cauchy_distribution { template requires std::floating_point struct fisher_f_distribution : public std::fisher_f_distribution { - using rep = Q::rep; - using base = std::fisher_f_distribution; + using rep = Q::rep; + using base = std::fisher_f_distribution; fisher_f_distribution() : base() {} fisher_f_distribution(const rep& m, const rep& n) : base(m, n) {} @@ -414,8 +414,8 @@ struct fisher_f_distribution : public std::fisher_f_distribution requires std::floating_point struct student_t_distribution : public std::student_t_distribution { - using rep = Q::rep; - using base = std::student_t_distribution; + using rep = Q::rep; + using base = std::student_t_distribution; student_t_distribution() : base() {} explicit student_t_distribution(const rep& n) : base(n) {} @@ -433,8 +433,8 @@ struct student_t_distribution : public std::student_t_distribution requires std::integral struct discrete_distribution : public std::discrete_distribution { - using rep = Q::rep; - using base = std::discrete_distribution; + using rep = Q::rep; + using base = std::discrete_distribution; discrete_distribution() : base() {} @@ -464,8 +464,8 @@ struct discrete_distribution : public std::discrete_distribution requires std::floating_point class piecewise_constant_distribution : public std::piecewise_constant_distribution { - using rep = Q::rep; - using base = std::piecewise_constant_distribution; + using rep = Q::rep; + using base = std::piecewise_constant_distribution; template piecewise_constant_distribution(const std::vector& i, InputIt first_w) : base(i.cbegin(), i.cend(), first_w) @@ -523,8 +523,8 @@ public: template requires std::floating_point class piecewise_linear_distribution : public std::piecewise_linear_distribution { - using rep = Q::rep; - using base = std::piecewise_linear_distribution; + using rep = Q::rep; + using base = std::piecewise_linear_distribution; template piecewise_linear_distribution(const std::vector& i, InputIt first_w) : base(i.cbegin(), i.cend(), first_w) diff --git a/src/systems/include/mp-units/systems/si/chrono.h b/src/systems/include/mp-units/systems/si/chrono.h index 0ded9689..c3fb9707 100644 --- a/src/systems/include/mp-units/systems/si/chrono.h +++ b/src/systems/include/mp-units/systems/si/chrono.h @@ -137,8 +137,8 @@ template QP> requires is_specialization_of, chrono_point_origin_> [[nodiscard]] constexpr auto to_chrono_time_point(const QP& qp) { - using clock = decltype(QP::absolute_point_origin)::clock; - using rep = QP::rep; + using clock = decltype(QP::absolute_point_origin)::clock; + using rep = QP::rep; using ret_type = std::chrono::time_point>; diff --git a/src/systems/include/mp-units/systems/si/math.h b/src/systems/include/mp-units/systems/si/math.h index 80568e37..c91d0df8 100644 --- a/src/systems/include/mp-units/systems/si/math.h +++ b/src/systems/include/mp-units/systems/si/math.h @@ -87,8 +87,7 @@ template auto R, template auto R, typename Rep> requires requires(Rep v) { asin(v); } || requires(Rep v) { std::asin(v); } -[[nodiscard]] inline QuantityOf auto asin( - const quantity& q) noexcept +[[nodiscard]] inline QuantityOf auto asin(const quantity& q) noexcept { using std::asin; if constexpr (!treat_as_floating_point) { @@ -102,8 +101,7 @@ template auto R, typename Rep> template auto R, typename Rep> requires requires(Rep v) { acos(v); } || requires(Rep v) { std::acos(v); } -[[nodiscard]] inline QuantityOf auto acos( - const quantity& q) noexcept +[[nodiscard]] inline QuantityOf auto acos(const quantity& q) noexcept { using std::acos; if constexpr (!treat_as_floating_point) { @@ -117,8 +115,7 @@ template auto R, typename Rep> template auto R, typename Rep> requires requires(Rep v) { atan(v); } || requires(Rep v) { std::atan(v); } -[[nodiscard]] inline QuantityOf auto atan( - const quantity& q) noexcept +[[nodiscard]] inline QuantityOf auto atan(const quantity& q) noexcept { using std::atan; if constexpr (!treat_as_floating_point) { diff --git a/test/runtime/CMakeLists.txt b/test/runtime/CMakeLists.txt index d79ed54b..70e13650 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 9f3b1901..2785041f 100644 --- a/test/static/chrono_test.cpp +++ b/test/static/chrono_test.cpp @@ -57,41 +57,43 @@ 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>); -static_assert(!std::constructible_from, std::chrono::seconds>); -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, sys_seconds>); + !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::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::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); @@ -107,13 +109,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); diff --git a/test/static/concepts_test.cpp b/test/static/concepts_test.cpp index c67ff710..9564ed22 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 4fb2537b..8b328557 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>>); +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>>); // 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,46 +99,47 @@ static_assert(creates_quantity, percent>); // construction from a quantity // min_impl -> 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>>); +static_assert(std::convertible_to>, quantity<(si::metre), min_impl>>); -static_assert(!std::constructible_from>, - quantity>>); // narrowing conversion -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>>); // T -> 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>>); +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>); // narrowing conversion -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>>); // min_impl -> T -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), 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>>); // narrowing conversion -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>>); // arithmetic operators diff --git a/test/static/dimension_test.cpp b/test/static/dimension_test.cpp index 8064831e..f1d64590 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 dimension_one; +using dimension_one_ = struct mp_units::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 f04e9c1a..50dfb67e 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) == sizeof(double)); -static_assert(sizeof(quantity_point) == sizeof(short)); -static_assert(sizeof(quantity_point) == sizeof(short)); +static_assert(sizeof(quantity_point<(si::metre), mean_sea_level>) == 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)); template typename QP> concept invalid_types = requires { @@ -188,15 +188,15 @@ static_assert(invalid_types); template typename QP> concept valid_types = requires { - typename QP; - typename QP; - typename QP; - typename QP; - typename QP; - typename QP; - typename QP, int>; - typename QP>, int>; - typename QP, int>; + 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>; }; 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,51 +235,53 @@ 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]); @@ -288,10 +290,11 @@ 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::absolute_point_origin, + is_of_type::point_origin, + struct si::absolute_zero>); +static_assert( + is_of_type::absolute_point_origin, struct si::absolute_zero>); static_assert(quantity_point::reference == @@ -301,19 +304,20 @@ 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::absolute_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(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]); @@ -322,10 +326,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>); @@ -333,18 +337,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>); //////////////////////////// @@ -371,11 +375,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>); @@ -396,135 +400,135 @@ static_assert(!std::convertible_to, quantity>); -static_assert(!std::convertible_to, quantity_point>); +static_assert(std::constructible_from, 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>); // different dimensions -static_assert(!std::constructible_from, quantity>); -static_assert(!std::convertible_to, quantity_point>); +static_assert(!std::constructible_from, quantity<(si::second)>>); +static_assert(!std::convertible_to, quantity_point<(isq::height[m])>>); // convertible but different quantity_specs -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::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])>>); // quantity_specs with common_quantity_spec -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::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])>>); // non-convertible quantity_specs -static_assert(!std::constructible_from, quantity>); -static_assert(!std::convertible_to, quantity_point>); +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])>>); #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>); -static_assert(!std::convertible_to, quantity_point>); +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>); // quantity_specs with common_quantity_spec -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::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>>); // different dimensions -static_assert(!std::constructible_from, quantity>); -static_assert(!std::convertible_to, quantity_point>); +static_assert(!std::constructible_from, quantity<(si::second)>>); +static_assert(!std::convertible_to, quantity_point<(isq::height[m]), mean_sea_level>>); // non-convertible quantity_specs -static_assert(!std::constructible_from, quantity>); -static_assert(!std::convertible_to, quantity_point>); +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>>); // not-compatible origin -static_assert(!std::constructible_from, quantity>); -static_assert(!std::convertible_to, quantity_point>); +static_assert(!std::constructible_from, quantity<(isq::length[m])>>); +static_assert(!std::convertible_to, quantity_point<((si::metre)), mean_sea_level>>); #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<(si::second), chrono_point_origin>>); -static_assert(!std::constructible_from>, +static_assert(!std::constructible_from>, std::chrono::seconds>); static_assert(!std::convertible_to>>); + quantity_point<(isq::time[s]), chrono_point_origin>>); static_assert( - !std::constructible_from>, + !std::constructible_from>, std::chrono::seconds>); static_assert( !std::convertible_to>>); + quantity_point<(isq::period_duration[s]), chrono_point_origin>>); #endif @@ -533,140 +537,146 @@ static_assert( /////////////////////////////////////// // implicit origin -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)>>); +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>); + std::constructible_from, quantity_point<(isq::speed[m / s])>>); +static_assert( + std::convertible_to, quantity_point<(isq::length[m]) / isq::time[s]>>); -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>); -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>); // convertible but different quantity_specs -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<(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])>>); // quantity_specs with common_quantity_spec -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<(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])>>); // non-convertible quantity_specs -static_assert(!std::constructible_from, quantity_point>); -static_assert(!std::convertible_to, quantity_point>); +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>); // mixed origins -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)>>); +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])>>); // same explicit origins static_assert( - std::constructible_from, quantity_point>); + std::constructible_from, quantity_point<(si::metre), mean_sea_level>>); static_assert( - std::convertible_to, quantity_point>); + std::convertible_to, quantity_point<(si::metre), mean_sea_level>>); -static_assert(std::constructible_from, - quantity_point>); -static_assert( - 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>); -static_assert( - 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[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<(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>); + std::convertible_to, quantity_point<(si::metre), mean_sea_level>>); +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>); + std::convertible_to, quantity_point<(isq::height[m]), mean_sea_level>>); -static_assert(std::constructible_from, +static_assert(std::constructible_from, quantity_point>); static_assert(std::convertible_to, - quantity_point>); + quantity_point<(isq::height[m]), mean_sea_level>>); static_assert( - std::constructible_from, quantity_point>); -static_assert(std::convertible_to, quantity_point>); + 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>>); static_assert( - std::constructible_from, quantity_point>); + std::constructible_from, quantity_point<(isq::height[m]), ground_level>>); static_assert( - std::convertible_to, quantity_point>); - -static_assert(std::constructible_from, - quantity_point>); -static_assert( - std::convertible_to, quantity_point>); + std::convertible_to, quantity_point<(si::metre), ground_level>>); static_assert( - std::constructible_from, quantity_point>); + std::constructible_from, quantity_point<(si::metre), ground_level>>); static_assert( - std::convertible_to, quantity_point>); + std::convertible_to, quantity_point<(isq::height[m]), ground_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, +static_assert(std::constructible_from, quantity_point>); static_assert( - std::convertible_to, quantity_point>); + std::convertible_to, quantity_point<(isq::height[m]), ground_level>>); static_assert( - std::constructible_from, quantity_point>); -static_assert(std::convertible_to, quantity_point>); + std::constructible_from, quantity_point<(si::metre), ground_level>>); +static_assert( + std::convertible_to, quantity_point<(si::metre), mean_sea_level>>); static_assert( - std::constructible_from, quantity_point>); -static_assert(std::convertible_to, quantity_point>); + std::constructible_from, quantity_point<(si::metre), mean_sea_level>>); +static_assert( + std::convertible_to, quantity_point<(si::metre), ground_level>>); static_assert( - std::constructible_from, quantity_point>); + std::constructible_from, quantity_point<(si::metre), other_ground_level>>); static_assert( - std::convertible_to, quantity_point>); + std::convertible_to, quantity_point<(si::metre), ground_level>>); static_assert( std::constructible_from, quantity_point>); @@ -682,121 +692,121 @@ static_assert( 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]), zeroth_length>>); +static_assert(std::convertible_to, + quantity_point<(isq::length[m]), zeroth_length>>); // quantity_specs with common_quantity_spec -static_assert(!std::constructible_from, - quantity_point>); -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::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>>); // different dimensions -static_assert( - !std::constructible_from, quantity_point>); -static_assert( - !std::convertible_to, quantity_point>); +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>>); // non-convertible quantity_specs static_assert(!std::constructible_from, - quantity_point>); -static_assert(!std::convertible_to, + quantity_point<(isq::height[m]), mean_sea_level>>); +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>); -static_assert(std::convertible_to, - quantity_point>); +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>>); // truncating double -> int not allowed -static_assert(!std::constructible_from, - quantity_point>); -static_assert(!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, int>>); // kilometre -> metre OK -static_assert(std::constructible_from, - quantity_point>); -static_assert(std::convertible_to, - quantity_point>); +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>>); // truncating metre -> kilometre not allowed -static_assert(!std::constructible_from, - quantity_point>); -static_assert(!std::convertible_to, - quantity_point>); +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>>); // converting to double always OK -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[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>>); // same but not a default origin -static_assert(std::constructible_from, - quantity_point>); -static_assert( - 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::constructible_from, quantity_point>); -static_assert( - std::convertible_to, quantity_point>); + std::convertible_to, quantity_point<(si::metre), mean_sea_level>>); +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>); + std::convertible_to, quantity_point<(isq::height[m]), mean_sea_level>>); -static_assert(std::constructible_from, +static_assert(std::constructible_from, quantity_point>); static_assert(std::convertible_to, - quantity_point>); + quantity_point<(isq::height[m]), mean_sea_level>>); static_assert(!std::constructible_from, - quantity_point>); -static_assert(!std::convertible_to, + quantity_point<(isq::height[m]), mean_sea_level>>); +static_assert(!std::convertible_to, quantity_point>); // different origins -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<(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>>); #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::constructible_from>, sys_seconds>); -static_assert( - !std::convertible_to>>); + !std::convertible_to>>); #endif @@ -825,17 +835,19 @@ 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(ground_level + 42 * m).quantity_from(mean_sea_level) == +static_assert(quantity_point<(isq::height[m]), mean_sea_level>(ground_level + 42 * m).quantity_from(mean_sea_level) == 84 * m); -static_assert(quantity_point(tower_peak + 42 * m).quantity_from(mean_sea_level) == +static_assert(quantity_point<(isq::height[m]), mean_sea_level>(tower_peak + 42 * m).quantity_from(mean_sea_level) == 126 * m); -static_assert(quantity_point(mean_sea_level + 84 * m).quantity_from(ground_level) == +static_assert(quantity_point<(isq::height[m]), ground_level>(mean_sea_level + 84 * m).quantity_from(ground_level) == 42 * m); -static_assert(quantity_point(tower_peak + 42 * m).quantity_from(ground_level) == 84 * m); +static_assert(quantity_point<(isq::height[m]), ground_level>(tower_peak + 42 * m).quantity_from(ground_level) == + 84 * 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(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((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); @@ -850,7 +862,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>); + quantity_point<(isq::height[m]), mean_sea_level, int>>); /////////////////////////////////// @@ -877,8 +889,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(2000 * m).in(km); }; // truncating conversion - requires !requires { QP(2 * m).in(s); }; // invalid unit + 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 }; static_assert(invalid_unit_conversion); @@ -926,13 +938,12 @@ static_assert(quantity_point{sys_seconds{24h}}.quantity_spec == kind_of typename QP> concept invalid_compound_assignments = requires() { // truncating not allowed - 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]; }; + 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]); }; // only quantities can be added or subtracted - requires !requires(QP l) { l += 2; }; - requires !requires(QP l) { l -= 2; }; + 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; }; // no unit constants - requires !requires(QP l) { l += m; }; - requires !requires(QP l) { l -= m; }; + 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; }; }; static_assert(invalid_compound_assignments); @@ -1132,12 +1143,12 @@ concept invalid_binary_operations = requires { requires !requires { Origin - Origin; }; // unit constants - requires !requires { QP(1) + m; }; - requires !requires { QP(1) - m; }; + requires !requires { QP<(si::metre), mean_sea_level, int>(1) + m; }; + requires !requires { QP<(si::metre), mean_sea_level, int>(1) - m; }; requires !requires { Origin + m; }; requires !requires { Origin - m; }; - requires !requires { m + QP(1); }; - requires !requires { m - QP(1); }; + 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 + Origin; }; requires !requires { m - Origin; }; }; @@ -1174,36 +1185,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>); + is_of_type<1 * m + (mean_sea_level + isq::height(1 * m)), quantity_point<(isq::height[m]), mean_sea_level, int>>); static_assert( - is_of_type<1 * m + (mean_sea_level + isq::height(1 * km)), quantity_point>); + is_of_type<1 * m + (mean_sea_level + isq::height(1 * km)), quantity_point<(isq::height[m]), mean_sea_level, int>>); static_assert( - is_of_type<1 * km + (mean_sea_level + isq::height(1 * m)), quantity_point>); + is_of_type<1 * km + (mean_sea_level + isq::height(1 * m)), quantity_point<(isq::height[m]), mean_sea_level, int>>); 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<(isq::height[m]), mean_sea_level, int>>); static_assert(is_of_type>); + quantity_point<(isq::height[m]), mean_sea_level, int>>); static_assert(is_of_type>); + quantity_point<(isq::height[m]), mean_sea_level, int>>); 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>); + is_of_type<(mean_sea_level + 1 * m) - isq::height(1 * m), quantity_point<(isq::height[m]), mean_sea_level, int>>); static_assert( - is_of_type<(mean_sea_level + 1 * m) - isq::height(1 * km), quantity_point>); + is_of_type<(mean_sea_level + 1 * m) - isq::height(1 * km), quantity_point<(isq::height[m]), mean_sea_level, int>>); static_assert( - is_of_type<(mean_sea_level + 1 * km) - isq::height(1 * m), quantity_point>); + is_of_type<(mean_sea_level + 1 * km) - isq::height(1 * m), quantity_point<(isq::height[m]), mean_sea_level, int>>); static_assert( - is_of_type<(mean_sea_level + isq::height(1 * m)) - 1 * m, quantity_point>); + is_of_type<(mean_sea_level + isq::height(1 * m)) - 1 * m, quantity_point<(isq::height[m]), mean_sea_level, int>>); static_assert( - is_of_type<(mean_sea_level + isq::height(1 * m)) - 1 * km, quantity_point>); + is_of_type<(mean_sea_level + isq::height(1 * m)) - 1 * km, quantity_point<(isq::height[m]), mean_sea_level, int>>); static_assert( - is_of_type<(mean_sea_level + isq::height(1 * km)) - 1 * m, quantity_point>); + is_of_type<(mean_sea_level + isq::height(1 * km)) - 1 * m, quantity_point<(isq::height[m]), mean_sea_level, int>>); static_assert(is_of_type<(mean_sea_level + isq::height(1 * m)) - isq::height(1 * m), - quantity_point>); + quantity_point<(isq::height[m]), mean_sea_level, int>>); static_assert(is_of_type<(mean_sea_level + isq::height(1 * m)) - isq::height(1 * km), - quantity_point>); + quantity_point<(isq::height[m]), mean_sea_level, int>>); static_assert(is_of_type<(mean_sea_level + isq::height(1 * km)) - isq::height(1 * m), - quantity_point>); + quantity_point<(isq::height[m]), mean_sea_level, int>>); static_assert(is_of_type>); static_assert(is_of_type, mean_sea_level, int>>); @@ -1254,39 +1265,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>); + is_of_type<(mean_sea_level + 1 * m) - (mean_sea_level + isq::height(1 * m)), quantity<(isq::height[m]), int>>); static_assert( - is_of_type<(mean_sea_level + 1 * m) - (mean_sea_level + isq::height(1 * km)), quantity>); + is_of_type<(mean_sea_level + 1 * m) - (mean_sea_level + isq::height(1 * km)), quantity<(isq::height[m]), int>>); static_assert( - is_of_type<(mean_sea_level + 1 * km) - (mean_sea_level + isq::height(1 * m)), quantity>); + is_of_type<(mean_sea_level + 1 * km) - (mean_sea_level + isq::height(1 * m)), quantity<(isq::height[m]), int>>); static_assert( - is_of_type<(mean_sea_level + isq::height(1 * m)) - (mean_sea_level + 1 * m), quantity>); + is_of_type<(mean_sea_level + isq::height(1 * m)) - (mean_sea_level + 1 * m), quantity<(isq::height[m]), int>>); static_assert( - is_of_type<(mean_sea_level + isq::height(1 * m)) - (mean_sea_level + 1 * km), quantity>); + is_of_type<(mean_sea_level + isq::height(1 * m)) - (mean_sea_level + 1 * km), quantity<(isq::height[m]), int>>); static_assert( - is_of_type<(mean_sea_level + isq::height(1 * km)) - (mean_sea_level + 1 * m), quantity>); + is_of_type<(mean_sea_level + isq::height(1 * km)) - (mean_sea_level + 1 * m), quantity<(isq::height[m]), int>>); static_assert(is_of_type<(mean_sea_level + isq::height(1 * m)) - (mean_sea_level + isq::height(1 * m)), - quantity>); + quantity<(isq::height[m]), int>>); static_assert(is_of_type<(mean_sea_level + isq::height(1 * m)) - (mean_sea_level + isq::height(1 * km)), - quantity>); + quantity<(isq::height[m]), int>>); static_assert(is_of_type<(mean_sea_level + isq::height(1 * km)) - (mean_sea_level + isq::height(1 * m)), - quantity>); + quantity<(isq::height[m]), int>>); 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>); -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<(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>); static_assert(is_of_type, int>>); @@ -1298,32 +1309,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>); -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<(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<(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<(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>); -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>); -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>); +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>>); // check for integral types promotion @@ -1643,8 +1654,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]) + quantity_point{zero_Hz + 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((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() == @@ -1718,7 +1729,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(quantity_point{2000.0 * m / (3600.0 * s)}).quantity_from_zero().numerical_value_in(km / h) == 2); + value_cast<(km / h)>(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 ee4e86a8..ed4cb359 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 dimensionless; -using dim_one_ = struct dimension_one; +using dimensionless_ = struct mp_units::dimensionless; +using dim_one_ = struct mp_units::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 89f169bb..44ee65ad 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,45 +163,46 @@ static_assert(std::convertible_to>); /////////////////////////////////////// // conversion only between convertible quantities -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>); +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])>>); // conversion between different quantities not allowed -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<(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])>>); // 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::convertible_to, - quantity>); // truncating metre -> kilometre not allowed + 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 // converting to double always OK -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<(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])>>); /////////////////////// // obtaining a number @@ -219,16 +220,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>); /////////////////////////////////// @@ -318,9 +319,9 @@ struct derived_quantity : quantity { R::operator=(t); return *this; } - constexpr derived_quantity& operator=(R&& t) + constexpr derived_quantity& operator=(R&& other) { - R::operator=(std::move(t)); + R::operator=(std::move(other)); return *this; } // NOLINTBEGIN(google-explicit-constructor, hicpp-explicit-conversions) @@ -331,9 +332,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 auto get_length_derived_quantity() noexcept +constexpr QuantityOf<(isq::length)> auto get_length_derived_quantity() noexcept { derived_quantity, "NTTP type description"> dist{}; dist += 1 * m; @@ -362,7 +363,8 @@ static_assert(quantity{123}.quantity_spec == kind_of); #if MP_UNITS_HOSTED using namespace std::chrono_literals; static_assert(std::is_same_v); -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(quantity{24h}.unit == si::hour); static_assert(quantity{24h}.quantity_spec == kind_of); #endif @@ -461,10 +463,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> @@ -850,27 +852,30 @@ static_assert(2 * one / (1 * m) == 2 / (1 * m)); // equality operators /////////////////////// -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<(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], int>>); + 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>>); template concept no_crossdimensional_equality = requires { requires !requires { 1 * s == 1 * M; }; requires !requires { 1 * s != 1 * M; }; }; -static_assert(no_crossdimensional_equality); +static_assert(no_crossdimensional_equality<(si::metre)>); // same type static_assert(123 * m == 123 * m); @@ -923,7 +928,7 @@ concept no_crossdimensional_ordering = requires { requires !requires { 1 * s <= 1 * M; }; requires !requires { 1 * s >= 1 * M; }; }; -static_assert(no_crossdimensional_ordering); +static_assert(no_crossdimensional_ordering<(si::metre)>); // same type static_assert(123 * m < 321 * m); @@ -1037,34 +1042,35 @@ 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 65abe0bb..46026702 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 dimensionless; -using one_ = struct one; +using dimensionless_ = struct mp_units::dimensionless; +using one_ = struct mp_units::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); +static_assert(invalid_nu_unit<(nu::time), second>); 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 4f306fd2..d52a8edc 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 ba7ecb4c..c16ea66a 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 one; -using percent_ = struct percent; +using one_ = struct mp_units::one; +using percent_ = struct mp_units::percent; // base dimensions // clang-format off