diff --git a/example/conversion_factor.cpp b/example/conversion_factor.cpp index 34501e2b..a3b81051 100644 --- a/example/conversion_factor.cpp +++ b/example/conversion_factor.cpp @@ -33,7 +33,7 @@ template requires std::constructible_from inline constexpr double conversion_factor(Target, Source) { - return mp_units::value_cast(1. * Source::reference).value(); + return mp_units::value_cast(1. * Source::reference).numerical_value(); } } // namespace @@ -56,5 +56,6 @@ int main() std::cout << MP_UNITS_STD_FMT::format("conversion factor from lengthA::unit of {:%q} to lengthB::unit of {:%q}:\n\n", lengthA, lengthB) << MP_UNITS_STD_FMT::format("lengthB.value( {} ) == lengthA.value( {} ) * conversion_factor( {} )\n", - lengthB.value(), lengthA.value(), conversion_factor(lengthB, lengthA)); + lengthB.numerical_value(), lengthA.numerical_value(), + conversion_factor(lengthB, lengthA)); } diff --git a/example/currency.cpp b/example/currency.cpp index 8d465a17..587f1f7d 100644 --- a/example/currency.cpp +++ b/example/currency.cpp @@ -75,14 +75,15 @@ template template auto To, ReferenceOf auto From, typename Rep> quantity exchange_to(quantity q) { - return static_cast(exchange_rate() * q.value()) * To; + return static_cast(exchange_rate() * q.numerical_value()) * To; } template auto To, ReferenceOf auto From, auto PO, typename Rep> quantity_point exchange_to(quantity_point q) { return quantity_point{ - zero + static_cast(exchange_rate() * (q - q.absolute_point_origin).value()) * To}; + zero + + static_cast(exchange_rate() * (q - q.absolute_point_origin).numerical_value()) * To}; } int main() diff --git a/example/include/geographic.h b/example/include/geographic.h index 01d6b5f2..574b0865 100644 --- a/example/include/geographic.h +++ b/example/include/geographic.h @@ -74,19 +74,19 @@ using longitude = template std::basic_ostream& operator<<(std::basic_ostream& os, const latitude& lat) { - if (lat.value() > 0) - return os << "N" << lat.value(); + if (lat.numerical_value() > 0) + return os << "N" << lat.numerical_value(); else - return os << "S" << -lat.value(); + return os << "S" << -lat.numerical_value(); } template std::basic_ostream& operator<<(std::basic_ostream& os, const longitude& lon) { - if (lon.value() > 0) - return os << "E" << lon.value(); + if (lon.numerical_value() > 0) + return os << "E" << lon.numerical_value(); else - return os << "W" << -lon.value(); + return os << "W" << -lon.numerical_value(); } inline namespace literals { @@ -129,7 +129,8 @@ struct MP_UNITS_STD_FMT::formatter> : formatter { auto format(geographic::latitude lat, FormatContext& ctx) { MP_UNITS_STD_FMT::format_to(ctx.out(), "{}", lat > geographic::latitude::zero() ? 'N' : 'S'); - return formatter::format(lat > geographic::latitude::zero() ? lat.value() : -lat.value(), ctx); + return formatter::format(lat > geographic::latitude::zero() ? lat.numerical_value() : -lat.numerical_value(), + ctx); } }; @@ -139,7 +140,8 @@ struct MP_UNITS_STD_FMT::formatter> : formatter { auto format(geographic::longitude lon, FormatContext& ctx) { MP_UNITS_STD_FMT::format_to(ctx.out(), "{}", lon > geographic::longitude::zero() ? 'E' : 'W'); - return formatter::format(lon > geographic::longitude::zero() ? lon.value() : -lon.value(), ctx); + return formatter::format(lon > geographic::longitude::zero() ? lon.numerical_value() : -lon.numerical_value(), + ctx); } }; diff --git a/example/unmanned_aerial_vehicle.cpp b/example/unmanned_aerial_vehicle.cpp index f6cc20d6..56ecd828 100644 --- a/example/unmanned_aerial_vehicle.cpp +++ b/example/unmanned_aerial_vehicle.cpp @@ -96,8 +96,9 @@ double GeographicLibWhatsMyOffset(long double /* lat */, long double /* lon */) template hae_altitude to_hae(msl_altitude msl, position pos) { - const auto geoid_undulation = - isq::height(GeographicLibWhatsMyOffset(pos.lat.value_in(si::degree), pos.lon.value_in(si::degree)) * si::metre); + const auto geoid_undulation = isq::height( + GeographicLibWhatsMyOffset(pos.lat.numerical_value_in(si::degree), pos.lon.numerical_value_in(si::degree)) * + si::metre); return height_above_ellipsoid + (msl - mean_sea_level - geoid_undulation); } diff --git a/src/core-fmt/include/mp-units/format.h b/src/core-fmt/include/mp-units/format.h index 7d204491..81257f4a 100644 --- a/src/core-fmt/include/mp-units/format.h +++ b/src/core-fmt/include/mp-units/format.h @@ -226,7 +226,7 @@ struct quantity_formatter { explicit quantity_formatter(OutputIt o, quantity q, const quantity_format_specs& fspecs, Locale lc) : - out(o), val(std::move(q).value()), specs(fspecs), loc(std::move(lc)) + out(o), val(std::move(q).numerical_value()), specs(fspecs), loc(std::move(lc)) { } @@ -396,7 +396,7 @@ private: if (begin == end || *begin == '}') { // default format should print value followed by the unit separated with 1 space - out = mp_units::detail::format_units_quantity_value(out, q.value(), specs.rep, ctx.locale()); + out = mp_units::detail::format_units_quantity_value(out, q.numerical_value(), specs.rep, ctx.locale()); if constexpr (mp_units::detail::has_unit_symbol(get_unit(Reference))) { *out++ = CharT(' '); out = unit_symbol_to(out, get_unit(Reference)); diff --git a/src/core-io/include/mp-units/ostream.h b/src/core-io/include/mp-units/ostream.h index 2329c42e..ae09f23a 100644 --- a/src/core-io/include/mp-units/ostream.h +++ b/src/core-io/include/mp-units/ostream.h @@ -36,9 +36,9 @@ void to_stream(std::basic_ostream& os, const quantity& q) { if constexpr (is_same_v || is_same_v) // promote the value to int - os << +q.value(); + os << +q.numerical_value(); else - os << q.value(); + os << q.numerical_value(); if constexpr (has_unit_symbol(get_unit(R))) { os << " "; unit_symbol_to(std::ostream_iterator(os), get_unit(R)); @@ -49,7 +49,7 @@ void to_stream(std::basic_ostream& os, const quantity& q) template std::basic_ostream& operator<<(std::basic_ostream& os, const quantity& q) - requires requires { os << q.value(); } + requires requires { os << q.numerical_value(); } { if (os.width()) { // std::setw() applies to the whole quantity output so it has to be first put into std::string diff --git a/src/core/include/mp-units/bits/quantity_cast.h b/src/core/include/mp-units/bits/quantity_cast.h index 65d51c2d..fea62a49 100644 --- a/src/core/include/mp-units/bits/quantity_cast.h +++ b/src/core/include/mp-units/bits/quantity_cast.h @@ -51,9 +51,9 @@ template { if constexpr (detail::QuantityKindSpec> && AssociatedUnit>) - return make_quantity(std::forward(q).value()); + return make_quantity(std::forward(q).numerical_value()); else - return make_quantity{}>(std::forward(q).value()); + return make_quantity{}>(std::forward(q).numerical_value()); } } // namespace mp_units diff --git a/src/core/include/mp-units/bits/sudo_cast.h b/src/core/include/mp-units/bits/sudo_cast.h index 7dd8f680..e8a2c1f0 100644 --- a/src/core/include/mp-units/bits/sudo_cast.h +++ b/src/core/include/mp-units/bits/sudo_cast.h @@ -63,10 +63,10 @@ template if constexpr (q_unit == To::unit) { // no scaling of the number needed return make_quantity(static_cast( - std::forward(q).value())); // 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 + std::forward(q).numerical_value())); // 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 constexpr Magnitude auto c_mag = get_canonical_unit(q_unit).mag / get_canonical_unit(To::unit).mag; @@ -78,8 +78,8 @@ template using multiplier_type = conditional, std::common_type_t, c_mag_type>; constexpr auto val = [](Magnitude auto m) { return get_value(m); }; - return static_cast(static_cast(std::forward(q).value()) * val(num) / - val(den) * val(irr)) * + return static_cast(static_cast(std::forward(q).numerical_value()) * + val(num) / val(den) * val(irr)) * To::reference; } } diff --git a/src/core/include/mp-units/quantity.h b/src/core/include/mp-units/quantity.h index 42204cec..13d9e9fa 100644 --- a/src/core/include/mp-units/quantity.h +++ b/src/core/include/mp-units/quantity.h @@ -126,7 +126,7 @@ public: template Q> constexpr explicit(!std::convertible_to) quantity(const Q& q) : - value_(detail::sudo_cast(q).value()) + value_(detail::sudo_cast(q).numerical_value()) { } @@ -149,17 +149,17 @@ public: return std::forward(self).value_; } #else - [[nodiscard]] constexpr rep& value() & noexcept { return value_; } - [[nodiscard]] constexpr const rep& value() const& noexcept { return value_; } - [[nodiscard]] constexpr rep&& value() && noexcept { return std::move(value_); } - [[nodiscard]] constexpr const rep&& value() const&& noexcept { return std::move(value_); } + [[nodiscard]] constexpr rep& numerical_value() & noexcept { return value_; } + [[nodiscard]] constexpr const rep& numerical_value() const& noexcept { return value_; } + [[nodiscard]] constexpr rep&& numerical_value() && noexcept { return std::move(value_); } + [[nodiscard]] constexpr const rep&& numerical_value() const&& noexcept { return std::move(value_); } #endif template requires requires(quantity q) { q.in(U{}); } - [[nodiscard]] constexpr rep value_in(U) const noexcept + [[nodiscard]] constexpr rep numerical_value_in(U) const noexcept { - return (*this).in(U{}).value(); + return (*this).in(U{}).numerical_value(); } template @@ -177,7 +177,7 @@ public: } -> std::common_with; } { - return make_quantity(+value()); + return make_quantity(+numerical_value()); } [[nodiscard]] constexpr Quantity auto operator-() const @@ -187,7 +187,7 @@ public: } -> std::common_with; } { - return make_quantity(-value()); + return make_quantity(-numerical_value()); } constexpr quantity& operator++() @@ -239,7 +239,7 @@ public: } -> std::same_as; } { - value_ += q.value(); + value_ += q.numerical_value(); return *this; } @@ -250,7 +250,7 @@ public: } -> std::same_as; } { - value_ -= q.value(); + value_ -= q.numerical_value(); return *this; } @@ -274,7 +274,7 @@ public: } constexpr quantity& operator*=(const Q& rhs) { - value_ *= rhs.value(); + value_ *= rhs.numerical_value(); return *this; } @@ -299,8 +299,8 @@ public: } constexpr quantity& operator/=(const Q& rhs) { - gsl_ExpectsAudit(rhs.value() != quantity_values::zero()); - value_ /= rhs.value(); + gsl_ExpectsAudit(rhs.numerical_value() != quantity_values::zero()); + value_ /= rhs.numerical_value(); return *this; } @@ -311,8 +311,8 @@ public: } -> std::same_as; } { - gsl_ExpectsAudit(q.value() != quantity_values::zero()); - value_ %= q.value(); + gsl_ExpectsAudit(q.numerical_value() != quantity_values::zero()); + value_ %= q.numerical_value(); return *this; } @@ -341,7 +341,7 @@ template [[nodiscard]] constexpr Quantity auto operator+(const quantity& lhs, const quantity& rhs) { using ret = detail::common_quantity_for, quantity, quantity>; - return make_quantity(ret(lhs).value() + ret(rhs).value()); + return make_quantity(ret(lhs).numerical_value() + ret(rhs).numerical_value()); } template @@ -349,7 +349,7 @@ template [[nodiscard]] constexpr Quantity auto operator-(const quantity& lhs, const quantity& rhs) { using ret = detail::common_quantity_for, quantity, quantity>; - return make_quantity(ret(lhs).value() - ret(rhs).value()); + return make_quantity(ret(lhs).numerical_value() - ret(rhs).numerical_value()); } template @@ -357,7 +357,7 @@ template Rep2> [[nodiscard]] constexpr Quantity auto operator*(const quantity& lhs, const quantity& rhs) { - return make_quantity(lhs.value() * rhs.value()); + return make_quantity(lhs.numerical_value() * rhs.numerical_value()); } template @@ -365,7 +365,7 @@ template detail::InvokeResultOf, Rep, const Value&> [[nodiscard]] constexpr Quantity auto operator*(const quantity& q, const Value& v) { - return make_quantity(q.value() * v); + return make_quantity(q.numerical_value() * v); } template @@ -373,15 +373,15 @@ template detail::InvokeResultOf, const Value&, Rep> [[nodiscard]] constexpr Quantity auto operator*(const Value& v, const quantity& q) { - return make_quantity(v * q.value()); + return make_quantity(v * q.numerical_value()); } template requires detail::InvokeResultOf<(get_quantity_spec(R1) / get_quantity_spec(R2)).character, std::divides<>, Rep1, Rep2> [[nodiscard]] constexpr Quantity auto operator/(const quantity& lhs, const quantity& rhs) { - gsl_ExpectsAudit(rhs.value() != quantity_values::zero()); - return make_quantity(lhs.value() / rhs.value()); + gsl_ExpectsAudit(rhs.numerical_value() != quantity_values::zero()); + return make_quantity(lhs.numerical_value() / rhs.numerical_value()); } template @@ -390,7 +390,7 @@ template [[nodiscard]] constexpr Quantity auto operator/(const quantity& q, const Value& v) { gsl_ExpectsAudit(v != quantity_values::zero()); - return make_quantity(q.value() / v); + return make_quantity(q.numerical_value() / v); } template @@ -398,7 +398,7 @@ template detail::InvokeResultOf, const Value&, Rep> [[nodiscard]] constexpr Quantity auto operator/(const Value& v, const quantity& q) { - return make_quantity<::mp_units::one / R>(v / q.value()); + return make_quantity<::mp_units::one / R>(v / q.numerical_value()); } template @@ -406,9 +406,9 @@ template detail::InvocableQuantities, quantity, quantity> [[nodiscard]] constexpr Quantity auto operator%(const quantity& lhs, const quantity& rhs) { - gsl_ExpectsAudit(rhs.value() != quantity_values::zero()); + gsl_ExpectsAudit(rhs.numerical_value() != quantity_values::zero()); using ret = detail::common_quantity_for, quantity, quantity>; - return make_quantity(ret(lhs).value() % ret(rhs).value()); + return make_quantity(ret(lhs).numerical_value() % ret(rhs).numerical_value()); } template @@ -417,7 +417,7 @@ template [[nodiscard]] constexpr bool operator==(const quantity& lhs, const quantity& rhs) { using ct = std::common_type_t, quantity>; - return ct(lhs).value() == ct(rhs).value(); + return ct(lhs).numerical_value() == ct(rhs).numerical_value(); } template @@ -426,7 +426,7 @@ template [[nodiscard]] constexpr auto operator<=>(const quantity& lhs, const quantity& rhs) { using ct = std::common_type_t, quantity>; - return ct(lhs).value() <=> ct(rhs).value(); + return ct(lhs).numerical_value() <=> ct(rhs).numerical_value(); } // make_quantity diff --git a/src/core/include/mp-units/quantity_spec.h b/src/core/include/mp-units/quantity_spec.h index ad381cc1..0bd2fe95 100644 --- a/src/core/include/mp-units/quantity_spec.h +++ b/src/core/include/mp-units/quantity_spec.h @@ -111,7 +111,7 @@ struct quantity_spec_interface { requires Quantity> && (explicitly_convertible(std::remove_reference_t::quantity_spec, self)) { - return make_quantity::unit>{}>(std::forward(q).value()); + return make_quantity::unit>{}>(std::forward(q).numerical_value()); } #else template U> @@ -128,7 +128,7 @@ struct quantity_spec_interface { (explicitly_convertible(std::remove_reference_t::quantity_spec, Self_{})) [[nodiscard]] constexpr Quantity auto operator()(Q&& q) const { - return make_quantity::unit>{}>(std::forward(q).value()); + return make_quantity::unit>{}>(std::forward(q).numerical_value()); } #endif }; @@ -307,7 +307,7 @@ struct quantity_spec : std::remove_const_t { (explicitly_convertible(std::remove_reference_t::quantity_spec, Self_{})) [[nodiscard]] constexpr Quantity auto operator()(Q&& q) const { - return make_quantity::unit>{}>(std::forward(q).value()); + return make_quantity::unit>{}>(std::forward(q).numerical_value()); } #endif }; diff --git a/src/utility/include/mp-units/chrono.h b/src/utility/include/mp-units/chrono.h index 44e6f333..aca9ad48 100644 --- a/src/utility/include/mp-units/chrono.h +++ b/src/utility/include/mp-units/chrono.h @@ -92,7 +92,7 @@ template Q> { constexpr auto canonical = detail::get_canonical_unit(Q::unit); constexpr ratio r = as_ratio(canonical.mag); - return std::chrono::duration>{q.value()}; + return std::chrono::duration>{q.numerical_value()}; } template QP> diff --git a/src/utility/include/mp-units/math.h b/src/utility/include/mp-units/math.h index d3f6d591..e367ce4b 100644 --- a/src/utility/include/mp-units/math.h +++ b/src/utility/include/mp-units/math.h @@ -54,7 +54,7 @@ template requires detail::non_zero && requires { quantity_values::one(); } [[nodiscard]] constexpr quantity(R), Rep> pow(const quantity& q) noexcept - requires requires { pow(q.value(), 1.0); } || requires { std::pow(q.value(), 1.0); } + requires requires { pow(q.numerical_value(), 1.0); } || requires { std::pow(q.numerical_value(), 1.0); } { if constexpr (Num == 0) { return quantity(R), Rep>::one(); @@ -63,7 +63,7 @@ template } else { using std::pow; return make_quantity(R)>( - static_cast(pow(q.value(), static_cast(Num) / static_cast(Den)))); + static_cast(pow(q.numerical_value(), static_cast(Num) / static_cast(Den)))); } } @@ -77,10 +77,10 @@ template */ template [[nodiscard]] constexpr quantity sqrt(const quantity& q) noexcept - requires requires { sqrt(q.value()); } || requires { std::sqrt(q.value()); } + requires requires { sqrt(q.numerical_value()); } || requires { std::sqrt(q.numerical_value()); } { using std::sqrt; - return make_quantity(static_cast(sqrt(q.value()))); + return make_quantity(static_cast(sqrt(q.numerical_value()))); } /** @@ -93,10 +93,10 @@ template */ template [[nodiscard]] constexpr quantity cbrt(const quantity& q) noexcept - requires requires { cbrt(q.value()); } || requires { std::cbrt(q.value()); } + requires requires { cbrt(q.numerical_value()); } || requires { std::cbrt(q.numerical_value()); } { using std::cbrt; - return make_quantity(static_cast(cbrt(q.value()))); + return make_quantity(static_cast(cbrt(q.numerical_value()))); } /** @@ -109,11 +109,11 @@ template */ template auto R, typename Rep> [[nodiscard]] constexpr quantity exp(const quantity& q) - requires requires { exp(q.value()); } || requires { std::exp(q.value()); } + requires requires { exp(q.numerical_value()); } || requires { std::exp(q.numerical_value()); } { using std::exp; return value_cast( - make_quantity(R)>(static_cast(exp(value_cast(q).value())))); + make_quantity(R)>(static_cast(exp(value_cast(q).numerical_value())))); } /** @@ -124,10 +124,10 @@ template auto R, typename Rep> */ template [[nodiscard]] constexpr quantity abs(const quantity& q) noexcept - requires requires { abs(q.value()); } || requires { std::abs(q.value()); } + requires requires { abs(q.numerical_value()); } || requires { std::abs(q.numerical_value()); } { using std::abs; - return make_quantity(static_cast(abs(q.value()))); + return make_quantity(static_cast(abs(q.numerical_value()))); } /** @@ -153,7 +153,8 @@ template */ template [[nodiscard]] constexpr quantity(R), Rep> floor(const quantity& q) noexcept - requires((!treat_as_floating_point) || requires { floor(q.value()); } || requires { std::floor(q.value()); }) && + requires((!treat_as_floating_point) || requires { floor(q.numerical_value()); } || + requires { std::floor(q.numerical_value()); }) && (To == get_unit(R) || requires { ::mp_units::value_cast(q); quantity_values::one(); @@ -168,10 +169,10 @@ template if constexpr (treat_as_floating_point) { using std::floor; if constexpr (To == get_unit(R)) { - return make_quantity(R)>(static_cast(floor(q.value()))); + return make_quantity(R)>(static_cast(floor(q.numerical_value()))); } else { - return handle_signed_results( - make_quantity(R)>(static_cast(floor(value_cast(q).value())))); + return handle_signed_results(make_quantity(R)>( + static_cast(floor(value_cast(q).numerical_value())))); } } else { if constexpr (To == get_unit(R)) { @@ -190,7 +191,8 @@ template */ template [[nodiscard]] constexpr quantity(R), Rep> ceil(const quantity& q) noexcept - requires((!treat_as_floating_point) || requires { ceil(q.value()); } || requires { std::ceil(q.value()); }) && + requires((!treat_as_floating_point) || requires { ceil(q.numerical_value()); } || + requires { std::ceil(q.numerical_value()); }) && (To == get_unit(R) || requires { ::mp_units::value_cast(q); quantity_values::one(); @@ -205,10 +207,10 @@ template if constexpr (treat_as_floating_point) { using std::ceil; if constexpr (To == get_unit(R)) { - return make_quantity(R)>(static_cast(ceil(q.value()))); + return make_quantity(R)>(static_cast(ceil(q.numerical_value()))); } else { - return handle_signed_results( - make_quantity(R)>(static_cast(ceil(value_cast(q).value())))); + return handle_signed_results(make_quantity(R)>( + static_cast(ceil(value_cast(q).numerical_value())))); } } else { if constexpr (To == get_unit(R)) { @@ -229,7 +231,8 @@ template */ template [[nodiscard]] constexpr quantity(R), Rep> round(const quantity& q) noexcept - requires((!treat_as_floating_point) || requires { round(q.value()); } || requires { std::round(q.value()); }) && + requires((!treat_as_floating_point) || requires { round(q.numerical_value()); } || + requires { std::round(q.numerical_value()); }) && (To == get_unit(R) || requires { ::mp_units::floor(q); quantity_values::one(); @@ -238,7 +241,7 @@ template if constexpr (To == get_unit(R)) { if constexpr (treat_as_floating_point) { using std::round; - return make_quantity(R)>(static_cast(round(q.value()))); + return make_quantity(R)>(static_cast(round(q.numerical_value()))); } else { return value_cast(q); } @@ -248,7 +251,7 @@ template const auto diff0 = q - res_low; const auto diff1 = res_high - q; if (diff0 == diff1) { - if (static_cast(res_low.value()) & 1) { + if (static_cast(res_low.numerical_value()) & 1) { return res_high; } return res_low; @@ -269,12 +272,13 @@ template const quantity& x, const quantity& y) noexcept requires requires { common_reference(R1, R2); } && ( - requires { hypot(x.value(), y.value()); } || requires { std::hypot(x.value(), y.value()); }) + requires { hypot(x.numerical_value(), y.numerical_value()); } || + requires { std::hypot(x.numerical_value(), y.numerical_value()); }) { constexpr auto ref = common_reference(R1, R2); constexpr auto unit = get_unit(ref); using std::hypot; - return make_quantity(hypot(x.value_in(unit), y.value_in(unit))); + return make_quantity(hypot(x.numerical_value_in(unit), y.numerical_value_in(unit))); } /** @@ -284,100 +288,101 @@ template template [[nodiscard]] constexpr QuantityOf auto hypot( const quantity& x, const quantity& y, const quantity& z) noexcept - requires requires { common_reference(R1, R2, R3); } && ( - requires { hypot(x.value(), y.value(), z.value()); } || - requires { std::hypot(x.value(), y.value(), z.value()); }) + requires requires { common_reference(R1, R2, R3); } && + ( + requires { hypot(x.numerical_value(), y.numerical_value(), z.numerical_value()); } || + requires { std::hypot(x.numerical_value(), y.numerical_value(), z.numerical_value()); }) { constexpr auto ref = common_reference(R1, R2); constexpr auto unit = get_unit(ref); using std::hypot; - return make_quantity(hypot(x.value_in(unit), y.value_in(unit), z.value_in(unit))); + return make_quantity(hypot(x.numerical_value_in(unit), y.numerical_value_in(unit), z.numerical_value_in(unit))); } namespace isq { template auto R, typename Rep> [[nodiscard]] inline QuantityOf auto sin(const quantity& q) noexcept - requires requires { sin(q.value()); } || requires { std::sin(q.value()); } + requires requires { sin(q.numerical_value()); } || requires { std::sin(q.numerical_value()); } { using std::sin; if constexpr (!treat_as_floating_point) { // check what is the return type when called with the integral value - using rep = decltype(sin(value_cast(q).value())); + using rep = decltype(sin(value_cast(q).numerical_value())); // use this type ahead of calling the function to prevent narrowing if a unit conversion is needed - return make_quantity(sin(value_cast(q).value_in(si::radian))); + return make_quantity(sin(value_cast(q).numerical_value_in(si::radian))); } else - return make_quantity(sin(q.value_in(si::radian))); + return make_quantity(sin(q.numerical_value_in(si::radian))); } template auto R, typename Rep> [[nodiscard]] inline QuantityOf auto cos(const quantity& q) noexcept - requires requires { cos(q.value()); } || requires { std::cos(q.value()); } + requires requires { cos(q.numerical_value()); } || requires { std::cos(q.numerical_value()); } { using std::cos; if constexpr (!treat_as_floating_point) { // check what is the return type when called with the integral value - using rep = decltype(cos(value_cast(q).value())); + using rep = decltype(cos(value_cast(q).numerical_value())); // use this type ahead of calling the function to prevent narrowing if a unit conversion is needed - return make_quantity(cos(value_cast(q).value_in(si::radian))); + return make_quantity(cos(value_cast(q).numerical_value_in(si::radian))); } else - return make_quantity(cos(q.value_in(si::radian))); + return make_quantity(cos(q.numerical_value_in(si::radian))); } template auto R, typename Rep> [[nodiscard]] inline QuantityOf auto tan(const quantity& q) noexcept - requires requires { tan(q.value()); } || requires { std::tan(q.value()); } + requires requires { tan(q.numerical_value()); } || requires { std::tan(q.numerical_value()); } { using std::tan; if constexpr (!treat_as_floating_point) { // check what is the return type when called with the integral value - using rep = decltype(tan(value_cast(q).value())); + using rep = decltype(tan(value_cast(q).numerical_value())); // use this type ahead of calling the function to prevent narrowing if a unit conversion is needed - return make_quantity(tan(value_cast(q).value_in(si::radian))); + return make_quantity(tan(value_cast(q).numerical_value_in(si::radian))); } else - return make_quantity(tan(q.value_in(si::radian))); + return make_quantity(tan(q.numerical_value_in(si::radian))); } template auto R, typename Rep> [[nodiscard]] inline QuantityOf auto asin(const quantity& q) noexcept - requires requires { asin(q.value()); } || requires { std::asin(q.value()); } + requires requires { asin(q.numerical_value()); } || requires { std::asin(q.numerical_value()); } { using std::asin; if constexpr (!treat_as_floating_point) { // check what is the return type when called with the integral value - using rep = decltype(asin(value_cast(q).value())); + using rep = decltype(asin(value_cast(q).numerical_value())); // use this type ahead of calling the function to prevent narrowing if a unit conversion is needed - return make_quantity(asin(value_cast(q).value_in(one))); + return make_quantity(asin(value_cast(q).numerical_value_in(one))); } else - return make_quantity(asin(q.value_in(one))); + return make_quantity(asin(q.numerical_value_in(one))); } template auto R, typename Rep> [[nodiscard]] inline QuantityOf auto acos(const quantity& q) noexcept - requires requires { acos(q.value()); } || requires { std::acos(q.value()); } + requires requires { acos(q.numerical_value()); } || requires { std::acos(q.numerical_value()); } { using std::acos; if constexpr (!treat_as_floating_point) { // check what is the return type when called with the integral value - using rep = decltype(acos(value_cast(q).value())); + using rep = decltype(acos(value_cast(q).numerical_value())); // use this type ahead of calling the function to prevent narrowing if a unit conversion is needed - return make_quantity(acos(value_cast(q).value_in(one))); + return make_quantity(acos(value_cast(q).numerical_value_in(one))); } else - return make_quantity(acos(q.value_in(one))); + return make_quantity(acos(q.numerical_value_in(one))); } template auto R, typename Rep> [[nodiscard]] inline QuantityOf auto atan(const quantity& q) noexcept - requires requires { atan(q.value()); } || requires { std::atan(q.value()); } + requires requires { atan(q.numerical_value()); } || requires { std::atan(q.numerical_value()); } { using std::atan; if constexpr (!treat_as_floating_point) { // check what is the return type when called with the integral value - using rep = decltype(atan(value_cast(q).value())); + using rep = decltype(atan(value_cast(q).numerical_value())); // use this type ahead of calling the function to prevent narrowing if a unit conversion is needed - return make_quantity(atan(value_cast(q).value_in(one))); + return make_quantity(atan(value_cast(q).numerical_value_in(one))); } else - return make_quantity(atan(q.value_in(one))); + return make_quantity(atan(q.numerical_value_in(one))); } } // namespace isq @@ -386,86 +391,86 @@ namespace angular { template auto R, typename Rep> [[nodiscard]] inline QuantityOf auto sin(const quantity& q) noexcept - requires requires { sin(q.value()); } || requires { std::sin(q.value()); } + requires requires { sin(q.numerical_value()); } || requires { std::sin(q.numerical_value()); } { using std::sin; if constexpr (!treat_as_floating_point) { // check what is the return type when called with the integral value - using rep = decltype(sin(value_cast(q).value())); + using rep = decltype(sin(value_cast(q).numerical_value())); // use this type ahead of calling the function to prevent narrowing if a unit conversion is needed - return make_quantity(sin(value_cast(q).value_in(radian))); + return make_quantity(sin(value_cast(q).numerical_value_in(radian))); } else - return make_quantity(sin(q.value_in(radian))); + return make_quantity(sin(q.numerical_value_in(radian))); } template auto R, typename Rep> [[nodiscard]] inline QuantityOf auto cos(const quantity& q) noexcept - requires requires { cos(q.value()); } || requires { std::cos(q.value()); } + requires requires { cos(q.numerical_value()); } || requires { std::cos(q.numerical_value()); } { using std::cos; if constexpr (!treat_as_floating_point) { // check what is the return type when called with the integral value - using rep = decltype(cos(value_cast(q).value())); + using rep = decltype(cos(value_cast(q).numerical_value())); // use this type ahead of calling the function to prevent narrowing if a unit conversion is needed - return make_quantity(cos(value_cast(q).value_in(radian))); + return make_quantity(cos(value_cast(q).numerical_value_in(radian))); } else - return make_quantity(cos(q.value_in(radian))); + return make_quantity(cos(q.numerical_value_in(radian))); } template auto R, typename Rep> [[nodiscard]] inline QuantityOf auto tan(const quantity& q) noexcept - requires requires { tan(q.value()); } || requires { std::tan(q.value()); } + requires requires { tan(q.numerical_value()); } || requires { std::tan(q.numerical_value()); } { using std::tan; if constexpr (!treat_as_floating_point) { // check what is the return type when called with the integral value - using rep = decltype(tan(value_cast(q).value())); + using rep = decltype(tan(value_cast(q).numerical_value())); // use this type ahead of calling the function to prevent narrowing if a unit conversion is needed - return make_quantity(tan(value_cast(q).value_in(radian))); + return make_quantity(tan(value_cast(q).numerical_value_in(radian))); } else - return make_quantity(tan(q.value_in(radian))); + return make_quantity(tan(q.numerical_value_in(radian))); } template auto R, typename Rep> [[nodiscard]] inline QuantityOf auto asin(const quantity& q) noexcept - requires requires { asin(q.value()); } || requires { std::asin(q.value()); } + requires requires { asin(q.numerical_value()); } || requires { std::asin(q.numerical_value()); } { using std::asin; if constexpr (!treat_as_floating_point) { // check what is the return type when called with the integral value - using rep = decltype(asin(value_cast(q).value())); + using rep = decltype(asin(value_cast(q).numerical_value())); // use this type ahead of calling the function to prevent narrowing if a unit conversion is needed - return make_quantity(asin(value_cast(q).value_in(one))); + return make_quantity(asin(value_cast(q).numerical_value_in(one))); } else - return make_quantity(asin(q.value_in(one))); + return make_quantity(asin(q.numerical_value_in(one))); } template auto R, typename Rep> [[nodiscard]] inline QuantityOf auto acos(const quantity& q) noexcept - requires requires { acos(q.value()); } || requires { std::acos(q.value()); } + requires requires { acos(q.numerical_value()); } || requires { std::acos(q.numerical_value()); } { using std::acos; if constexpr (!treat_as_floating_point) { // check what is the return type when called with the integral value - using rep = decltype(acos(value_cast(q).value())); + using rep = decltype(acos(value_cast(q).numerical_value())); // use this type ahead of calling the function to prevent narrowing if a unit conversion is needed - return make_quantity(acos(value_cast(q).value_in(one))); + return make_quantity(acos(value_cast(q).numerical_value_in(one))); } else - return make_quantity(acos(q.value_in(one))); + return make_quantity(acos(q.numerical_value_in(one))); } template auto R, typename Rep> [[nodiscard]] inline QuantityOf auto atan(const quantity& q) noexcept - requires requires { atan(q.value()); } || requires { std::atan(q.value()); } + requires requires { atan(q.numerical_value()); } || requires { std::atan(q.numerical_value()); } { using std::atan; if constexpr (!treat_as_floating_point) { // check what is the return type when called with the integral value - using rep = decltype(atan(value_cast(q).value())); + using rep = decltype(atan(value_cast(q).numerical_value())); // use this type ahead of calling the function to prevent narrowing if a unit conversion is needed - return make_quantity(atan(value_cast(q).value_in(one))); + return make_quantity(atan(value_cast(q).numerical_value_in(one))); } else - return make_quantity(atan(q.value_in(one))); + return make_quantity(atan(q.numerical_value_in(one))); } } // namespace angular diff --git a/src/utility/include/mp-units/random.h b/src/utility/include/mp-units/random.h index 837a6925..2c26b97a 100644 --- a/src/utility/include/mp-units/random.h +++ b/src/utility/include/mp-units/random.h @@ -35,7 +35,7 @@ static std::vector i_qty_to_rep(InputIt first, InputIt last) std::vector intervals_rep; intervals_rep.reserve(static_cast(std::distance(first, last))); for (auto itr = first; itr != last; ++itr) { - intervals_rep.push_back(itr->value()); + intervals_rep.push_back(itr->numerical_value()); } return intervals_rep; } @@ -46,7 +46,7 @@ static std::vector bl_qty_to_rep(std::initializer_list& bl) std::vector bl_rep; bl_rep.reserve(bl.size()); for (const Q& qty : bl) { - bl_rep.push_back(qty.value()); + bl_rep.push_back(qty.numerical_value()); } return bl_rep; } @@ -88,7 +88,7 @@ struct uniform_int_distribution : public std::uniform_int_distribution; uniform_int_distribution() : base() {} - uniform_int_distribution(const Q& a, const Q& b) : base(a.value(), b.value()) {} + uniform_int_distribution(const Q& a, const Q& b) : base(a.numerical_value(), b.numerical_value()) {} template Q operator()(Generator& g) @@ -110,7 +110,7 @@ struct uniform_real_distribution : public std::uniform_real_distribution; uniform_real_distribution() : base() {} - uniform_real_distribution(const Q& a, const Q& b) : base(a.value(), b.value()) {} + uniform_real_distribution(const Q& a, const Q& b) : base(a.numerical_value(), b.numerical_value()) {} template Q operator()(Generator& g) @@ -132,7 +132,7 @@ struct binomial_distribution : public std::binomial_distribution; binomial_distribution() : base() {} - binomial_distribution(const Q& t, double p) : base(t.value(), p) {} + binomial_distribution(const Q& t, double p) : base(t.numerical_value(), p) {} template Q operator()(Generator& g) @@ -153,7 +153,7 @@ struct negative_binomial_distribution : public std::negative_binomial_distributi using base = MP_UNITS_TYPENAME std::negative_binomial_distribution; negative_binomial_distribution() : base() {} - negative_binomial_distribution(const Q& k, double p) : base(k.value(), p) {} + negative_binomial_distribution(const Q& k, double p) : base(k.numerical_value(), p) {} template Q operator()(Generator& g) @@ -269,7 +269,7 @@ struct extreme_value_distribution : public std::extreme_value_distribution; extreme_value_distribution() : base() {} - extreme_value_distribution(const Q& a, const rep& b) : base(a.value(), b) {} + extreme_value_distribution(const Q& a, const rep& b) : base(a.numerical_value(), b) {} template Q operator()(Generator& g) @@ -290,7 +290,7 @@ struct normal_distribution : public std::normal_distribution { using base = MP_UNITS_TYPENAME std::normal_distribution; normal_distribution() : base() {} - normal_distribution(const Q& mean, const Q& stddev) : base(mean.value(), stddev.value()) {} + normal_distribution(const Q& mean, const Q& stddev) : base(mean.numerical_value(), stddev.numerical_value()) {} template Q operator()(Generator& g) @@ -312,7 +312,7 @@ struct lognormal_distribution : public std::lognormal_distribution; lognormal_distribution() : base() {} - lognormal_distribution(const Q& m, const Q& s) : base(m.value(), s.value()) {} + lognormal_distribution(const Q& m, const Q& s) : base(m.numerical_value(), s.numerical_value()) {} template Q operator()(Generator& g) @@ -353,7 +353,7 @@ struct cauchy_distribution : public std::cauchy_distribution { using base = MP_UNITS_TYPENAME std::cauchy_distribution; cauchy_distribution() : base() {} - cauchy_distribution(const Q& a, const Q& b) : base(a.value(), b.value()) {} + cauchy_distribution(const Q& a, const Q& b) : base(a.numerical_value(), b.numerical_value()) {} template Q operator()(Generator& g) @@ -470,7 +470,7 @@ public: template piecewise_constant_distribution(std::size_t nw, const Q& xmin, const Q& xmax, UnaryOperation fw) : - base(nw, xmin.value(), xmax.value(), [fw](rep val) { return fw(val * Q::reference); }) + base(nw, xmin.numerical_value(), xmax.numerical_value(), [fw](rep val) { return fw(val * Q::reference); }) { } @@ -528,7 +528,7 @@ public: template piecewise_linear_distribution(std::size_t nw, const Q& xmin, const Q& xmax, UnaryOperation fw) : - base(nw, xmin.value(), xmax.value(), [fw](rep val) { return fw(val * Q::reference); }) + base(nw, xmin.numerical_value(), xmax.numerical_value(), [fw](rep val) { return fw(val * Q::reference); }) { } diff --git a/test/unit_test/runtime/almost_equals.h b/test/unit_test/runtime/almost_equals.h index 4bf5c499..69b972c1 100644 --- a/test/unit_test/runtime/almost_equals.h +++ b/test/unit_test/runtime/almost_equals.h @@ -36,8 +36,8 @@ struct AlmostEqualsMatcher : Catch::Matchers::MatcherGenericBase { { using std::abs; using common = std::common_type_t; - const auto x = common(target_).value(); - const auto y = common(other).value(); + const auto x = common(target_).numerical_value(); + const auto y = common(other).numerical_value(); const auto maxXYOne = std::max({typename T::rep{1}, abs(x), abs(y)}); return abs(x - y) <= std::numeric_limits::epsilon() * maxXYOne; } diff --git a/test/unit_test/runtime/distribution_test.cpp b/test/unit_test/runtime/distribution_test.cpp index 347fe6c6..b7f45971 100644 --- a/test/unit_test/runtime/distribution_test.cpp +++ b/test/unit_test/runtime/distribution_test.cpp @@ -559,7 +559,8 @@ TEST_CASE("piecewise_constant_distribution") 3.0 * isq::length[si::metre]}; auto stl_dist = std::piecewise_constant_distribution(intervals_rep, [](rep val) { return val; }); - auto units_dist = mp_units::piecewise_constant_distribution(intervals_qty, [](q qty) { return qty.value(); }); + auto units_dist = + mp_units::piecewise_constant_distribution(intervals_qty, [](q qty) { return qty.numerical_value(); }); CHECK(units_dist.intervals() == intervals_qty_vec); CHECK(units_dist.densities() == stl_dist.densities()); @@ -573,7 +574,7 @@ TEST_CASE("piecewise_constant_distribution") auto stl_dist = std::piecewise_constant_distribution(nw, xmin_rep, xmax_rep, [](rep val) { return val; }); auto units_dist = - mp_units::piecewise_constant_distribution(nw, xmin_qty, xmax_qty, [](q qty) { return qty.value(); }); + mp_units::piecewise_constant_distribution(nw, xmin_qty, xmax_qty, [](q qty) { return qty.numerical_value(); }); CHECK(units_dist.intervals() == intervals_qty_vec); CHECK(units_dist.densities() == stl_dist.densities()); @@ -626,7 +627,8 @@ TEST_CASE("piecewise_linear_distribution") 3.0 * isq::length[si::metre]}; auto stl_dist = std::piecewise_linear_distribution(intervals_rep, [](rep val) { return val; }); - auto units_dist = mp_units::piecewise_linear_distribution(intervals_qty, [](q qty) { return qty.value(); }); + auto units_dist = + mp_units::piecewise_linear_distribution(intervals_qty, [](q qty) { return qty.numerical_value(); }); CHECK(units_dist.intervals() == intervals_qty_vec); CHECK(units_dist.densities() == stl_dist.densities()); @@ -640,7 +642,7 @@ TEST_CASE("piecewise_linear_distribution") auto stl_dist = std::piecewise_linear_distribution(nw, xmin_rep, xmax_rep, [](rep val) { return val; }); auto units_dist = - mp_units::piecewise_linear_distribution(nw, xmin_qty, xmax_qty, [](q qty) { return qty.value(); }); + mp_units::piecewise_linear_distribution(nw, xmin_qty, xmax_qty, [](q qty) { return qty.numerical_value(); }); CHECK(units_dist.intervals() == intervals_qty_vec); CHECK(units_dist.densities() == stl_dist.densities()); diff --git a/test/unit_test/runtime/linear_algebra_test.cpp b/test/unit_test/runtime/linear_algebra_test.cpp index a1ebb353..35ef3464 100644 --- a/test/unit_test/runtime/linear_algebra_test.cpp +++ b/test/unit_test/runtime/linear_algebra_test.cpp @@ -71,7 +71,7 @@ template requires(typename Q1::rep v1, typename Q2::rep v2) { cross_product(v1, v2); } [[nodiscard]] QuantityOf auto cross_product(const Q1& q1, const Q2& q2) { - return cross_product(q1.value(), q2.value()) * (Q1::reference * Q2::reference); + return cross_product(q1.numerical_value(), q2.numerical_value()) * (Q1::reference * Q2::reference); } } // namespace @@ -83,21 +83,21 @@ TEST_CASE("vector quantity", "[la]") SECTION("non-truncating") { const auto v = vector{3, 2, 1} * isq::position_vector[km]; - CHECK(v.in(m).value() == vector{3000, 2000, 1000}); + CHECK(v.in(m).numerical_value() == vector{3000, 2000, 1000}); } SECTION("truncating") { const auto v = vector{1001, 1002, 1003} * isq::position_vector[m]; - CHECK(value_cast(v).value() == vector{1, 1, 1}); + CHECK(value_cast(v).numerical_value() == vector{1, 1, 1}); } } SECTION("to scalar magnitude") { const auto v = vector{2, 3, 6} * isq::velocity[km / h]; - const auto speed = get_magnitude(v.value()) * isq::speed[v.unit]; // TODO can we do better here? - CHECK(speed.value() == 7); + const auto speed = get_magnitude(v.numerical_value()) * isq::speed[v.unit]; // TODO can we do better here? + CHECK(speed.numerical_value() == 7); } SECTION("multiply by scalar value") @@ -106,14 +106,14 @@ TEST_CASE("vector quantity", "[la]") SECTION("integral") { - SECTION("scalar on LHS") { CHECK((2 * v).value() == vector{2, 4, 6}); } - SECTION("scalar on RHS") { CHECK((v * 2).value() == vector{2, 4, 6}); } + SECTION("scalar on LHS") { CHECK((2 * v).numerical_value() == vector{2, 4, 6}); } + SECTION("scalar on RHS") { CHECK((v * 2).numerical_value() == vector{2, 4, 6}); } } SECTION("floating-point") { - SECTION("scalar on LHS") { CHECK((0.5 * v).value() == vector{0.5, 1., 1.5}); } - SECTION("scalar on RHS") { CHECK((v * 0.5).value() == vector{0.5, 1., 1.5}); } + SECTION("scalar on LHS") { CHECK((0.5 * v).numerical_value() == vector{0.5, 1., 1.5}); } + SECTION("scalar on RHS") { CHECK((v * 0.5).numerical_value() == vector{0.5, 1., 1.5}); } } } @@ -121,8 +121,8 @@ TEST_CASE("vector quantity", "[la]") { const auto v = vector{2, 4, 6} * isq::position_vector[m]; - SECTION("integral") { CHECK((v / 2).value() == vector{1, 2, 3}); } - SECTION("floating-point") { CHECK((v / 0.5).value() == vector{4., 8., 12.}); } + SECTION("integral") { CHECK((v / 2).numerical_value() == vector{1, 2, 3}); } + SECTION("floating-point") { CHECK((v / 0.5).numerical_value() == vector{4., 8., 12.}); } } SECTION("add") @@ -132,12 +132,12 @@ TEST_CASE("vector quantity", "[la]") SECTION("same unit") { const auto u = vector{3, 2, 1} * isq::position_vector[m]; - CHECK((v + u).value() == vector{4, 4, 4}); + CHECK((v + u).numerical_value() == vector{4, 4, 4}); } SECTION("different units") { const auto u = vector{3, 2, 1} * isq::position_vector[km]; - CHECK((v + u).value() == vector{3001, 2002, 1003}); + CHECK((v + u).numerical_value() == vector{3001, 2002, 1003}); } } @@ -148,12 +148,12 @@ TEST_CASE("vector quantity", "[la]") SECTION("same unit") { const auto u = vector{3, 2, 1} * isq::position_vector[m]; - CHECK((v - u).value() == vector{-2, 0, 2}); + CHECK((v - u).numerical_value() == vector{-2, 0, 2}); } SECTION("different units") { const auto u = vector{3, 2, 1} * isq::position_vector[km]; - CHECK((v - u).value() == vector{-2999, -1998, -997}); + CHECK((v - u).numerical_value() == vector{-2999, -1998, -997}); } } @@ -167,25 +167,31 @@ TEST_CASE("vector quantity", "[la]") SECTION("derived_quantity_spec") { - SECTION("scalar on LHS") { CHECK((mass * v).value() == vector{2, 4, 6}); } - SECTION("scalar on RHS") { CHECK((v * mass).value() == vector{2, 4, 6}); } + SECTION("scalar on LHS") { CHECK((mass * v).numerical_value() == vector{2, 4, 6}); } + SECTION("scalar on RHS") { CHECK((v * mass).numerical_value() == vector{2, 4, 6}); } } SECTION("quantity_cast to momentum") { - SECTION("scalar on LHS") { CHECK(quantity_cast(mass * v).value() == vector{2, 4, 6}); } - SECTION("scalar on RHS") { CHECK(quantity_cast(v * mass).value() == vector{2, 4, 6}); } + SECTION("scalar on LHS") + { + CHECK(quantity_cast(mass * v).numerical_value() == vector{2, 4, 6}); + } + SECTION("scalar on RHS") + { + CHECK(quantity_cast(v * mass).numerical_value() == vector{2, 4, 6}); + } } SECTION("quantity of momentum") { SECTION("scalar on LHS") { const quantity> momentum = mass * v; - CHECK(momentum.value() == vector{2, 4, 6}); + CHECK(momentum.numerical_value() == vector{2, 4, 6}); } SECTION("scalar on RHS") { const quantity> momentum = v * mass; - CHECK(momentum.value() == vector{2, 4, 6}); + CHECK(momentum.numerical_value() == vector{2, 4, 6}); } } } @@ -196,18 +202,18 @@ TEST_CASE("vector quantity", "[la]") SECTION("derived_quantity_spec") { - SECTION("scalar on LHS") { CHECK((mass * v).value() == vector{0.5, 1., 1.5}); } - SECTION("scalar on RHS") { CHECK((v * mass).value() == vector{0.5, 1., 1.5}); } + SECTION("scalar on LHS") { CHECK((mass * v).numerical_value() == vector{0.5, 1., 1.5}); } + SECTION("scalar on RHS") { CHECK((v * mass).numerical_value() == vector{0.5, 1., 1.5}); } } SECTION("quantity_cast to momentum") { SECTION("scalar on LHS") { - CHECK(quantity_cast(mass * v).value() == vector{0.5, 1., 1.5}); + CHECK(quantity_cast(mass * v).numerical_value() == vector{0.5, 1., 1.5}); } SECTION("scalar on RHS") { - CHECK(quantity_cast(v * mass).value() == vector{0.5, 1., 1.5}); + CHECK(quantity_cast(v * mass).numerical_value() == vector{0.5, 1., 1.5}); } } SECTION("quantity of momentum") @@ -215,12 +221,12 @@ TEST_CASE("vector quantity", "[la]") SECTION("scalar on LHS") { const quantity> momentum = mass * v; - CHECK(momentum.value() == vector{0.5, 1., 1.5}); + CHECK(momentum.numerical_value() == vector{0.5, 1., 1.5}); } SECTION("scalar on RHS") { const quantity> momentum = v * mass; - CHECK(momentum.value() == vector{0.5, 1., 1.5}); + CHECK(momentum.numerical_value() == vector{0.5, 1., 1.5}); } } } @@ -234,15 +240,15 @@ TEST_CASE("vector quantity", "[la]") { const auto dur = 2 * isq::duration[h]; - SECTION("derived_quantity_spec") { CHECK((pos / dur).value() == vector{15, 10, 5}); } + SECTION("derived_quantity_spec") { CHECK((pos / dur).numerical_value() == vector{15, 10, 5}); } SECTION("quantity_cast to velocity") { - CHECK(quantity_cast(pos / dur).value() == vector{15, 10, 5}); + CHECK(quantity_cast(pos / dur).numerical_value() == vector{15, 10, 5}); } SECTION("quantity of velocity") { const quantity> v = pos / dur; - CHECK(v.value() == vector{15, 10, 5}); + CHECK(v.numerical_value() == vector{15, 10, 5}); } } @@ -250,15 +256,15 @@ TEST_CASE("vector quantity", "[la]") { const auto dur = 0.5 * isq::duration[h]; - SECTION("derived_quantity_spec") { CHECK((pos / dur).value() == vector{60, 40, 20}); } + SECTION("derived_quantity_spec") { CHECK((pos / dur).numerical_value() == vector{60, 40, 20}); } SECTION("quantity_cast to velocity") { - CHECK(quantity_cast(pos / dur).value() == vector{60, 40, 20}); + CHECK(quantity_cast(pos / dur).numerical_value() == vector{60, 40, 20}); } SECTION("quantity of velocity") { const quantity> v = pos / dur; - CHECK(v.value() == vector{60, 40, 20}); + CHECK(v.numerical_value() == vector{60, 40, 20}); } } } @@ -294,8 +300,8 @@ TEST_CASE("vector of quantities", "[la]") SECTION("to scalar magnitude") { const vector> v = {2 * (km / h), 3 * (km / h), 6 * (km / h)}; - const auto speed = get_magnitude(v).value() * isq::speed[v(0).unit]; // TODO can we do better here? - CHECK(speed.value() == 7); + const auto speed = get_magnitude(v).numerical_value() * isq::speed[v(0).unit]; // TODO can we do better here? + CHECK(speed.numerical_value() == 7); } SECTION("multiply by scalar value") diff --git a/test/unit_test/runtime/math_test.cpp b/test/unit_test/runtime/math_test.cpp index fda646c6..4e838273 100644 --- a/test/unit_test/runtime/math_test.cpp +++ b/test/unit_test/runtime/math_test.cpp @@ -90,12 +90,13 @@ TEST_CASE("numeric_limits functions", "[limits]") { SECTION("'epsilon' works as expected using default floating type") { - REQUIRE(epsilon(isq::length[m]).value() == + REQUIRE(epsilon(isq::length[m]).numerical_value() == std::numeric_limits::epsilon()); } SECTION("'epsilon' works as expected using integers") { - REQUIRE(epsilon(isq::length[m]).value() == std::numeric_limits::epsilon()); + REQUIRE(epsilon(isq::length[m]).numerical_value() == + std::numeric_limits::epsilon()); } } diff --git a/test/unit_test/static/quantity_point_test.cpp b/test/unit_test/static/quantity_point_test.cpp index 1ccdd56e..71e0457b 100644 --- a/test/unit_test/static/quantity_point_test.cpp +++ b/test/unit_test/static/quantity_point_test.cpp @@ -241,16 +241,16 @@ static_assert( // static member functions //////////////////////////// -static_assert(quantity_point::zero().quantity_from_origin().value() == 0); -static_assert(quantity_point::min().quantity_from_origin().value() == +static_assert(quantity_point::zero().quantity_from_origin().numerical_value() == 0); +static_assert(quantity_point::min().quantity_from_origin().numerical_value() == std::numeric_limits::lowest()); -static_assert(quantity_point::max().quantity_from_origin().value() == +static_assert(quantity_point::max().quantity_from_origin().numerical_value() == std::numeric_limits::max()); -static_assert(quantity_point::zero().quantity_from_origin().value() == 0); -static_assert(quantity_point::min().quantity_from_origin().value() == +static_assert(quantity_point::zero().quantity_from_origin().numerical_value() == 0); +static_assert(quantity_point::min().quantity_from_origin().numerical_value() == std::numeric_limits::lowest()); -static_assert(quantity_point::max().quantity_from_origin().value() == +static_assert(quantity_point::max().quantity_from_origin().numerical_value() == std::numeric_limits::max()); @@ -576,15 +576,15 @@ static_assert(is_of_type<(ground_level + isq::height(short(42) * m)).point_for(m // converting to a different unit /////////////////////////////////// -static_assert((mean_sea_level + 2. * km).in(km).quantity_from_origin().value() == 2.); -static_assert((mean_sea_level + 2. * km).in(m).quantity_from_origin().value() == 2000.); -static_assert((mean_sea_level + 2000. * m).in(km).quantity_from_origin().value() == 2.); -static_assert((ground_level + 2. * km).in(km).quantity_from_origin().value() == 2.); -static_assert((ground_level + 2. * km).in(m).quantity_from_origin().value() == 2000.); -static_assert((ground_level + 2000. * m).in(km).quantity_from_origin().value() == 2.); -static_assert((tower_peak + 2. * km).in(km).quantity_from_origin().value() == 2.); -static_assert((tower_peak + 2. * km).in(m).quantity_from_origin().value() == 2000.); -static_assert((tower_peak + 2000. * m).in(km).quantity_from_origin().value() == 2.); +static_assert((mean_sea_level + 2. * km).in(km).quantity_from_origin().numerical_value() == 2.); +static_assert((mean_sea_level + 2. * km).in(m).quantity_from_origin().numerical_value() == 2000.); +static_assert((mean_sea_level + 2000. * m).in(km).quantity_from_origin().numerical_value() == 2.); +static_assert((ground_level + 2. * km).in(km).quantity_from_origin().numerical_value() == 2.); +static_assert((ground_level + 2. * km).in(m).quantity_from_origin().numerical_value() == 2000.); +static_assert((ground_level + 2000. * m).in(km).quantity_from_origin().numerical_value() == 2.); +static_assert((tower_peak + 2. * km).in(km).quantity_from_origin().numerical_value() == 2.); +static_assert((tower_peak + 2. * km).in(m).quantity_from_origin().numerical_value() == 2000.); +static_assert((tower_peak + 2000. * m).in(km).quantity_from_origin().numerical_value() == 2.); #if MP_UNITS_COMP_GCC != 10 || MP_UNITS_COMP_GCC_MINOR > 2 template typename QP> @@ -657,14 +657,14 @@ static_assert([](auto v) { //////////////////////// // same type -static_assert((mean_sea_level + 1 * m += 1 * m).quantity_from_origin().value() == 2); -static_assert((mean_sea_level + 2 * m -= 1 * m).quantity_from_origin().value() == 1); +static_assert((mean_sea_level + 1 * m += 1 * m).quantity_from_origin().numerical_value() == 2); +static_assert((mean_sea_level + 2 * m -= 1 * m).quantity_from_origin().numerical_value() == 1); // different types -static_assert((mean_sea_level + 2.5 * m += 3 * m).quantity_from_origin().value() == 5.5); -static_assert((mean_sea_level + 123 * m += 1 * km).quantity_from_origin().value() == 1123); -static_assert((mean_sea_level + 5.5 * m -= 3 * m).quantity_from_origin().value() == 2.5); -static_assert((mean_sea_level + 1123 * m -= 1 * km).quantity_from_origin().value() == 123); +static_assert((mean_sea_level + 2.5 * m += 3 * m).quantity_from_origin().numerical_value() == 5.5); +static_assert((mean_sea_level + 123 * m += 1 * km).quantity_from_origin().numerical_value() == 1123); +static_assert((mean_sea_level + 5.5 * m -= 3 * m).quantity_from_origin().numerical_value() == 2.5); +static_assert((mean_sea_level + 1123 * m -= 1 * km).quantity_from_origin().numerical_value() == 123); template typename QP> @@ -936,24 +936,29 @@ static_assert(is_of_type<(1 * m + tower_peak) - (1 * m + other_ground_level), qu // check for integral types promotion static_assert( - is_same_v); + is_same_v< + decltype(((mean_sea_level + std::uint8_t(0) * m) + std::uint8_t(0) * m).quantity_from_origin().numerical_value()), + int&&>); static_assert( - is_same_v); + is_same_v< + decltype((std::uint8_t(0) * m + (mean_sea_level + std::uint8_t(0) * m)).quantity_from_origin().numerical_value()), + int&&>); static_assert( - is_same_v); + is_same_v< + decltype(((mean_sea_level + std::uint8_t(0) * m) - std::uint8_t(0) * m).quantity_from_origin().numerical_value()), + int&&>); +static_assert(is_same_v); static_assert( - is_same_v); -static_assert(((mean_sea_level + std::uint8_t(128) * m) + std::uint8_t(128) * m).quantity_from_origin().value() == - std::uint8_t(128) + std::uint8_t(128)); -static_assert((std::uint8_t(128) * m + (mean_sea_level + std::uint8_t(128) * m)).quantity_from_origin().value() == - std::uint8_t(128) + std::uint8_t(128)); -static_assert(((mean_sea_level + std::uint8_t(0) * m) - std::uint8_t(1) * m).quantity_from_origin().value() == + ((mean_sea_level + std::uint8_t(128) * m) + std::uint8_t(128) * m).quantity_from_origin().numerical_value() == + std::uint8_t(128) + std::uint8_t(128)); +static_assert( + (std::uint8_t(128) * m + (mean_sea_level + std::uint8_t(128) * m)).quantity_from_origin().numerical_value() == + std::uint8_t(128) + std::uint8_t(128)); +static_assert(((mean_sea_level + std::uint8_t(0) * m) - std::uint8_t(1) * m).quantity_from_origin().numerical_value() == std::uint8_t(0) - std::uint8_t(1)); -static_assert(((mean_sea_level + std::uint8_t(0) * m) - (mean_sea_level + std::uint8_t(1) * m)).value() == +static_assert(((mean_sea_level + std::uint8_t(0) * m) - (mean_sea_level + std::uint8_t(1) * m)).numerical_value() == std::uint8_t(0) - std::uint8_t(1)); // different representation types @@ -1008,39 +1013,39 @@ static_assert(is_of_type<(mean_sea_level + 1 * km) - (mean_sea_level + 1. * m), static_assert(is_of_type<(mean_sea_level + 1. * km) - (mean_sea_level + 1. * m), quantity>); -static_assert(((mean_sea_level + 1 * m) + 1 * m).quantity_from_origin().value() == 2); -static_assert((1 * m + (mean_sea_level + 1 * m)).quantity_from_origin().value() == 2); -static_assert(((mean_sea_level + 1 * m) + 1 * km).quantity_from_origin().value() == 1001); -static_assert((1 * m + (mean_sea_level + 1 * km)).quantity_from_origin().value() == 1001); -static_assert(((mean_sea_level + 1 * km) + 1 * m).quantity_from_origin().value() == 1001); -static_assert((1 * km + (mean_sea_level + 1 * m)).quantity_from_origin().value() == 1001); -static_assert(((mean_sea_level + 2 * m) - 1 * m).quantity_from_origin().value() == 1); -static_assert(((mean_sea_level + 1 * km) - 1 * m).quantity_from_origin().value() == 999); +static_assert(((mean_sea_level + 1 * m) + 1 * m).quantity_from_origin().numerical_value() == 2); +static_assert((1 * m + (mean_sea_level + 1 * m)).quantity_from_origin().numerical_value() == 2); +static_assert(((mean_sea_level + 1 * m) + 1 * km).quantity_from_origin().numerical_value() == 1001); +static_assert((1 * m + (mean_sea_level + 1 * km)).quantity_from_origin().numerical_value() == 1001); +static_assert(((mean_sea_level + 1 * km) + 1 * m).quantity_from_origin().numerical_value() == 1001); +static_assert((1 * km + (mean_sea_level + 1 * m)).quantity_from_origin().numerical_value() == 1001); +static_assert(((mean_sea_level + 2 * m) - 1 * m).quantity_from_origin().numerical_value() == 1); +static_assert(((mean_sea_level + 1 * km) - 1 * m).quantity_from_origin().numerical_value() == 999); -static_assert(((mean_sea_level + 1.5 * m) + 1 * m).quantity_from_origin().value() == 2.5); -static_assert((1.5 * m + (mean_sea_level + 1 * m)).quantity_from_origin().value() == 2.5); -static_assert(((mean_sea_level + 1.5 * m) + 1 * km).quantity_from_origin().value() == 1001.5); -static_assert((1.5 * m + (mean_sea_level + 1 * km)).quantity_from_origin().value() == 1001.5); -static_assert(((mean_sea_level + 1.5 * km) + 1 * m).quantity_from_origin().value() == 1501); -static_assert((1.5 * km + (mean_sea_level + 1 * m)).quantity_from_origin().value() == 1501); -static_assert(((mean_sea_level + 2.5 * m) - 1 * m).quantity_from_origin().value() == 1.5); -static_assert(((mean_sea_level + 1.5 * km) - 1 * m).quantity_from_origin().value() == 1499); +static_assert(((mean_sea_level + 1.5 * m) + 1 * m).quantity_from_origin().numerical_value() == 2.5); +static_assert((1.5 * m + (mean_sea_level + 1 * m)).quantity_from_origin().numerical_value() == 2.5); +static_assert(((mean_sea_level + 1.5 * m) + 1 * km).quantity_from_origin().numerical_value() == 1001.5); +static_assert((1.5 * m + (mean_sea_level + 1 * km)).quantity_from_origin().numerical_value() == 1001.5); +static_assert(((mean_sea_level + 1.5 * km) + 1 * m).quantity_from_origin().numerical_value() == 1501); +static_assert((1.5 * km + (mean_sea_level + 1 * m)).quantity_from_origin().numerical_value() == 1501); +static_assert(((mean_sea_level + 2.5 * m) - 1 * m).quantity_from_origin().numerical_value() == 1.5); +static_assert(((mean_sea_level + 1.5 * km) - 1 * m).quantity_from_origin().numerical_value() == 1499); -static_assert(((mean_sea_level + 1 * m) + 1.5 * m).quantity_from_origin().value() == 2.5); -static_assert((1 * m + (mean_sea_level + 1.5 * m)).quantity_from_origin().value() == 2.5); -static_assert(((mean_sea_level + 1 * m) + 1.5 * km).quantity_from_origin().value() == 1501); -static_assert((1 * m + (mean_sea_level + 1.5 * km)).quantity_from_origin().value() == 1501); -static_assert(((mean_sea_level + 1 * km) + 1.5 * m).quantity_from_origin().value() == 1001.5); -static_assert((1 * km + (mean_sea_level + 1.5 * m)).quantity_from_origin().value() == 1001.5); -static_assert(((mean_sea_level + 2 * m) - 1.5 * m).quantity_from_origin().value() == 0.5); -static_assert(((mean_sea_level + 1 * km) - 1.5 * m).quantity_from_origin().value() == 998.5); +static_assert(((mean_sea_level + 1 * m) + 1.5 * m).quantity_from_origin().numerical_value() == 2.5); +static_assert((1 * m + (mean_sea_level + 1.5 * m)).quantity_from_origin().numerical_value() == 2.5); +static_assert(((mean_sea_level + 1 * m) + 1.5 * km).quantity_from_origin().numerical_value() == 1501); +static_assert((1 * m + (mean_sea_level + 1.5 * km)).quantity_from_origin().numerical_value() == 1501); +static_assert(((mean_sea_level + 1 * km) + 1.5 * m).quantity_from_origin().numerical_value() == 1001.5); +static_assert((1 * km + (mean_sea_level + 1.5 * m)).quantity_from_origin().numerical_value() == 1001.5); +static_assert(((mean_sea_level + 2 * m) - 1.5 * m).quantity_from_origin().numerical_value() == 0.5); +static_assert(((mean_sea_level + 1 * km) - 1.5 * m).quantity_from_origin().numerical_value() == 998.5); -static_assert(((mean_sea_level + 2 * m) - (mean_sea_level + 1 * m)).value() == 1); -static_assert(((mean_sea_level + 1 * km) - (mean_sea_level + 1 * m)).value() == 999); -static_assert(((mean_sea_level + 2.5 * m) - (mean_sea_level + 1 * m)).value() == 1.5); -static_assert(((mean_sea_level + 1.5 * km) - (mean_sea_level + 1 * m)).value() == 1499); -static_assert(((mean_sea_level + 2 * m) - (mean_sea_level + 1.5 * m)).value() == 0.5); -static_assert(((mean_sea_level + 1 * km) - (mean_sea_level + 1.5 * m)).value() == 998.5); +static_assert(((mean_sea_level + 2 * m) - (mean_sea_level + 1 * m)).numerical_value() == 1); +static_assert(((mean_sea_level + 1 * km) - (mean_sea_level + 1 * m)).numerical_value() == 999); +static_assert(((mean_sea_level + 2.5 * m) - (mean_sea_level + 1 * m)).numerical_value() == 1.5); +static_assert(((mean_sea_level + 1.5 * km) - (mean_sea_level + 1 * m)).numerical_value() == 1499); +static_assert(((mean_sea_level + 2 * m) - (mean_sea_level + 1.5 * m)).numerical_value() == 0.5); +static_assert(((mean_sea_level + 1 * km) - (mean_sea_level + 1.5 * m)).numerical_value() == 998.5); static_assert((mean_sea_level + 42 * m) - (ground_level + 42 * m) == -42 * m); static_assert((ground_level + 42 * m) - (mean_sea_level + 42 * m) == 42 * m); diff --git a/test/unit_test/static/quantity_test.cpp b/test/unit_test/static/quantity_test.cpp index 76b2e3ef..c8fd713b 100644 --- a/test/unit_test/static/quantity_test.cpp +++ b/test/unit_test/static/quantity_test.cpp @@ -112,12 +112,12 @@ static_assert(is_same_v::rep, int>); // static member functions //////////////////////////// -static_assert(quantity::zero().value() == 0); -static_assert(quantity::min().value() == std::numeric_limits::lowest()); -static_assert(quantity::max().value() == std::numeric_limits::max()); -static_assert(quantity::zero().value() == 0.0); -static_assert(quantity::min().value() == std::numeric_limits::lowest()); -static_assert(quantity::max().value() == std::numeric_limits::max()); +static_assert(quantity::zero().numerical_value() == 0); +static_assert(quantity::min().numerical_value() == std::numeric_limits::lowest()); +static_assert(quantity::max().numerical_value() == std::numeric_limits::max()); +static_assert(quantity::zero().numerical_value() == 0.0); +static_assert(quantity::min().numerical_value() == std::numeric_limits::lowest()); +static_assert(quantity::max().numerical_value() == std::numeric_limits::max()); ////////////////////////////// @@ -188,21 +188,21 @@ static_assert(std::convertible_to, quantity(123 * m).value() == 123); -static_assert(quantity(2 * km).value() == 2000); -static_assert(quantity(2 * km).value() == 2); -static_assert(quantity(1500 * m).value() == 1.5); +static_assert(quantity(123 * m).numerical_value() == 123); +static_assert(quantity(2 * km).numerical_value() == 2000); +static_assert(quantity(2 * km).numerical_value() == 2); +static_assert(quantity(1500 * m).numerical_value() == 1.5); /////////////////////////////////// // converting to a different unit /////////////////////////////////// -static_assert(quantity(2. * km).in(km).value() == 2.); -static_assert(quantity(2. * km).in(m).value() == 2000.); -static_assert(quantity(2000. * m).in(km).value() == 2.); -static_assert(quantity(2 * km).in(km).value() == 2); -static_assert(quantity(2 * km).in(m).value() == 2000); +static_assert(quantity(2. * km).in(km).numerical_value() == 2.); +static_assert(quantity(2. * km).in(m).numerical_value() == 2000.); +static_assert(quantity(2000. * m).in(km).numerical_value() == 2.); +static_assert(quantity(2 * km).in(km).numerical_value() == 2); +static_assert(quantity(2 * km).in(m).numerical_value() == 2000); #if MP_UNITS_COMP_GCC != 10 || MP_UNITS_COMP_GCC_MINOR > 2 template typename Q> @@ -213,17 +213,17 @@ concept invalid_unit_conversion = requires { static_assert(invalid_unit_conversion); #endif -static_assert(quantity(2. * km).value_in(km) == 2.); -static_assert(quantity(2. * km).value_in(m) == 2000.); -static_assert(quantity(2000. * m).value_in(km) == 2.); -static_assert(quantity(2 * km).value_in(km) == 2); -static_assert(quantity(2 * km).value_in(m) == 2000); +static_assert(quantity(2. * km).numerical_value_in(km) == 2.); +static_assert(quantity(2. * km).numerical_value_in(m) == 2000.); +static_assert(quantity(2000. * m).numerical_value_in(km) == 2.); +static_assert(quantity(2 * km).numerical_value_in(km) == 2); +static_assert(quantity(2 * km).numerical_value_in(m) == 2000); #if MP_UNITS_COMP_GCC != 10 || MP_UNITS_COMP_GCC_MINOR > 2 template typename Q> concept invalid_getter_with_unit_conversion = requires { - requires !requires { Q(2000 * m).value_in(km); }; // truncating conversion - requires !requires { Q(2 * m).value_in(s); }; // invalid unit + requires !requires { Q(2000 * m).numerical_value_in(km); }; // truncating conversion + requires !requires { Q(2 * m).numerical_value_in(s); }; // invalid unit }; static_assert(invalid_getter_with_unit_conversion); #endif @@ -302,28 +302,28 @@ static_assert([] { auto l1(1 * m), l2(2 * m); return l2 = l1; }() - .value() == 1); + .numerical_value() == 1); static_assert([] { const auto l1(1 * m); auto l2(2 * m); return l2 = l1; }() - .value() == 1); + .numerical_value() == 1); static_assert([]() { auto l1(1 * m), l2(2 * m); return l2 = std::move(l1); }() - .value() == 1); + .numerical_value() == 1); //////////////////// // unary operators //////////////////// -static_assert((+123 * m).value() == 123); -static_assert((-123 * m).value() == -123); -static_assert((+(-123 * m)).value() == -123); -static_assert((-(-123 * m)).value() == 123); +static_assert((+123 * m).numerical_value() == 123); +static_assert((-123 * m).numerical_value() == -123); +static_assert((+(-123 * m)).numerical_value() == -123); +static_assert((-(-123 * m)).numerical_value() == 123); static_assert([](auto v) { auto vv = v++; @@ -342,7 +342,7 @@ static_assert([](auto v) { return std::pair(v, vv); }(123 * m) == std::pair(122 * m, 122 * m)); -static_assert(is_same_v); +static_assert(is_same_v); //////////////////////// @@ -350,29 +350,29 @@ static_assert(is_same_v); //////////////////////// // same type -static_assert((1 * m += 1 * m).value() == 2); -static_assert((2 * m -= 1 * m).value() == 1); -static_assert((1 * m *= 2).value() == 2); -static_assert((2 * m /= 2).value() == 1); -static_assert((1 * m *= 2 * one).value() == 2); -static_assert((2 * m /= 2 * one).value() == 1); -static_assert((7 * m %= 2 * m).value() == 1); +static_assert((1 * m += 1 * m).numerical_value() == 2); +static_assert((2 * m -= 1 * m).numerical_value() == 1); +static_assert((1 * m *= 2).numerical_value() == 2); +static_assert((2 * m /= 2).numerical_value() == 1); +static_assert((1 * m *= 2 * one).numerical_value() == 2); +static_assert((2 * m /= 2 * one).numerical_value() == 1); +static_assert((7 * m %= 2 * m).numerical_value() == 1); // different types -static_assert((2.5 * m += 3 * m).value() == 5.5); -static_assert((123 * m += 1 * km).value() == 1123); -static_assert((5.5 * m -= 3 * m).value() == 2.5); -static_assert((1123 * m -= 1 * km).value() == 123); -static_assert((2.5 * m *= 3).value() == 7.5); -static_assert((7.5 * m /= 3).value() == 2.5); -static_assert((2.5 * m *= 3 * one).value() == 7.5); -static_assert((7.5 * m /= 3 * one).value() == 2.5); -static_assert((3500 * m %= 1 * km).value() == 500); +static_assert((2.5 * m += 3 * m).numerical_value() == 5.5); +static_assert((123 * m += 1 * km).numerical_value() == 1123); +static_assert((5.5 * m -= 3 * m).numerical_value() == 2.5); +static_assert((1123 * m -= 1 * km).numerical_value() == 123); +static_assert((2.5 * m *= 3).numerical_value() == 7.5); +static_assert((7.5 * m /= 3).numerical_value() == 2.5); +static_assert((2.5 * m *= 3 * one).numerical_value() == 7.5); +static_assert((7.5 * m /= 3 * one).numerical_value() == 2.5); +static_assert((3500 * m %= 1 * km).numerical_value() == 500); -// static_assert((std::uint8_t(255) * m %= 256 * m).value() != [] { std::uint8_t ui(255); return ui %= 256; }()); // -// UB +// static_assert((std::uint8_t(255) * m %= 256 * m).numerical_value() != [] { std::uint8_t ui(255); return ui %= 256; +// }()); // UB // TODO: Fix -static_assert((std::uint8_t(255) * m %= 257 * m).value() != [] { +static_assert((std::uint8_t(255) * m %= 257 * m).numerical_value() != [] { std::uint8_t ui(255); return ui %= 257; }()); @@ -382,10 +382,10 @@ static_assert((std::uint8_t(255) * m %= 257 * m).value() != [] { #ifndef MP_UNITS_COMP_MSVC // next two lines trigger conversions warnings // (warning disabled in CMake for this file) -static_assert((22 * m *= 33.33).value() == 733); -static_assert((22 * m /= 3.33).value() == 6); -static_assert((22 * m *= 33.33 * one).value() == 733); -static_assert((22 * m /= 3.33 * one).value() == 6); +static_assert((22 * m *= 33.33).numerical_value() == 733); +static_assert((22 * m /= 3.33).numerical_value() == 6); +static_assert((22 * m *= 33.33 * one).numerical_value() == 733); +static_assert((22 * m /= 3.33 * one).numerical_value() == 6); #endif template typename Q> @@ -510,12 +510,13 @@ static_assert(is_of_type<1 * km % (300 * m), quantity>); static_assert(is_of_type<4 * one % (2 * one), quantity>); // check for integral types promotion -static_assert(is_same_v); -static_assert(is_same_v); -static_assert((std::uint8_t(128) * m + std::uint8_t(128) * m).value() == std::uint8_t(128) + std::uint8_t(128)); -static_assert((std::uint8_t(0) * m - std::uint8_t(1) * m).value() == std::uint8_t(0) - std::uint8_t(1)); +static_assert(is_same_v); +static_assert(is_same_v); +static_assert((std::uint8_t(128) * m + std::uint8_t(128) * m).numerical_value() == + std::uint8_t(128) + std::uint8_t(128)); +static_assert((std::uint8_t(0) * m - std::uint8_t(1) * m).numerical_value() == std::uint8_t(0) - std::uint8_t(1)); -static_assert(is_same_v); // different representation types @@ -589,67 +590,67 @@ static_assert(is_of_type<1 * m / (1 * s), quantity>{}, int>>); static_assert(is_of_type<1 * min / (1 * m), quantity>{}, int>>); -static_assert((1 * m + 1 * m).value() == 2); -static_assert((1 * m + 1 * km).value() == 1001); -static_assert((1 * km + 1 * m).value() == 1001); -static_assert((2 * m - 1 * m).value() == 1); -static_assert((1 * km - 1 * m).value() == 999); -static_assert((2 * m * 2).value() == 4); -static_assert((2 * m * (2 * one)).value() == 4); -static_assert((2 * m * (2 * percent)).value() == 4); -static_assert((3 * 3 * m).value() == 9); -static_assert(((3 * one) * (3 * m)).value() == 9); -static_assert(((3 * percent) * (3 * m)).value() == 9); -static_assert((4 * m / 2).value() == 2); -static_assert((4 * m / (2 * one)).value() == 2); -static_assert((4 * m / (2 * percent)).value() == 2); -static_assert((4 * km / (2 * m)).value() == 2); -static_assert((4000 * m / (2 * m)).value() == 2000); +static_assert((1 * m + 1 * m).numerical_value() == 2); +static_assert((1 * m + 1 * km).numerical_value() == 1001); +static_assert((1 * km + 1 * m).numerical_value() == 1001); +static_assert((2 * m - 1 * m).numerical_value() == 1); +static_assert((1 * km - 1 * m).numerical_value() == 999); +static_assert((2 * m * 2).numerical_value() == 4); +static_assert((2 * m * (2 * one)).numerical_value() == 4); +static_assert((2 * m * (2 * percent)).numerical_value() == 4); +static_assert((3 * 3 * m).numerical_value() == 9); +static_assert(((3 * one) * (3 * m)).numerical_value() == 9); +static_assert(((3 * percent) * (3 * m)).numerical_value() == 9); +static_assert((4 * m / 2).numerical_value() == 2); +static_assert((4 * m / (2 * one)).numerical_value() == 2); +static_assert((4 * m / (2 * percent)).numerical_value() == 2); +static_assert((4 * km / (2 * m)).numerical_value() == 2); +static_assert((4000 * m / (2 * m)).numerical_value() == 2000); -static_assert((1.5 * m + 1 * m).value() == 2.5); -static_assert((1.5 * m + 1 * km).value() == 1001.5); -static_assert((1.5 * km + 1 * m).value() == 1501); -static_assert((2.5 * m - 1 * m).value() == 1.5); -static_assert((1.5 * km - 1 * m).value() == 1499); -static_assert((2.5 * m * 2).value() == 5); -static_assert((2.5 * m * (2 * one)).value() == 5); -static_assert((2.5 * m * (2 * percent)).value() == 5); -static_assert((2.5L * (2 * m)).value() == 5); -static_assert((2.5L * one * (2 * m)).value() == 5); -static_assert((2.5L * percent * (2 * m)).value() == 5); -static_assert((5. * m / 2).value() == 2.5); -static_assert((5. * m / (2 * one)).value() == 2.5); -static_assert((5. * m / (2 * percent)).value() == 2.5); -static_assert((5. * km / (2 * m)).value() == 2.5); -static_assert((5000. * m / (2 * m)).value() == 2500); +static_assert((1.5 * m + 1 * m).numerical_value() == 2.5); +static_assert((1.5 * m + 1 * km).numerical_value() == 1001.5); +static_assert((1.5 * km + 1 * m).numerical_value() == 1501); +static_assert((2.5 * m - 1 * m).numerical_value() == 1.5); +static_assert((1.5 * km - 1 * m).numerical_value() == 1499); +static_assert((2.5 * m * 2).numerical_value() == 5); +static_assert((2.5 * m * (2 * one)).numerical_value() == 5); +static_assert((2.5 * m * (2 * percent)).numerical_value() == 5); +static_assert((2.5L * (2 * m)).numerical_value() == 5); +static_assert((2.5L * one * (2 * m)).numerical_value() == 5); +static_assert((2.5L * percent * (2 * m)).numerical_value() == 5); +static_assert((5. * m / 2).numerical_value() == 2.5); +static_assert((5. * m / (2 * one)).numerical_value() == 2.5); +static_assert((5. * m / (2 * percent)).numerical_value() == 2.5); +static_assert((5. * km / (2 * m)).numerical_value() == 2.5); +static_assert((5000. * m / (2 * m)).numerical_value() == 2500); -static_assert((1 * m + 1.5 * m).value() == 2.5); -static_assert((1 * m + 1.5 * km).value() == 1501); -static_assert((1 * km + 1.5 * m).value() == 1001.5); -static_assert((2 * m - 1.5 * m).value() == 0.5); -static_assert((1 * km - 1.5 * m).value() == 998.5); -static_assert((2 * m * 2.5L).value() == 5); -static_assert((2 * m * (2.5L * one)).value() == 5); -static_assert((2 * m * (2.5L * percent)).value() == 5); -static_assert((2 * 2.5 * m).value() == 5); -static_assert((2 * one * (2.5 * m)).value() == 5); -static_assert((2 * percent * (2.5 * m)).value() == 5); -static_assert((5 * m / 2.5L).value() == 2); -static_assert((5 * m / (2.5L * one)).value() == 2); -static_assert((5 * m / (2.5L * percent)).value() == 2); -static_assert((5 * km / (2.5 * m)).value() == 2); -static_assert((5000 * m / (2.5 * m)).value() == 2000); +static_assert((1 * m + 1.5 * m).numerical_value() == 2.5); +static_assert((1 * m + 1.5 * km).numerical_value() == 1501); +static_assert((1 * km + 1.5 * m).numerical_value() == 1001.5); +static_assert((2 * m - 1.5 * m).numerical_value() == 0.5); +static_assert((1 * km - 1.5 * m).numerical_value() == 998.5); +static_assert((2 * m * 2.5L).numerical_value() == 5); +static_assert((2 * m * (2.5L * one)).numerical_value() == 5); +static_assert((2 * m * (2.5L * percent)).numerical_value() == 5); +static_assert((2 * 2.5 * m).numerical_value() == 5); +static_assert((2 * one * (2.5 * m)).numerical_value() == 5); +static_assert((2 * percent * (2.5 * m)).numerical_value() == 5); +static_assert((5 * m / 2.5L).numerical_value() == 2); +static_assert((5 * m / (2.5L * one)).numerical_value() == 2); +static_assert((5 * m / (2.5L * percent)).numerical_value() == 2); +static_assert((5 * km / (2.5 * m)).numerical_value() == 2); +static_assert((5000 * m / (2.5 * m)).numerical_value() == 2000); -static_assert((7 * m % (2 * m)).value() == 1); -static_assert((7 * km % (2000 * m)).value() == 1000); -static_assert((1300 * m % (1 * km)).value() == 300); -static_assert((7 * one % (2 * one)).value() == 1); +static_assert((7 * m % (2 * m)).numerical_value() == 1); +static_assert((7 * km % (2000 * m)).numerical_value() == 1000); +static_assert((1300 * m % (1 * km)).numerical_value() == 300); +static_assert((7 * one % (2 * one)).numerical_value() == 1); static_assert((10 * m2 * (10 * m2)) / (50 * m2) == 2 * m2); -static_assert((10 * km / (5 * m)).value() == 2); -static_assert((10 * km / (5 * m)).in(one).value() == 2000); -static_assert((10 * s * (2 * kHz)).value() == 20); +static_assert((10 * km / (5 * m)).numerical_value() == 2); +static_assert((10 * km / (5 * m)).in(one).numerical_value() == 2000); +static_assert((10 * s * (2 * kHz)).numerical_value() == 20); // commutativity and associativity static_assert(10 * isq::length[si::metre] / (2 * isq::time[s]) + 5 * isq::speed[m / s] == 10 * isq::speed[m / s]); @@ -733,12 +734,13 @@ static_assert(is_same_v); static_assert(1 * one - 30 * percent == (100 - 30) * percent); static_assert(1 * one + 30 * percent == (100 + 30) * percent); -static_assert(is_same_v); -static_assert(is_same_v); -static_assert((std::uint8_t(128) * one + std::uint8_t(128) * one).value() == std::uint8_t(128) + std::uint8_t(128)); -static_assert((std::uint8_t(0) * one - std::uint8_t(1) * one).value() == std::uint8_t(0) - std::uint8_t(1)); +static_assert(is_same_v); +static_assert(is_same_v); +static_assert((std::uint8_t(128) * one + std::uint8_t(128) * one).numerical_value() == + std::uint8_t(128) + std::uint8_t(128)); +static_assert((std::uint8_t(0) * one - std::uint8_t(1) * one).numerical_value() == std::uint8_t(0) - std::uint8_t(1)); -static_assert(is_same_v); static_assert(2 * one * (1 * m) == 2 * m); @@ -872,20 +874,20 @@ static_assert(!(123 * km >= 321'000 * m)); static_assert(is_of_type<10 * km / (5 * km), quantity>); -static_assert((50. * m / (100. * m)).in(percent).value() == 50); +static_assert((50. * m / (100. * m)).in(percent).numerical_value() == 50); static_assert(50. * m / (100. * m) == 50 * percent); -static_assert((50. * percent).in(one).value() == 0.5); +static_assert((50. * percent).in(one).numerical_value() == 0.5); ////////////////// // value_cast ////////////////// -static_assert(value_cast(2 * km).value() == 2000); -static_assert(value_cast(2000 * m).value() == 2); -static_assert(value_cast(1.23 * m).value() == 1); -static_assert(value_cast(2000.0 * m / (3600.0 * s)).value() == 2); +static_assert(value_cast(2 * km).numerical_value() == 2000); +static_assert(value_cast(2000 * m).numerical_value() == 2); +static_assert(value_cast(1.23 * m).numerical_value() == 1); +static_assert(value_cast(2000.0 * m / (3600.0 * s)).numerical_value() == 2); ////////////////// // quantity_cast