template<typename T, template<typename> typename Traits>
concept qty-like-impl = requires(const T& qty, const Traits<T>::rep& num) { // exposition only
{ Traits<T>::to_numerical_value(qty) } -> std::same_as<typename Traits<T>::rep>;
{ Traits<T>::from_numerical_value(num) } -> std::same_as<T>;
requires std::same_as<decltype(Traits<T>::explicit_import), const bool>;
requires std::same_as<decltype(Traits<T>::explicit_export), const bool>;
typename std::bool_constant<Traits<T>::explicit_import>;
typename std::bool_constant<Traits<T>::explicit_export>;
};
template<typename T>
concept QuantityLike = !Quantity<T> && qty-like-impl<T, quantity_like_traits> && requires {
typename quantity<quantity_like_traits<T>::reference, typename quantity_like_traits<T>::rep>;
};
static constexpr quantity zero() noexcept
requires see below;
static constexpr quantity one() noexcept
requires see below;
static constexpr quantity min() noexcept
requires see below;
static constexpr quantity max() noexcept
requires see below;
template<QuantityLike Q>
requires QuantityConvertibleTo<quantity-like-type<Q>, quantity>
constexpr explicit(see below) quantity(const Q& q);
template<UnitCompatibleWith<unit, quantity_spec> ToU>
requires QuantityConvertibleTo<quantity, quantity<make-reference(quantity_spec, ToU{}), Rep>>
constexpr QuantityOf<quantity_spec> auto in(ToU) const;
template<RepresentationOf<quantity_spec> ToRep>
requires QuantityConvertibleTo<quantity, quantity<reference, ToRep>>
constexpr QuantityOf<quantity_spec> auto in() const;
template<RepresentationOf<quantity_spec> ToRep,
UnitCompatibleWith<unit, quantity_spec> ToU>
requires QuantityConvertibleTo<quantity,
quantity<make-reference(quantity_spec, ToU{}), ToRep>>
constexpr QuantityOf<quantity_spec> auto in(ToU) const;
template<UnitCompatibleWith<unit, quantity_spec> ToU>
requires requires(const quantity q) { value_cast<ToU{}>(q); }
constexpr QuantityOf<quantity_spec> auto force_in(ToU) const;
template<RepresentationOf<quantity_spec> ToRep>
requires requires(const quantity q) { value_cast<ToRep>(q); }
constexpr QuantityOf<quantity_spec> auto force_in() const;
template<RepresentationOf<quantity_spec> ToRep,
UnitCompatibleWith<unit, quantity_spec> ToU>
requires requires(const quantity q) { value_cast<ToU{}, ToRep>(q); }
constexpr QuantityOf<quantity_spec> auto force_in(ToU) const;
template<typename V_, std::constructible_from<Rep> Value = std::remove_cvref_t<V_>>
requires(unit == ::mp_units::one)
explicit operator V_() const & noexcept;
template<typename Q_, QuantityLike Q = std::remove_cvref_t<Q_>>
requires QuantityConvertibleTo<quantity, quantity-like-type<Q>>
constexpr explicit(see below) operator Q_() const noexcept(see below);
constexpr QuantityOf<quantity_spec> auto operator+() const
requires see below;
constexpr QuantityOf<quantity_spec> auto operator-() const
requires see below;
constexpr QuantityOf<quantity_spec> auto operator++(int)
requires see below;
constexpr QuantityOf<quantity_spec> auto operator--(int)
requires see below;
template<Mutable<quantity> Q, auto R2, typename Rep2>
requires see below
friend constexpr decltype(auto) operator+=(Q&& lhs, const quantity<R2, Rep2>& rhs);
template<Mutable<quantity> Q, auto R2, typename Rep2>
requires see below
friend constexpr decltype(auto) operator-=(Q&& lhs, const quantity<R2, Rep2>& rhs);
template<Mutable<quantity> Q, auto R2, typename Rep2>
requires see below
friend constexpr decltype(auto) operator%=(Q&& lhs, const quantity<R2, Rep2>& rhs);
template<Mutable<quantity> Q, QuantityOf<dimensionless> Q2>
requires see below
friend constexpr decltype(auto) operator*=(Q&& lhs, const Q2& rhs);
template<Mutable<quantity> Q, QuantityOf<dimensionless> Q2>
requires see below
friend constexpr decltype(auto) operator/=(Q&& lhs, const Q2& rhs);
template<std::derived_from<quantity> Q, auto R2, typename Rep2>
requires CommonlyInvocableQuantities<std::plus<>, quantity, quantity<R2, Rep2>>
friend constexpr Quantity auto operator+(const Q& lhs, const quantity<R2, Rep2>& rhs);
template<std::derived_from<quantity> Q, auto R2, typename Rep2>
requires CommonlyInvocableQuantities<std::minus<>, quantity, quantity<R2, Rep2>>
friend constexpr Quantity auto operator-(const Q& lhs, const quantity<R2, Rep2>& rhs);
template<std::derived_from<quantity> Q, auto R2, typename Rep2>
requires(!treat_as_floating_point<Rep>) && (!treat_as_floating_point<Rep2>) &&
CommonlyInvocableQuantities<std::modulus<>, quantity, quantity<R2, Rep2>>
friend constexpr Quantity auto operator%(const Q& lhs, const quantity<R2, Rep2>& rhs);
template<std::derived_from<quantity> Q, Representation Value>
requires(Q::unit == ::mp_units::one) &&
InvokeResultOf<quantity_spec, std::plus<>, Rep, const Value&>
friend constexpr Quantity auto operator+(const Q& lhs, const Value& rhs);
template<std::derived_from<quantity> Q, Representation Value>
requires(Q::unit == ::mp_units::one) &&
InvokeResultOf<quantity_spec, std::minus<>, Rep, const Value&>
friend constexpr Quantity auto operator-(const Q& lhs, const Value& rhs);
template<std::derived_from<quantity> Q, Representation Value>
requires(Q::unit == ::mp_units::one) &&
InvokeResultOf<quantity_spec, std::modulus<>, Rep, const Value&>
friend constexpr Quantity auto operator%(const Q& lhs, const Value& rhs);
template<std::derived_from<quantity> Q, Representation Value>
requires(Q::unit == ::mp_units::one) &&
InvokeResultOf<quantity_spec, std::plus<>, Rep, const Value&>
friend constexpr Quantity auto operator+(const Value& lhs, const Q& rhs);
template<std::derived_from<quantity> Q, Representation Value>
requires(Q::unit == ::mp_units::one) &&
InvokeResultOf<quantity_spec, std::minus<>, Rep, const Value&>
friend constexpr Quantity auto operator-(const Value& lhs, const Q& rhs);
template<std::derived_from<quantity> Q, Representation Value>
requires(Q::unit == ::mp_units::one) &&
InvokeResultOf<quantity_spec, std::modulus<>, Rep, const Value&>
friend constexpr Quantity auto operator%(const Value& lhs, const Q& rhs);
template<std::derived_from<quantity> Q, auto R2, typename Rep2>
requires InvocableQuantities<std::multiplies<>, quantity, quantity<R2, Rep2>>
friend constexpr Quantity auto operator*(const Q& lhs, const quantity<R2, Rep2>& rhs);
template<std::derived_from<quantity> Q, auto R2, typename Rep2>
requires InvocableQuantities<std::divides<>, quantity, quantity<R2, Rep2>>
friend constexpr Quantity auto operator/(const Q& lhs, const quantity<R2, Rep2>& rhs);
template<std::derived_from<quantity> Q, typename Value>
requires(!Quantity<Value>) && (!Reference<Value>) &&
InvokeResultOf<quantity_spec, std::multiplies<>, Rep, const Value&>
friend constexpr QuantityOf<quantity_spec> auto operator*(const Q& lhs, const Value& rhs);
template<std::derived_from<quantity> Q, typename Value>
requires(!Quantity<Value>) && (!Reference<Value>) &&
InvokeResultOf<quantity_spec, std::divides<>, Rep, const Value&>
friend constexpr QuantityOf<quantity_spec> auto operator/(const Q& lhs, const Value& rhs);
template<typename Value, std::derived_from<quantity> Q>
requires(!Quantity<Value>) && (!Reference<Value>) &&
InvokeResultOf<quantity_spec, std::multiplies<>, const Value&, Rep>
friend constexpr QuantityOf<quantity_spec> auto operator*(const Value& lhs, const Q& rhs);
template<typename Value, std::derived_from<quantity> Q>
requires(!Quantity<Value>) && (!Reference<Value>) &&
InvokeResultOf<quantity_spec, std::divides<>, const Value&, Rep>
friend constexpr Quantity auto operator/(const Value& lhs, const Q& rhs);
template<std::derived_from<quantity> Q, auto R2, typename Rep2>
requires see below
friend constexpr bool operator==(const Q& lhs, const quantity<R2, Rep2>& rhs);
template<std::derived_from<quantity> Q, auto R2, typename Rep2>
requires see below
friend constexpr auto operator<=>(const Q& lhs, const quantity<R2, Rep2>& rhs);
template<std::derived_from<quantity> Q, Representation Value>
requires see below
friend constexpr bool operator==(const Q& lhs, const Value& rhs);
template<std::derived_from<quantity> Q, Representation Value>
requires see below
friend constexpr auto operator<=>(const Q& lhs, const Value& rhs);
friend constexpr bool is_eq_zero(const quantity& q) requires see below;
friend constexpr bool is_neq_zero(const quantity& q) requires see below;
friend constexpr bool is_lt_zero(const quantity& q) requires see below;
friend constexpr bool is_gt_zero(const quantity& q) requires see below;
friend constexpr bool is_lteq_zero(const quantity& q) requires see below;
friend constexpr bool is_gteq_zero(const quantity& q) requires see below;
template<typename FwdRep,
RepresentationOf<get_quantity_spec(R{})> Rep = std::remove_cvref_t<FwdRep>>
constexpr quantity<R{}, Rep> operator()(FwdRep&& lhs) const;
template<Representation ToRep, typename FwdQ, Quantity Q = std::remove_cvref_t<FwdQ>>
requires RepresentationOf<ToRep, Q::quantity_spec> &&
std::constructible_from<ToRep, typename Q::rep>
constexpr quantity<Q::reference, ToRep> value_cast(FwdQ&& q);
template<Unit auto ToU, Representation ToRep, typename FwdQ,
Quantity Q = std::remove_cvref_t<FwdQ>>
requires see below
constexpr Quantity auto value_cast(FwdQ&& q);
template<Representation ToRep, Unit auto ToU, typename FwdQ,
Quantity Q = std::remove_cvref_t<FwdQ>>
requires see below
constexpr Quantity auto value_cast(FwdQ&& q);
template<QuantitySpec auto ToQS, typename FwdQ, Quantity Q = std::remove_cvref_t<FwdQ>>
requires QuantitySpecCastableTo<Q::quantity_spec, ToQS>
constexpr Quantity auto quantity_cast(FwdQ&& q);