feat: force_in(U) support added

This commit is contained in:
Mateusz Pusz
2023-09-13 10:18:07 +02:00
parent 2b2f62d038
commit 1c7928021d
2 changed files with 18 additions and 7 deletions

View File

@@ -141,6 +141,20 @@ public:
quantity& operator=(const quantity&) = default; quantity& operator=(const quantity&) = default;
quantity& operator=(quantity&&) = default; quantity& operator=(quantity&&) = default;
// conversions
template<Unit U>
requires detail::QuantityConvertibleTo<quantity, quantity<quantity_spec[U{}], Rep>>
[[nodiscard]] constexpr quantity<quantity_spec[U{}], Rep> in(U) const
{
return quantity<quantity_spec[U{}], Rep>{*this};
}
template<Unit U>
requires requires(quantity q) { value_cast<U{}>(q); }
[[nodiscard]] constexpr quantity<quantity_spec[U{}], Rep> force_in(U) const
{
return value_cast<U{}>(*this);
}
// data access // data access
#ifdef __cpp_explicit_this_parameter #ifdef __cpp_explicit_this_parameter
template<typename Self, Unit U> template<typename Self, Unit U>
@@ -190,13 +204,6 @@ public:
return value_cast<U{}>(*this).numerical_value_in(U{}); return value_cast<U{}>(*this).numerical_value_in(U{});
} }
template<Unit U>
requires detail::QuantityConvertibleTo<quantity, quantity<quantity_spec[U{}], Rep>>
[[nodiscard]] constexpr quantity<quantity_spec[U{}], Rep> in(U) const
{
return quantity<quantity_spec[U{}], Rep>{*this};
}
// member unary operators // member unary operators
[[nodiscard]] constexpr Quantity auto operator+() const [[nodiscard]] constexpr Quantity auto operator+() const
requires requires(rep v) { requires requires(rep v) {

View File

@@ -900,6 +900,10 @@ static_assert(value_cast<km>(2000 * m).numerical_value_ref_in(km) == 2);
static_assert(value_cast<int>(1.23 * m).numerical_value_ref_in(m) == 1); static_assert(value_cast<int>(1.23 * m).numerical_value_ref_in(m) == 1);
static_assert(value_cast<km / h>(2000.0 * m / (3600.0 * s)).numerical_value_ref_in(km / h) == 2); static_assert(value_cast<km / h>(2000.0 * m / (3600.0 * s)).numerical_value_ref_in(km / h) == 2);
static_assert((2 * km).force_in(m).numerical_value_ref_in(m) == 2000);
static_assert((2000 * m).force_in(km).numerical_value_ref_in(km) == 2);
static_assert((2000.0 * m / (3600.0 * s)).force_in(km / h).numerical_value_ref_in(km / h) == 2);
////////////////// //////////////////
// quantity_cast // quantity_cast
////////////////// //////////////////