5 Quantities and units library [quantities]
template<typename T>
concept Unit = SymbolicConstant<T> && std::derived_from<T, unit-interface>;
template<typename T>
concept PrefixableUnit = Unit<T> && is-derived-from-specialization-of<T, named_unit>();
template<typename T>
concept AssociatedUnit = Unit<U> && has-associated-quantity(U{});
template<typename U, auto QS>
concept UnitOf = AssociatedUnit<U> && QuantitySpec<decltype(QS)> &&
QuantitySpecConvertibleTo<get_quantity_spec(U{}), QS> &&
(get_kind(QS) == get_kind(get_quantity_spec(U{})) ||
!NestedQuantityKindSpecOf<get_quantity_spec(U{}), QS>);
template<auto From, auto To>
concept UnitConvertibleTo =
Unit<decltype(From)> && Unit<decltype(To)> && (convertible(From, To));
template<typename U, auto FromU, auto QS>
concept UnitCompatibleWith =
Unit<U> && Unit<decltype(FromU)> && QuantitySpec<decltype(QS)> &&
(!AssociatedUnit<U> || UnitOf<U, QS>) && UnitConvertibleTo<FromU, U{}>;
template<typename T>
concept OffsetUnit = Unit<T> && requires { T::point-origin; };
template<typename From, typename To>
concept PotentiallyConvertibleTo =
Unit<From> && Unit<To> &&
((AssociatedUnit<From> && AssociatedUnit<To> &&
implicitly_convertible(get_quantity_spec(From{}), get_quantity_spec(To{}))) ||
(!AssociatedUnit<From> && !AssociatedUnit<To>));