refactor: UnitCompatibleWith is now exposition-only

This commit is contained in:
Mateusz Pusz
2024-06-30 12:06:26 +02:00
parent ba8681f90b
commit 3d6e50c67a
4 changed files with 7 additions and 21 deletions

View File

@ -148,16 +148,6 @@ concept with an associated quantity type implicitly convertible to `V`.
[nested quantity kind within the dimensionless quantities tree](dimensionless_quantities.md/#nested-quantity-kinds). [nested quantity kind within the dimensionless quantities tree](dimensionless_quantities.md/#nested-quantity-kinds).
### `UnitCompatibleWith<T, V1, V2>` { #UnitCompatibleWith }
`UnitCompatibleWith` concept is satisfied for all units `T` when:
- `V1` is a [`Unit`](#Unit),
- `V2` is a [`QuantitySpec`](#QuantitySpec),
- `T` and `V1` are defined in terms of the same reference unit,
- if `T` is an [`AssociatedUnit`](#AssociatedUnit) it should satisfy [`UnitOf<V2>`](#UnitOf).
## `Reference<T>` { #Reference } ## `Reference<T>` { #Reference }
`Reference` concept is satisfied by all [quantity reference](../../appendix/glossary.md#reference) `Reference` concept is satisfied by all [quantity reference](../../appendix/glossary.md#reference)

View File

@ -192,14 +192,14 @@ public:
quantity& operator=(quantity&&) = default; quantity& operator=(quantity&&) = default;
// unit conversions // unit conversions
template<UnitCompatibleWith<unit, quantity_spec> ToU> template<detail::UnitCompatibleWith<unit, quantity_spec> ToU>
requires detail::QuantityConvertibleTo<quantity, quantity<detail::make_reference(quantity_spec, ToU{}), Rep>> requires detail::QuantityConvertibleTo<quantity, quantity<detail::make_reference(quantity_spec, ToU{}), Rep>>
[[nodiscard]] constexpr QuantityOf<quantity_spec> auto in(ToU) const [[nodiscard]] constexpr QuantityOf<quantity_spec> auto in(ToU) const
{ {
return quantity<detail::make_reference(quantity_spec, ToU{}), Rep>{*this}; return quantity<detail::make_reference(quantity_spec, ToU{}), Rep>{*this};
} }
template<UnitCompatibleWith<unit, quantity_spec> ToU> template<detail::UnitCompatibleWith<unit, quantity_spec> ToU>
requires requires(quantity q) { value_cast<ToU{}>(q); } requires requires(quantity q) { value_cast<ToU{}>(q); }
[[nodiscard]] constexpr QuantityOf<quantity_spec> auto force_in(ToU) const [[nodiscard]] constexpr QuantityOf<quantity_spec> auto force_in(ToU) const
{ {
@ -230,14 +230,14 @@ public:
= delete; = delete;
#endif #endif
template<UnitCompatibleWith<unit, quantity_spec> U> template<detail::UnitCompatibleWith<unit, quantity_spec> U>
requires detail::QuantityConvertibleTo<quantity, quantity<detail::make_reference(quantity_spec, U{}), Rep>> requires detail::QuantityConvertibleTo<quantity, quantity<detail::make_reference(quantity_spec, U{}), Rep>>
[[nodiscard]] constexpr rep numerical_value_in(U) const noexcept [[nodiscard]] constexpr rep numerical_value_in(U) const noexcept
{ {
return (*this).in(U{}).numerical_value_is_an_implementation_detail_; return (*this).in(U{}).numerical_value_is_an_implementation_detail_;
} }
template<UnitCompatibleWith<unit, quantity_spec> U> template<detail::UnitCompatibleWith<unit, quantity_spec> U>
requires requires(quantity q) { value_cast<U{}>(q); } requires requires(quantity q) { value_cast<U{}>(q); }
[[nodiscard]] constexpr rep force_numerical_value_in(U) const noexcept [[nodiscard]] constexpr rep force_numerical_value_in(U) const noexcept
{ {

View File

@ -277,14 +277,14 @@ public:
} }
// unit conversions // unit conversions
template<UnitCompatibleWith<unit, quantity_spec> ToU> template<detail::UnitCompatibleWith<unit, quantity_spec> ToU>
requires detail::QuantityConvertibleTo<quantity_type, quantity<detail::make_reference(quantity_spec, ToU{}), Rep>> requires detail::QuantityConvertibleTo<quantity_type, quantity<detail::make_reference(quantity_spec, ToU{}), Rep>>
[[nodiscard]] constexpr QuantityPointOf<quantity_spec> auto in(ToU) const [[nodiscard]] constexpr QuantityPointOf<quantity_spec> auto in(ToU) const
{ {
return ::mp_units::quantity_point{quantity_ref_from(PO).in(ToU{}), PO}; return ::mp_units::quantity_point{quantity_ref_from(PO).in(ToU{}), PO};
} }
template<UnitCompatibleWith<unit, quantity_spec> ToU> template<detail::UnitCompatibleWith<unit, quantity_spec> ToU>
requires requires(quantity_type q) { value_cast<ToU{}>(q); } requires requires(quantity_type q) { value_cast<ToU{}>(q); }
[[nodiscard]] constexpr QuantityPointOf<quantity_spec> auto force_in(ToU) const [[nodiscard]] constexpr QuantityPointOf<quantity_spec> auto force_in(ToU) const
{ {

View File

@ -197,8 +197,6 @@ template<auto From, auto To>
concept UnitConvertibleTo = concept UnitConvertibleTo =
Unit<MP_UNITS_REMOVE_CONST(decltype(From))> && Unit<MP_UNITS_REMOVE_CONST(decltype(To))> && (convertible(From, To)); Unit<MP_UNITS_REMOVE_CONST(decltype(From))> && Unit<MP_UNITS_REMOVE_CONST(decltype(To))> && (convertible(From, To));
} // namespace detail
/** /**
* @brief A concept matching all units compatible with the provided unit and quantity spec * @brief A concept matching all units compatible with the provided unit and quantity spec
* *
@ -210,11 +208,9 @@ concept UnitCompatibleWith =
Unit<U> && Unit<MP_UNITS_REMOVE_CONST(decltype(FromU))> && QuantitySpec<MP_UNITS_REMOVE_CONST(decltype(QS))> && Unit<U> && Unit<MP_UNITS_REMOVE_CONST(decltype(FromU))> && QuantitySpec<MP_UNITS_REMOVE_CONST(decltype(QS))> &&
(!AssociatedUnit<U> || UnitOf<U, QS>)&&detail::UnitConvertibleTo<FromU, U{}>; (!AssociatedUnit<U> || UnitOf<U, QS>)&&detail::UnitConvertibleTo<FromU, U{}>;
namespace detail {
template<typename T> template<typename T>
concept OffsetUnit = Unit<T> && requires { T::point_origin; }; concept OffsetUnit = Unit<T> && requires { T::point_origin; };
} } // namespace detail
} // namespace mp_units } // namespace mp_units