From 4cb1122ff4e325abb2586fcc79c9e4cc4cd871f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johel=20Ernesto=20Guerrero=20Pe=C3=B1a?= Date: Wed, 9 Sep 2020 23:27:37 -0400 Subject: [PATCH] fix: require equal exponent ratios for DimensionOf when UNITS_DOWNCAST OFF --- src/include/units/physical/dimensions.h | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/include/units/physical/dimensions.h b/src/include/units/physical/dimensions.h index 2b3b1ffa..c14d8f71 100644 --- a/src/include/units/physical/dimensions.h +++ b/src/include/units/physical/dimensions.h @@ -23,23 +23,32 @@ #pragma once #include +#include #include #include +#include #include #include +#include namespace units::physical { namespace detail { -template typename DimTemplate, typename Child, Unit U, Exponent... Es> - requires requires { typename DimTemplate; } -void to_base_derived_dimension_of(const volatile derived_dimension*); +template typename DimTemplate> +inline constexpr bool same_exponents_of = false; + +template typename DimTemplate> +inline constexpr bool same_exponents_of, DimTemplate> = requires { typename DimTemplate, unknown_coherent_unit, typename Es::dimension...>; } && std::same_as, typename DimTemplate, unknown_coherent_unit, typename Es::dimension...>::recipe>; } // namespace detail template typename DimTemplate> -concept DimensionOf = Dimension && (is_derived_from_specialization_of || requires(const volatile Dim* x) { detail::to_base_derived_dimension_of(x); }); +concept EquivalentUnknownDimensionOf = Dimension && is_derived_from_specialization_of && detail::same_exponents_of; + +template typename DimTemplate> +concept DimensionOf = Dimension && (is_derived_from_specialization_of || + EquivalentUnknownDimensionOf); template typename DimTemplate> concept QuantityOf = Quantity && DimensionOf;