feat: working dimension concepts with UNITS_DOWNCAST OFF

continuation of 22e6107d0f
This commit is contained in:
Johel Ernesto Guerrero Peña
2020-09-08 20:50:11 -04:00
committed by Mateusz Pusz
parent e036d9bb55
commit d6fba478b9

View File

@@ -24,16 +24,25 @@
#include <units/base_dimension.h> #include <units/base_dimension.h>
#include <units/bits/external/type_traits.h> #include <units/bits/external/type_traits.h>
#include <units/derived_dimension.h>
#include <units/quantity.h> #include <units/quantity.h>
#include <units/unit.h> #include <units/unit.h>
namespace units::physical { namespace units::physical {
namespace detail {
template<template<typename...> typename DimTemplate, typename Child, Unit U, Exponent... Es>
requires requires { typename DimTemplate<Child, U, typename Es::dimension...>; }
void to_base_derived_dimension_of(const volatile derived_dimension<Child, U, Es...>*);
} // namespace detail
template<typename Dim, template<typename...> typename DimTemplate> template<typename Dim, template<typename...> typename DimTemplate>
concept DimensionOf = Dimension<Dim> && is_derived_from_specialization_of<Dim, DimTemplate>; concept DimensionOf = Dimension<Dim> && (is_derived_from_specialization_of<Dim, DimTemplate> || requires(const volatile Dim* x) { detail::to_base_derived_dimension_of<DimTemplate>(x); });
template<typename Q, template<typename...> typename DimTemplate> template<typename Q, template<typename...> typename DimTemplate>
concept QuantityOf = Quantity<Q> && is_derived_from_specialization_of<typename Q::dimension, DimTemplate>; concept QuantityOf = Quantity<Q> && DimensionOf<typename Q::dimension, DimTemplate>;
// ------------------------ base dimensions ----------------------------- // ------------------------ base dimensions -----------------------------