diff --git a/src/core/include/units/bits/quantity_concepts.h b/src/core/include/units/bits/quantity_concepts.h index 9d4e08e4..502b5573 100644 --- a/src/core/include/units/bits/quantity_concepts.h +++ b/src/core/include/units/bits/quantity_concepts.h @@ -165,12 +165,11 @@ concept weak_quantity_of = Quantity && template concept quantity_like = requires(T q) { - quantity_like_traits::dimension; - quantity_like_traits::unit; + quantity_like_traits::reference; typename quantity_like_traits::rep; - requires Dimension::dimension)>>; - requires Unit::unit)>>; - requires Representation::rep>; + requires Reference::reference)>>; + requires RepresentationOf::rep, + quantity_like_traits::reference.quantity_spec.character>; { quantity_like_traits::number(q) } -> std::convertible_to::rep>; diff --git a/src/core/include/units/customization_points.h b/src/core/include/units/customization_points.h index 5570ee37..ad834d97 100644 --- a/src/core/include/units/customization_points.h +++ b/src/core/include/units/customization_points.h @@ -129,8 +129,8 @@ struct quantity_values { /** * @brief Provides support for external quantity-like types * - * The type trait should provide the following nested values @c dimension, @c unit and type alias @c rep, - * and a static member function @c number(T) that will return the raw value of the quantity. + * The type trait should provide the @c reference object, a type alias @c rep, + * and a static member function @c number(T) that returns the raw value of the quantity. * * Usage example can be found in @c units/chrono.h header file. * diff --git a/src/core/include/units/quantity.h b/src/core/include/units/quantity.h index c83d9cd3..e90b738f 100644 --- a/src/core/include/units/quantity.h +++ b/src/core/include/units/quantity.h @@ -42,6 +42,9 @@ namespace detail { template concept quantity_one = quantity_of; +template +using quantity_like_type = quantity::reference, typename quantity_like_traits::rep>; + } // namespace detail template @@ -64,10 +67,6 @@ template concept invoke_result_of_ = std::regular_invocable && RepresentationOf, Ch>; -template -using quantity_like_type = quantity::dimension, quantity_like_traits::unit>{}, - typename quantity_like_traits::rep>; - /** * @brief A quantity * @@ -131,8 +130,8 @@ public: } template - requires quantity_convertible_to_, quantity> - constexpr explicit quantity(const Q& q) : quantity(quantity_like_type(quantity_like_traits::number(q))) + requires quantity_convertible_to_, quantity> + constexpr explicit quantity(const Q& q): quantity(detail::quantity_like_type(quantity_like_traits::number(q))) { } @@ -452,8 +451,7 @@ explicit(false) quantity(Rep&&) -> quantity; #endif template -explicit quantity(Q) -> quantity::dimension, quantity_like_traits::unit>{}, - typename quantity_like_traits::rep>; +explicit quantity(Q) -> quantity::reference, typename quantity_like_traits::rep>; // non-member binary operators template