feat: equality for dimensions now will allow derived classes as well (but not from derived_dimension)

This commit is contained in:
Mateusz Pusz
2023-10-15 17:08:19 +02:00
parent 3ec57f0c58
commit 556df31590
3 changed files with 6 additions and 6 deletions

View File

@@ -85,11 +85,11 @@ namespace detail {
/**
* @brief A concept matching all derived dimensions in the library.
*
* Satisfied by all dimension types either being a specialization of `derived_dimension`
* or derived from it (inheritance needed to properly handle `dimension_one`).
* Satisfied by all dimension types being a specialization of `derived_dimension` or
* being the `dimension_one`.
*/
template<typename T>
concept DerivedDimension = is_derived_from_specialization_of<T, derived_dimension>;
concept DerivedDimension = is_specialization_of<T, derived_dimension> || is_dimension_one<T>::value;
} // namespace detail

View File

@@ -153,7 +153,7 @@ template<Dimension Lhs, Dimension Rhs>
template<Dimension Lhs, Dimension Rhs>
[[nodiscard]] consteval bool operator==(Lhs, Rhs)
{
return is_same_v<Lhs, Rhs>;
return std::derived_from<Lhs, Rhs> || std::derived_from<Rhs, Lhs>;
}
[[nodiscard]] consteval Dimension auto inverse(Dimension auto d) { return dimension_one / d; }

View File

@@ -61,8 +61,8 @@ static_assert(detail::DerivedDimension<std::remove_const_t<decltype(isq::dim_len
static_assert(detail::DerivedDimension<std::remove_const_t<decltype(inverse(isq::dim_time))>>);
static_assert(detail::DerivedDimension<std::remove_const_t<decltype(pow<2>(isq::dim_length))>>);
static_assert(detail::DerivedDimension<derived_dimension<struct isq::dim_length, per<struct isq::dim_time>>>);
static_assert(detail::DerivedDimension<dim_speed>);
static_assert(detail::DerivedDimension<struct dimension_one>);
static_assert(!detail::DerivedDimension<dim_speed>);
static_assert(!detail::DerivedDimension<struct isq::dim_length>);
static_assert(!detail::DerivedDimension<struct si::metre>);
static_assert(!detail::DerivedDimension<int>);
@@ -73,8 +73,8 @@ static_assert(Dimension<std::remove_const_t<decltype(isq::dim_length / isq::dim_
static_assert(Dimension<std::remove_const_t<decltype(inverse(isq::dim_time))>>);
static_assert(Dimension<std::remove_const_t<decltype(pow<2>(isq::dim_length))>>);
static_assert(Dimension<derived_dimension<struct isq::dim_length, per<struct isq::dim_time>>>);
static_assert(Dimension<dim_speed>);
static_assert(Dimension<struct dimension_one>);
static_assert(!Dimension<dim_speed>);
static_assert(!Dimension<base_dimension<"L">>);
static_assert(!Dimension<struct si::metre>);
static_assert(!Dimension<int>);