feat: quantity_cast<kind_of_qs>(associated_unit) now returns the bare unit as a reference

This commit is contained in:
Mateusz Pusz
2023-08-18 11:10:59 +02:00
parent ef39b8c4c7
commit 110986ee1f
2 changed files with 14 additions and 1 deletions

View File

@@ -49,7 +49,11 @@ template<QuantitySpec auto ToQS, typename Q>
[[nodiscard]] constexpr Quantity auto quantity_cast(Q&& q)
requires Quantity<std::remove_cvref_t<Q>> && (castable(q.quantity_spec, ToQS))
{
return make_quantity<reference<ToQS, q.unit>{}>(std::forward<Q>(q).number());
if constexpr (detail::QuantityKindSpec<std::remove_const_t<decltype(ToQS)>> &&
AssociatedUnit<std::remove_const_t<decltype(q.unit)>>)
return make_quantity<q.unit>(std::forward<Q>(q).number());
else
return make_quantity<reference<ToQS, q.unit>{}>(std::forward<Q>(q).number());
}
} // namespace mp_units

View File

@@ -887,6 +887,15 @@ static_assert(value_cast<km>(2000 * m).number() == 2);
static_assert(value_cast<int>(1.23 * m).number() == 1);
static_assert(value_cast<km / h>(2000.0 * m / (3600.0 * s)).number() == 2);
//////////////////
// quantity_cast
//////////////////
static_assert(is_of_type<quantity_cast<isq::distance>(1 * m), quantity<isq::distance[m], int>>);
static_assert(is_of_type<quantity_cast<isq::distance>(isq::length(1 * m)), quantity<isq::distance[m], int>>);
static_assert(is_of_type<quantity_cast<kind_of<isq::length>>(isq::length(1 * m)), quantity<si::metre, int>>);
static_assert(is_of_type<quantity_cast<kind_of<isq::length>>(isq::distance(1 * m)), quantity<si::metre, int>>);
// QuantityOf
static_assert(QuantityOf<quantity<isq::length[m]>, isq::length>);