From 0b265f362d7e580ad3f899689092c056b8d85561 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Mon, 23 Sep 2024 14:25:33 +0200 Subject: [PATCH] refactor: `is_derived_from_specialization_of_v` added and applied to remove custom traits --- src/core/include/mp-units/ext/type_traits.h | 6 +++++ .../mp-units/framework/dimension_concepts.h | 9 +------ .../mp-units/framework/quantity_point.h | 24 ++++++++--------- .../framework/quantity_point_concepts.h | 26 +++++-------------- .../mp-units/framework/unit_concepts.h | 13 +--------- 5 files changed, 26 insertions(+), 52 deletions(-) diff --git a/src/core/include/mp-units/ext/type_traits.h b/src/core/include/mp-units/ext/type_traits.h index 2ee78e2a..74a14139 100644 --- a/src/core/include/mp-units/ext/type_traits.h +++ b/src/core/include/mp-units/ext/type_traits.h @@ -89,11 +89,17 @@ namespace detail { template typename Type, typename... Params> void to_base_specialization_of(const volatile Type*); +template typename Type, auto... Params> +void to_base_specialization_of_v(const volatile Type*); + } // namespace detail template typename Type> constexpr bool is_derived_from_specialization_of = requires(T* t) { detail::to_base_specialization_of(t); }; +template typename Type> +constexpr bool is_derived_from_specialization_of_v = requires(T* t) { detail::to_base_specialization_of_v(t); }; + namespace detail { template diff --git a/src/core/include/mp-units/framework/dimension_concepts.h b/src/core/include/mp-units/framework/dimension_concepts.h index 90330eb2..68f6f15d 100644 --- a/src/core/include/mp-units/framework/dimension_concepts.h +++ b/src/core/include/mp-units/framework/dimension_concepts.h @@ -49,20 +49,13 @@ struct base_dimension; namespace detail { -template -void to_base_specialization_of_base_dimension(const volatile base_dimension*); - -template -constexpr bool is_derived_from_specialization_of_base_dimension = - requires(T* type) { to_base_specialization_of_base_dimension(type); }; - /** * @brief A concept matching all named base dimensions in the library. * * Satisfied by all dimension types derived from a specialization of `base_dimension`. */ template -concept BaseDimension = Dimension && is_derived_from_specialization_of_base_dimension; +concept BaseDimension = Dimension && is_derived_from_specialization_of_v; template struct is_dimension_one : std::false_type {}; diff --git a/src/core/include/mp-units/framework/quantity_point.h b/src/core/include/mp-units/framework/quantity_point.h index 074cd8fa..ba312544 100644 --- a/src/core/include/mp-units/framework/quantity_point.h +++ b/src/core/include/mp-units/framework/quantity_point.h @@ -76,13 +76,13 @@ struct point_origin_interface { template PO2> requires QuantitySpecOf, PO2::quantity_spec> && - (detail::is_derived_from_specialization_of_relative_point_origin || - detail::is_derived_from_specialization_of_relative_point_origin) + (is_derived_from_specialization_of_v || + is_derived_from_specialization_of_v) [[nodiscard]] friend constexpr Quantity auto operator-(PO1 po1, PO2 po2) { - if constexpr (detail::is_derived_from_specialization_of_absolute_point_origin) { + if constexpr (is_derived_from_specialization_of_v) { return -(po2.quantity_point - po2.quantity_point.absolute_point_origin); - } else if constexpr (detail::is_derived_from_specialization_of_absolute_point_origin) { + } else if constexpr (is_derived_from_specialization_of_v) { return po1.quantity_point - po1.quantity_point.absolute_point_origin; } else { return po1.quantity_point - po2.quantity_point; @@ -92,16 +92,16 @@ struct point_origin_interface { template [[nodiscard]] friend consteval bool operator==(PO1 po1, PO2 po2) { - if constexpr (detail::is_derived_from_specialization_of_absolute_point_origin && - detail::is_derived_from_specialization_of_absolute_point_origin) + if constexpr (is_derived_from_specialization_of_v && + is_derived_from_specialization_of_v) return is_same_v || (detail::is_zeroth_point_origin(po1) && detail::is_zeroth_point_origin(po2) && interconvertible(po1.quantity_spec, po2.quantity_spec)); - else if constexpr (detail::is_derived_from_specialization_of_relative_point_origin && - detail::is_derived_from_specialization_of_relative_point_origin) + else if constexpr (is_derived_from_specialization_of_v && + is_derived_from_specialization_of_v) return PO1::quantity_point == PO2::quantity_point; - else if constexpr (detail::is_derived_from_specialization_of_relative_point_origin) + else if constexpr (is_derived_from_specialization_of_v) return detail::same_absolute_point_origins(po1, po2) && is_eq_zero(PO1::quantity_point.quantity_from_zero()); - else if constexpr (detail::is_derived_from_specialization_of_relative_point_origin) + else if constexpr (is_derived_from_specialization_of_v) return detail::same_absolute_point_origins(po1, po2) && is_eq_zero(PO2::quantity_point.quantity_from_zero()); } }; @@ -154,7 +154,7 @@ namespace detail { template [[nodiscard]] consteval PointOrigin auto get_absolute_point_origin(PO po) { - if constexpr (is_derived_from_specialization_of_absolute_point_origin) + if constexpr (is_derived_from_specialization_of_v) return po; else return po.quantity_point.absolute_point_origin; @@ -509,7 +509,7 @@ public: { if constexpr (point_origin == po) return qp.quantity_ref_from(point_origin); - else if constexpr (detail::is_derived_from_specialization_of_absolute_point_origin) { + else if constexpr (is_derived_from_specialization_of_v) { if constexpr (point_origin == absolute_point_origin) return qp.quantity_ref_from(point_origin); else diff --git a/src/core/include/mp-units/framework/quantity_point_concepts.h b/src/core/include/mp-units/framework/quantity_point_concepts.h index 89f49dbf..e1c32f7f 100644 --- a/src/core/include/mp-units/framework/quantity_point_concepts.h +++ b/src/core/include/mp-units/framework/quantity_point_concepts.h @@ -40,13 +40,6 @@ namespace detail { template constexpr bool is_quantity_point = false; -template -void to_base_specialization_of_absolute_point_origin(const volatile absolute_point_origin*); - -template -constexpr bool is_derived_from_specialization_of_absolute_point_origin = - requires(T* type) { to_base_specialization_of_absolute_point_origin(type); }; - } // namespace detail /** @@ -62,13 +55,6 @@ struct relative_point_origin; namespace detail { -template -void to_base_specialization_of_relative_point_origin(const volatile relative_point_origin*); - -template -constexpr bool is_derived_from_specialization_of_relative_point_origin = - requires(T* type) { to_base_specialization_of_relative_point_origin(type); }; - struct point_origin_interface; } // namespace detail @@ -109,15 +95,15 @@ constexpr bool is_quantity_point = true; template [[nodiscard]] consteval bool same_absolute_point_origins(PO1 po1, PO2 po2) { - if constexpr (is_derived_from_specialization_of_absolute_point_origin && - is_derived_from_specialization_of_absolute_point_origin) + if constexpr (is_derived_from_specialization_of_v && + is_derived_from_specialization_of_v) return po1 == po2; - else if constexpr (is_derived_from_specialization_of_relative_point_origin && - is_derived_from_specialization_of_relative_point_origin) + else if constexpr (is_derived_from_specialization_of_v && + is_derived_from_specialization_of_v) return po1.absolute_point_origin == po2.absolute_point_origin; - else if constexpr (is_derived_from_specialization_of_relative_point_origin) + else if constexpr (is_derived_from_specialization_of_v) return po1.absolute_point_origin == po2; - else if constexpr (is_derived_from_specialization_of_relative_point_origin) + else if constexpr (is_derived_from_specialization_of_v) return po1 == po2.absolute_point_origin; else return false; diff --git a/src/core/include/mp-units/framework/unit_concepts.h b/src/core/include/mp-units/framework/unit_concepts.h index 92a2199b..f752a22e 100644 --- a/src/core/include/mp-units/framework/unit_concepts.h +++ b/src/core/include/mp-units/framework/unit_concepts.h @@ -53,22 +53,11 @@ struct named_unit; MP_UNITS_EXPORT struct one; -namespace detail { - -template -void to_base_specialization_of_named_unit(const volatile named_unit*); - -template -constexpr bool is_derived_from_specialization_of_named_unit = - requires(T* t) { to_base_specialization_of_named_unit(t); }; - -} // namespace detail - /** * @brief A concept to be used to define prefixes for a unit */ MP_UNITS_EXPORT template -concept PrefixableUnit = Unit && detail::is_derived_from_specialization_of_named_unit; +concept PrefixableUnit = Unit && is_derived_from_specialization_of_v; namespace detail {