test: compile quantity(_kind)_test.cpp with downcasting on

This commit is contained in:
Johel Ernesto Guerrero Peña
2021-02-21 13:33:17 -04:00
committed by Mateusz Pusz
parent 3002c5673d
commit 03a417196a
2 changed files with 9 additions and 9 deletions

View File

@@ -287,10 +287,10 @@ template<Dimension ToD, Unit ToU, typename D, typename U, typename Rep>
*/ */
template<typename CastSpec, typename K, typename U, typename Rep> template<typename CastSpec, typename K, typename U, typename Rep>
[[nodiscard]] constexpr QuantityKind auto quantity_kind_cast(const quantity_kind<K, U, Rep>& qk) [[nodiscard]] constexpr QuantityKind auto quantity_kind_cast(const quantity_kind<K, U, Rep>& qk)
requires (is_specialization_of<CastSpec, quantity_kind> && requires requires { requires is_specialization_of<CastSpec, quantity_kind>;
requires { quantity_cast<typename CastSpec::quantity_type>(qk.common()); }) || requires requires { quantity_cast<typename CastSpec::quantity_type>(qk.common()); }; } ||
(Kind<CastSpec> && UnitOf<U, typename CastSpec::dimension>) || requires { requires Kind<CastSpec>; requires UnitOf<U, typename CastSpec::dimension>; } ||
requires { quantity_cast<CastSpec>(qk.common()); } requires { requires requires { quantity_cast<CastSpec>(qk.common()); }; }
{ {
if constexpr (is_specialization_of<CastSpec, quantity_kind>) if constexpr (is_specialization_of<CastSpec, quantity_kind>)
return CastSpec(quantity_cast<typename CastSpec::quantity_type>(qk.common())); return CastSpec(quantity_cast<typename CastSpec::quantity_type>(qk.common()));

View File

@@ -241,21 +241,21 @@ public:
// Below friend functions are to be found via argument-dependent lookup only // Below friend functions are to be found via argument-dependent lookup only
template<QuantityValue Value> template<QuantityValue Value>
[[nodiscard]] friend constexpr QuantityKind auto operator*(const quantity_kind& qk, const Value& v) [[nodiscard]] friend constexpr QuantityKind auto operator*(const quantity_kind& qk, const Value& v)
requires requires { { qk.common() * v } -> Quantity; } requires requires(quantity_type q) { { q * v } -> Quantity; }
{ {
return detail::make_quantity_kind<quantity_kind>(qk.common() * v); return detail::make_quantity_kind<quantity_kind>(qk.common() * v);
} }
template<QuantityValue Value> template<QuantityValue Value>
[[nodiscard]] friend constexpr QuantityKind auto operator*(const Value& v, const quantity_kind& qk) [[nodiscard]] friend constexpr QuantityKind auto operator*(const Value& v, const quantity_kind& qk)
requires requires { { v * qk.common() } -> Quantity; } requires requires(quantity_type q) { { v * q } -> Quantity; }
{ {
return detail::make_quantity_kind<quantity_kind>(v * qk.common()); return detail::make_quantity_kind<quantity_kind>(v * qk.common());
} }
template<QuantityValue Value> template<QuantityValue Value>
[[nodiscard]] friend constexpr QuantityKind auto operator/(const quantity_kind& qk, const Value& v) [[nodiscard]] friend constexpr QuantityKind auto operator/(const quantity_kind& qk, const Value& v)
requires requires { { qk.common() / v } -> Quantity; } requires requires(quantity_type q) { { q / v } -> Quantity; }
{ {
gsl_ExpectsAudit(v != quantity_values<Value>::zero()); gsl_ExpectsAudit(v != quantity_values<Value>::zero());
return detail::make_quantity_kind<quantity_kind>(qk.common() / v); return detail::make_quantity_kind<quantity_kind>(qk.common() / v);
@@ -263,7 +263,7 @@ public:
template<QuantityValue Value> template<QuantityValue Value>
[[nodiscard]] friend constexpr QuantityKind auto operator/(const Value& v, const quantity_kind& qk) [[nodiscard]] friend constexpr QuantityKind auto operator/(const Value& v, const quantity_kind& qk)
requires requires { { v / qk.common() } -> Quantity; } requires requires(quantity_type q) { { v / q } -> Quantity; }
{ {
gsl_ExpectsAudit(qk.common().count() != quantity_values<rep>::zero()); gsl_ExpectsAudit(qk.common().count() != quantity_values<rep>::zero());
return detail::downcasted_kind<quantity_kind>(v / qk.common()); return detail::downcasted_kind<quantity_kind>(v / qk.common());
@@ -271,7 +271,7 @@ public:
template<QuantityValue Value> template<QuantityValue Value>
[[nodiscard]] friend constexpr QuantityKind auto operator%(const quantity_kind& qk, const Value& v) [[nodiscard]] friend constexpr QuantityKind auto operator%(const quantity_kind& qk, const Value& v)
requires requires { qk.common() % v; } requires requires(quantity_type q) { q % v; }
{ {
gsl_ExpectsAudit(v != quantity_values<Value>::zero()); gsl_ExpectsAudit(v != quantity_values<Value>::zero());
return detail::make_quantity_kind<quantity_kind>(qk.common() % v); return detail::make_quantity_kind<quantity_kind>(qk.common() % v);