refactor: Quantity no longer can be constructed with a raw value

Resolves #434
This commit is contained in:
Mateusz Pusz committed 2023-02-09 09:42:00 -08:00
1 parent bb6c942e0c
commit d70b95237c
5 files changed
+54 -52

No files matched your search

+6 -5
View File
@@ -51,10 +51,10 @@ template<Quantity To, auto R, typename Rep>
{
if constexpr (get_unit(R) == To::unit) {
// no scaling of the number needed
return To(static_cast<TYPENAME To::rep>(q.number())); // this is the only (and recommended) way to do
// a truncating conversion on a number, so we are
// using static_cast to suppress all the compiler
// warnings on conversions
return static_cast<TYPENAME To::rep>(q.number()) * To::reference; // this is the only (and recommended) way to do
// a truncating conversion on a number, so we are
// using static_cast to suppress all the compiler
// warnings on conversions
} else {
// scale the number
using rep_type = decltype([] {
@@ -85,7 +85,8 @@ template<Quantity To, auto R, typename Rep>
constexpr Magnitude auto irr = c_mag * (den / num);
constexpr auto val = [](Magnitude auto m) { return get_value<multiplier_type>(m); };
return To(static_cast<TYPENAME To::rep>(static_cast<rep_type>(q.number()) * val(num) / val(den) * val(irr)));
return static_cast<TYPENAME To::rep>(static_cast<rep_type>(q.number()) * val(num) / val(den) * val(irr)) *
To::reference;
}
}
+13 -8
View File
@@ -121,12 +121,6 @@ public:
quantity(const quantity&) = default;
quantity(quantity&&) = default;
template<typename Value>
requires detail::RepSafeConstructibleFrom<rep, Value>
constexpr explicit(!detail::QuantityOne<quantity>) quantity(Value&& v) : number_(std::forward<Value>(v))
{
}
template<detail::QuantityConvertibleTo<quantity> Q>
constexpr explicit(false) quantity(const Q& q) : number_(detail::sudo_cast<quantity>(q).number())
{
@@ -439,6 +433,17 @@ public:
#endif
[[nodiscard]] friend constexpr bool operator==(const quantity& lhs, const quantity& rhs) = default;
private:
template<Reference R2, typename Rep2>
requires RepresentationOf<std::remove_cvref_t<Rep2>, get_quantity_spec(R2{}).character>
friend constexpr quantity<R2{}, std::remove_cvref_t<Rep2>> operator*(Rep2&& lhs, R2);
template<typename Value>
requires detail::RepSafeConstructibleFrom<rep, Value>
constexpr explicit quantity(Value&& v) : number_(std::forward<Value>(v))
{
}
};
// CTAD
@@ -465,7 +470,7 @@ template<Quantity Q1, Quantity Q2>
{
constexpr auto ref = common_reference(Q1::reference, Q2::reference);
using ret = quantity<ref, decltype(lhs.number() + rhs.number())>;
return ret(ret(lhs).number() + ret(rhs).number());
return (ret(lhs).number() + ret(rhs).number()) * ref;
}
template<Quantity Q1, Quantity Q2>
@@ -476,7 +481,7 @@ template<Quantity Q1, Quantity Q2>
{
constexpr auto ref = common_reference(Q1::reference, Q2::reference);
using ret = quantity<ref, decltype(lhs.number() - rhs.number())>;
return ret(ret(lhs).number() - ret(rhs).number());
return (ret(lhs).number() - ret(rhs).number()) * ref;
}
template<Quantity Q1, Quantity Q2>