diff --git a/src/core/include/units/dimension.h b/src/core/include/units/dimension.h index f2ff1ecb..22f3aeac 100644 --- a/src/core/include/units/dimension.h +++ b/src/core/include/units/dimension.h @@ -212,7 +212,7 @@ struct derived_dimension_impl : detail::expr_fractions, Ds.. template struct derived_dimension : detail::derived_dimension_impl { template - requires valid_unit_for_dimension || (sizeof...(Ds) == 0 && convertible(U{}, one)) + requires valid_unit_for_dimension || (sizeof...(Ds) == 0 && interconvertible(U{}, one)) [[nodiscard]] constexpr auto operator[](this const Self, U) { return reference{}; @@ -227,7 +227,7 @@ struct derived_dimension; template struct derived_dimension : detail::derived_dimension_impl { template - requires valid_unit_for_dimension || (sizeof...(Ds) == 0 && convertible(U{}, one)) + requires valid_unit_for_dimension || (sizeof...(Ds) == 0 && interconvertible(U{}, one)) [[nodiscard]] constexpr auto operator[](U) const { return reference{}; @@ -238,7 +238,7 @@ template struct derived_dimension : D { template requires valid_unit_for_dimension || - (convertible(derived_dimension{}, derived_dimension<>{}) && convertible(U{}, one)) + (interconvertible(derived_dimension{}, derived_dimension<>{}) && interconvertible(U{}, one)) [[nodiscard]] constexpr auto operator[](U) const { return reference{}; @@ -325,7 +325,7 @@ template } template -[[nodiscard]] consteval bool convertible(D1, D2) +[[nodiscard]] consteval bool interconvertible(D1, D2) { return std::derived_from || std::derived_from; } @@ -383,7 +383,7 @@ concept associated_unit = Unit && requires(U u) { get_dimension_for_impl(get_ } template - requires requires { detail::get_dimension_for(U); } && (convertible(Dim, detail::get_dimension_for(U))) + requires requires { detail::get_dimension_for(U); } && (interconvertible(Dim, detail::get_dimension_for(U))) inline constexpr bool is_valid_unit_for_dimension = true; } // namespace detail @@ -402,7 +402,7 @@ namespace std { * the two provided. */ template - requires(units::convertible(D1{}, D2{})) + requires(units::interconvertible(D1{}, D2{})) struct common_type { using type = ::units::conditional, std::remove_const_t>, std::remove_const_t, std::remove_const_t>; diff --git a/src/core/include/units/quantity.h b/src/core/include/units/quantity.h index bb2f2209..1d4c65b4 100644 --- a/src/core/include/units/quantity.h +++ b/src/core/include/units/quantity.h @@ -70,7 +70,7 @@ concept harmonic_ = // exposition only template concept quantity_convertible_to_ = // exposition only Quantity && Quantity && - convertible(QFrom::reference, QTo::reference) && scalable_with_ && + interconvertible(QFrom::reference, QTo::reference) && scalable_with_ && (floating_point_ || (!floating_point_ && harmonic_)); template @@ -470,7 +470,7 @@ explicit quantity(Q) -> quantity::dimension, q // non-member binary operators template - requires(convertible(Q1::reference, Q2::reference)) && + requires(interconvertible(Q1::reference, Q2::reference)) && quantity_value_for_, typename Q1::rep, typename Q2::rep> [[nodiscard]] constexpr Quantity auto operator+(const Q1& lhs, const Q2& rhs) { @@ -480,7 +480,7 @@ template } template - requires(convertible(Q1::reference, Q2::reference)) && + requires(interconvertible(Q1::reference, Q2::reference)) && quantity_value_for_, typename Q1::rep, typename Q2::rep> [[nodiscard]] constexpr Quantity auto operator-(const Q1& lhs, const Q2& rhs) { @@ -506,7 +506,7 @@ template template requires(!floating_point_) && (!floating_point_) && - (convertible(Q1::reference, Q2::reference) || quantity_of) && + (interconvertible(Q1::reference, Q2::reference) || quantity_of) && quantity_value_for_, typename Q1::rep, typename Q2::rep> [[nodiscard]] constexpr Quantity auto operator%(const Q1& lhs, const Q2& rhs) { @@ -517,7 +517,7 @@ template } template - requires(convertible(Q1::reference, Q2::reference)) && + requires(interconvertible(Q1::reference, Q2::reference)) && std::three_way_comparable_with [[nodiscard]] constexpr auto operator<=>(const Q1& lhs, const Q2& rhs) { @@ -526,7 +526,7 @@ template } template - requires(convertible(Q1::reference, Q2::reference)) && + requires(interconvertible(Q1::reference, Q2::reference)) && std::equality_comparable_with [[nodiscard]] constexpr bool operator==(const Q1& lhs, const Q2& rhs) { diff --git a/src/core/include/units/quantity_cast.h b/src/core/include/units/quantity_cast.h index ee98058d..836c37bc 100644 --- a/src/core/include/units/quantity_cast.h +++ b/src/core/include/units/quantity_cast.h @@ -85,7 +85,7 @@ struct cast_traits { * @tparam To a target quantity type to cast to */ template Rep> - requires(convertible(To::reference, R)) + requires(interconvertible(To::reference, R)) [[nodiscard]] constexpr auto quantity_cast(const quantity& q) { if constexpr (R.unit == To::unit) { @@ -122,7 +122,7 @@ template Rep> * @tparam ToU a unit type to use for a target quantity */ template - requires(convertible(ToR, R)) + requires(interconvertible(ToR, R)) [[nodiscard]] constexpr auto quantity_cast(const quantity& q) { return quantity_cast>(q); @@ -142,7 +142,7 @@ template * @tparam ToD a dimension type to use for a target quantity */ template - requires(convertible(ToD, R.dimension)) + requires(interconvertible(ToD, R.dimension)) [[nodiscard]] constexpr auto quantity_cast(const quantity& q) { constexpr reference::unit> r; @@ -162,7 +162,7 @@ template * @tparam ToU a unit type to use for a target quantity */ template - requires(convertible(ToU, R.unit)) + requires(interconvertible(ToU, R.unit)) [[nodiscard]] constexpr auto quantity_cast(const quantity& q) { constexpr reference::dimension, ToU> r; diff --git a/src/core/include/units/reference.h b/src/core/include/units/reference.h index cc312c47..ed8d478d 100644 --- a/src/core/include/units/reference.h +++ b/src/core/include/units/reference.h @@ -102,9 +102,9 @@ template void /*Use `q * (1 * r)` rather than `q * r`.*/ operator*(Quantity auto, Reference auto) = delete; template -[[nodiscard]] consteval bool convertible(R1, R2) +[[nodiscard]] consteval bool interconvertible(R1, R2) { - return convertible(R1::dimension, R2::dimension) && convertible(R1::unit, R2::unit); + return interconvertible(R1::dimension, R2::dimension) && interconvertible(R1::unit, R2::unit); } @@ -115,7 +115,7 @@ struct system_reference { static constexpr auto coherent_unit = CoU; template - requires(convertible(coherent_unit, U{})) + requires(interconvertible(coherent_unit, U{})) [[nodiscard]] constexpr reference operator[](U) const { return {}; diff --git a/src/core/include/units/unit.h b/src/core/include/units/unit.h index 03eebcfe..6001a8ec 100644 --- a/src/core/include/units/unit.h +++ b/src/core/include/units/unit.h @@ -531,7 +531,7 @@ template // Convertible template -[[nodiscard]] consteval bool convertible(Lhs lhs, Rhs rhs) +[[nodiscard]] consteval bool interconvertible(Lhs lhs, Rhs rhs) { auto canonical_lhs = detail::get_canonical_unit(lhs); auto canonical_rhs = detail::get_canonical_unit(rhs); @@ -827,7 +827,7 @@ template namespace std { template - requires(units::convertible(U1{}, U2{})) + requires(units::interconvertible(U1{}, U2{})) struct common_type { using type = std::remove_const_t; }; diff --git a/test/unit_test/static/dimension_test.cpp b/test/unit_test/static/dimension_test.cpp index f45e2dbd..c4e46edf 100644 --- a/test/unit_test/static/dimension_test.cpp +++ b/test/unit_test/static/dimension_test.cpp @@ -171,14 +171,14 @@ static_assert(speed == speed); static_assert(length / length == dimension_one); static_assert(1 / time != frequency); -static_assert(convertible(1 / time, frequency)); +static_assert(interconvertible(1 / time, frequency)); static_assert(1 / frequency == time); static_assert(frequency * time == dimension_one); static_assert(std::is_same_v, frequency_>); static_assert(std::is_same_v, frequency_>); static_assert(length * length != area); -static_assert(convertible(length * length, area)); +static_assert(interconvertible(length * length, area)); static_assert(length * length != volume); static_assert(area / length == length); static_assert(std::is_same_v, area_>); @@ -212,7 +212,7 @@ static_assert(acceleration / speed != frequency); // comparison of convertible named dimensions static_assert(velocity != speed); -static_assert(convertible(speed, velocity)); +static_assert(interconvertible(speed, velocity)); static_assert(std::is_same_v, velocity_>); static_assert(std::is_same_v, velocity_>); @@ -220,16 +220,16 @@ static_assert(std::is_same_v>>>); static_assert(is_of_type>>>); static_assert(mass * acceleration == acceleration * mass); -static_assert(convertible(mass * acceleration, acceleration* mass)); +static_assert(interconvertible(mass * acceleration, acceleration* mass)); // comparisons of equivalent but not convertible dimensions static_assert(energy != torque); -static_assert(!convertible(energy, torque)); +static_assert(!interconvertible(energy, torque)); static_assert(force * length != energy); static_assert(force * length != torque); -static_assert(convertible(force * length, energy)); -static_assert(convertible(force * length, torque)); +static_assert(interconvertible(force * length, energy)); +static_assert(interconvertible(force * length, torque)); template concept no_common_type = requires { requires !requires { typename std::common_type_t; }; @@ -238,28 +238,28 @@ concept no_common_type = requires { static_assert(no_common_type); static_assert(frequency != action); -static_assert(!convertible(frequency, action)); +static_assert(!interconvertible(frequency, action)); static_assert(no_common_type); // dimension_one -static_assert(convertible(power / power, efficiency)); +static_assert(interconvertible(power / power, efficiency)); static_assert(power / power != efficiency); static_assert(dimension_one != efficiency); -static_assert(!convertible(efficiency, strain)); +static_assert(!interconvertible(efficiency, strain)); static_assert(efficiency != strain); static_assert(stress / stress != strain); static_assert(stress / stress != efficiency); -static_assert(convertible(stress / stress, strain)); -static_assert(convertible(stress / stress, efficiency)); +static_assert(interconvertible(stress / stress, strain)); +static_assert(interconvertible(stress / stress, efficiency)); // comparison of not equivalent dimensions static_assert(length != time); -static_assert(!convertible(length, time)); +static_assert(!interconvertible(length, time)); static_assert(acceleration != speed); -static_assert(!convertible(acceleration, speed)); +static_assert(!interconvertible(acceleration, speed)); // power static_assert(is_of_type(length), derived_dimension>>); diff --git a/test/unit_test/static/unit_test.cpp b/test/unit_test/static/unit_test.cpp index 0c56ffee..cb1c2ddd 100644 --- a/test/unit_test/static/unit_test.cpp +++ b/test/unit_test/static/unit_test.cpp @@ -118,15 +118,15 @@ static_assert(!NamedUnit); static_assert(is_of_type); static_assert(is_of_type); static_assert(get_canonical_unit(metre).mag == mag<1>); -static_assert(convertible(metre, metre)); -static_assert(!convertible(metre, second)); +static_assert(interconvertible(metre, metre)); +static_assert(!interconvertible(metre, second)); static_assert(metre == metre); static_assert(metre != second); static_assert(is_of_type); static_assert(is_of_type); static_assert(get_canonical_unit(degree_Celsius).mag == mag<1>); -static_assert(convertible(degree_Celsius, kelvin)); +static_assert(interconvertible(degree_Celsius, kelvin)); static_assert(degree_Celsius == kelvin); static_assert(is_of_type); @@ -136,28 +136,28 @@ static_assert(get_canonical_unit(radian).mag == mag<1>); static_assert(is_of_type); static_assert(is_of_type); static_assert(get_canonical_unit(degree).mag == mag_pi / mag<180>); -static_assert(convertible(radian, degree)); +static_assert(interconvertible(radian, degree)); static_assert(radian != degree); static_assert(is_of_type); static_assert(is_of_type); static_assert(get_canonical_unit(steradian).mag == mag<1>); -static_assert(convertible(radian, steradian)); // !!! -static_assert(radian == steradian); // !!! +static_assert(interconvertible(radian, steradian)); // !!! +static_assert(radian == steradian); // !!! static_assert(is_of_type); static_assert(is_of_type); static_assert(get_canonical_unit(minute).mag == mag<60>); -static_assert(convertible(minute, second)); +static_assert(interconvertible(minute, second)); static_assert(minute != second); static_assert(is_of_type); static_assert(is_of_type); static_assert(get_canonical_unit(hour).mag == mag<3600>); -static_assert(convertible(hour, second)); +static_assert(interconvertible(hour, second)); -static_assert(convertible(hour, minute)); -static_assert(convertible(hour, hour)); +static_assert(interconvertible(hour, minute)); +static_assert(interconvertible(hour, hour)); static_assert(hour != second); static_assert(hour != minute); static_assert(hour == hour); @@ -166,14 +166,14 @@ static_assert(is_of_type); static_assert( is_of_type>>>); static_assert(get_canonical_unit(newton).mag == mag<1000>); // !!! (because of kilogram) -static_assert(convertible(newton, newton)); +static_assert(interconvertible(newton, newton)); static_assert(newton == newton); static_assert(is_of_type); static_assert( is_of_type, per>>>); static_assert(get_canonical_unit(joule).mag == mag<1000>); // !!! (because of kilogram) -static_assert(convertible(joule, joule)); +static_assert(interconvertible(joule, joule)); static_assert(joule == joule); static_assert(joule != newton); @@ -183,7 +183,7 @@ static_assert(is_of_type); static_assert(is_of_type); static_assert(is_of_type); static_assert(get_canonical_unit(kilometre).mag == mag<1000>); -static_assert(convertible(kilometre, metre)); +static_assert(interconvertible(kilometre, metre)); static_assert(kilometre != metre); static_assert(kilometre.symbol == "km"); @@ -191,7 +191,7 @@ static_assert(is_of_type); static_assert(is_of_type, per>>>); static_assert(get_canonical_unit(kilojoule).mag == mag<1'000'000>); -static_assert(convertible(kilojoule, joule)); +static_assert(interconvertible(kilojoule, joule)); static_assert(kilojoule != joule); static_assert(kilojoule.symbol == "kJ"); @@ -407,30 +407,30 @@ static_assert(si::kilo * si::milli == si::deca * si::deci == kilometre); static_assert(mag<1000> * metre == si::kilo); static_assert(mag<1000> * metre == kilometre); -static_assert(convertible(si::kilo, kilometre)); -static_assert(convertible(mag<1000> * metre, si::kilo)); -static_assert(convertible(mag<1000> * metre, kilometre)); +static_assert(interconvertible(si::kilo, kilometre)); +static_assert(interconvertible(mag<1000> * metre, si::kilo)); +static_assert(interconvertible(mag<1000> * metre, kilometre)); static_assert(metre != kilometre); -static_assert(convertible(metre, kilometre)); +static_assert(interconvertible(metre, kilometre)); static_assert(mag<100> * metre != kilometre); -static_assert(convertible(mag<100> * metre, kilometre)); +static_assert(interconvertible(mag<100> * metre, kilometre)); static_assert(si::milli != kilometre); -static_assert(convertible(si::milli, kilometre)); +static_assert(interconvertible(si::milli, kilometre)); // comparisons of non-convertible units static_assert(metre != metre * metre); -static_assert(!convertible(metre, metre* metre)); +static_assert(!interconvertible(metre, metre* metre)); // one static_assert(is_of_type);