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>
[[nodiscard]] constexpr QuantityKind auto quantity_kind_cast(const quantity_kind<K, U, Rep>& qk)
requires (is_specialization_of<CastSpec, quantity_kind> &&
requires { quantity_cast<typename CastSpec::quantity_type>(qk.common()); }) ||
(Kind<CastSpec> && UnitOf<U, typename CastSpec::dimension>) ||
requires { quantity_cast<CastSpec>(qk.common()); }
requires requires { requires is_specialization_of<CastSpec, quantity_kind>;
requires requires { quantity_cast<typename CastSpec::quantity_type>(qk.common()); }; } ||
requires { requires Kind<CastSpec>; requires UnitOf<U, typename CastSpec::dimension>; } ||
requires { requires requires { quantity_cast<CastSpec>(qk.common()); }; }
{
if constexpr (is_specialization_of<CastSpec, quantity_kind>)
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
template<QuantityValue Value>
[[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);
}
template<QuantityValue Value>
[[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());
}
template<QuantityValue Value>
[[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());
return detail::make_quantity_kind<quantity_kind>(qk.common() / v);
@@ -263,7 +263,7 @@ public:
template<QuantityValue Value>
[[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());
return detail::downcasted_kind<quantity_kind>(v / qk.common());
@@ -271,7 +271,7 @@ public:
template<QuantityValue Value>
[[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());
return detail::make_quantity_kind<quantity_kind>(qk.common() % v);