5 Quantities and units library [quantities]
template<typename T>
concept QuantitySpec = SymbolicConstant<T> && std::derived_from<T, quantity-spec-interface>;
template<typename T>
concept QuantityKindSpec =
QuantitySpec<T> && is-specialization-of<T, kind_of_>();
template<typename T>
concept NamedQuantitySpec =
QuantitySpec<T> && is-derived-from-specialization-of<T, quantity_spec>() &&
(!QuantityKindSpec<T>);
template<typename T>
concept DerivedQuantitySpec =
QuantitySpec<T> &&
(is-specialization-of<T, derived_quantity_spec>() ||
(QuantityKindSpec<T> &&
is-specialization-of<decltype(auto(T::quantity-spec)), derived_quantity_spec>()));
template<auto Child, auto Parent>
concept ChildQuantitySpecOf = (is-child-of(Child, Parent));
template<auto To, auto From>
concept NestedQuantityKindSpecOf =
QuantitySpec<decltype(From)> && QuantitySpec<decltype(To)> &&
(get_kind(From) != get_kind(To)) && ChildQuantitySpecOf<To, get_kind(From).quantity-spec>;
template<auto From, auto To>
concept QuantitySpecConvertibleTo =
QuantitySpec<decltype(From)> && QuantitySpec<decltype(To)> && implicitly_convertible(From, To);
template<auto From, auto To>
concept QuantitySpecExplicitlyConvertibleTo =
QuantitySpec<decltype(From)> && QuantitySpec<decltype(To)> && explicitly_convertible(From, To);
template<auto From, auto To>
concept QuantitySpecCastableTo =
QuantitySpec<decltype(From)> && QuantitySpec<decltype(To)> && castable(From, To);
template<typename T, auto QS>
concept QuantitySpecOf =
QuantitySpec<T> && QuantitySpec<decltype(QS)> && QuantitySpecConvertibleTo<T{}, QS> &&
!NestedQuantityKindSpecOf<T{}, QS> &&
(QuantityKindSpec<T> || !NestedQuantityKindSpecOf<QS, T{}>);
template<typename T>
concept QSProperty = (!QuantitySpec<T>);