diff --git a/example/kalman_filter/kalman.h b/example/kalman_filter/kalman.h index 4d844b36..09867fa2 100644 --- a/example/kalman_filter/kalman.h +++ b/example/kalman_filter/kalman.h @@ -124,7 +124,7 @@ constexpr state state_update(const state& predicted, QM template K> constexpr Q covariance_update(Q uncertainty, K gain) { - return (1 - gain) * uncertainty; + return (1 * mp_units::one - gain) * uncertainty; } // state extrapolation diff --git a/example/storage_tank.cpp b/example/storage_tank.cpp index 4dccdcd6..ec74e3e4 100644 --- a/example/storage_tank.cpp +++ b/example/storage_tank.cpp @@ -121,7 +121,7 @@ int main() const QuantityOf auto input_flow_rate = measured_mass / fill_time; const QuantityOf auto float_rise_rate = fill_level / fill_time; - const QuantityOf auto fill_time_left = (height / fill_level - 1) * fill_time; + const QuantityOf auto fill_time_left = (height / fill_level - 1 * one) * fill_time; const auto fill_ratio = fill_level / height; diff --git a/src/core/include/mp-units/quantity.h b/src/core/include/mp-units/quantity.h index 850cf624..3d3642b3 100644 --- a/src/core/include/mp-units/quantity.h +++ b/src/core/include/mp-units/quantity.h @@ -147,13 +147,6 @@ public: { } - template - requires(dimension == dimension_one) && - (unit == ::mp_units::one) && detail::RepSafeConstructibleFrom - constexpr explicit(!std::convertible_to) quantity(Value&& v) : number_(std::forward(v)) - { - } - quantity& operator=(const quantity&) = default; quantity& operator=(quantity&&) = default; @@ -433,65 +426,6 @@ template return ct(lhs).number() <=> ct(rhs).number(); } -// binary operators on dimensionless quantities -template - requires(!Quantity) && (quantity::dimension == dimension_one) && - detail::InvokeResultOf, Rep, Value> -[[nodiscard]] constexpr Quantity auto operator+(const quantity& q, const Value& v) -{ - return q + make_quantity<::mp_units::one>(v); -} - -template - requires(!Quantity) && (quantity::dimension == dimension_one) && - detail::InvokeResultOf, Value, Rep> -[[nodiscard]] constexpr Quantity auto operator+(const Value& v, const quantity& q) -{ - return make_quantity<::mp_units::one>(v) + q; -} - -template - requires(!Quantity) && (quantity::dimension == dimension_one) && - detail::InvokeResultOf, Rep, Value> -[[nodiscard]] constexpr Quantity auto operator-(const quantity& q, const Value& v) -{ - return q - make_quantity<::mp_units::one>(v); -} - -template - requires(!Quantity) && (quantity::dimension == dimension_one) && - detail::InvokeResultOf, Value, Rep> -[[nodiscard]] constexpr Quantity auto operator-(const Value& v, const quantity& q) -{ - return make_quantity<::mp_units::one>(v) - q; -} - -template - requires(!Quantity) && (quantity::dimension == dimension_one) && (get_unit(R) == ::mp_units::one) && - (!treat_as_floating_point) && (!treat_as_floating_point) && - detail::InvokeResultOf, Value, Rep> -[[nodiscard]] constexpr Quantity auto operator%(const Value& v, const quantity& q) -{ - gsl_ExpectsAudit(q.number() != quantity_values::zero()); - return make_quantity(v % q.number()); -} - -template - requires(!Quantity) && - (quantity::dimension == dimension_one) && std::equality_comparable_with -[[nodiscard]] constexpr bool operator==(const quantity& q, const Value& v) -{ - return q == make_quantity<::mp_units::one>(v); -} - -template - requires(!Quantity) && - (quantity::dimension == dimension_one) && std::three_way_comparable_with -[[nodiscard]] constexpr auto operator<=>(const quantity& q, const Value& v) -{ - return q <=> make_quantity<::mp_units::one>(v); -} - // make_quantity template requires quantity>::_rep_safe_constructible_ diff --git a/test/unit_test/runtime/math_test.cpp b/test/unit_test/runtime/math_test.cpp index 12d2c209..dbaf0907 100644 --- a/test/unit_test/runtime/math_test.cpp +++ b/test/unit_test/runtime/math_test.cpp @@ -37,7 +37,7 @@ using namespace mp_units::si::unit_symbols; TEST_CASE("'pow()' on quantity changes the value and the dimension accordingly", "[math][pow]") { - SECTION("'pow<0>(q)' returns '1'") { CHECK(pow<0>(2 * isq::length[m]) == 1); } + SECTION("'pow<0>(q)' returns '1'") { CHECK(pow<0>(2 * isq::length[m]) == 1 * one); } SECTION("'pow<1>(q)' returns 'q'") { CHECK(pow<1>(2 * isq::length[m]) == 2 * isq::length[m]); } diff --git a/test/unit_test/static/custom_rep_test_min_impl.cpp b/test/unit_test/static/custom_rep_test_min_impl.cpp index 1f140b39..eabd54e5 100644 --- a/test/unit_test/static/custom_rep_test_min_impl.cpp +++ b/test/unit_test/static/custom_rep_test_min_impl.cpp @@ -80,45 +80,6 @@ concept creates_quantity = Unit> && requires { static_assert(creates_quantity, si::metre>); static_assert(creates_quantity, si::metre>); -// dimensionless quantity is constructible and convertible from a value -static_assert(std::constructible_from>, min_impl>); -static_assert(std::convertible_to, quantity>>); - -static_assert(std::constructible_from>, min_impl>); -static_assert(std::convertible_to, quantity>>); - -static_assert(std::constructible_from>, min_impl>); -static_assert(std::convertible_to, quantity>>); - -static_assert(!std::constructible_from>, min_impl>); // narrowing conversion -static_assert(!std::convertible_to, quantity>>); - -// and underlying type -static_assert(std::constructible_from>, int>); -static_assert(std::convertible_to>>); - -static_assert(std::constructible_from>, double>); -static_assert(std::convertible_to>>); - -static_assert(std::constructible_from>, int>); -static_assert(std::convertible_to>>); - -static_assert(!std::constructible_from>, double>); // narrowing conversion -static_assert(!std::convertible_to>>); - -// but only for ratio(1) -static_assert(!std::constructible_from>, min_impl>); -static_assert(!std::convertible_to, quantity>>); - -static_assert(!std::constructible_from>, min_impl>); -static_assert(!std::convertible_to, quantity>>); - -static_assert(!std::constructible_from>, min_impl>); -static_assert(!std::convertible_to, quantity>>); - -static_assert(!std::constructible_from>, min_impl>); // narrowing conversion -static_assert(!std::convertible_to, quantity>>); - // multiply syntax static_assert(creates_quantity, one>); static_assert(creates_quantity, one>); @@ -258,9 +219,9 @@ static_assert(min_impl{123} * si::metre / (min_impl(2.) * one) == m static_assert(min_impl{123} * si::metre / (2. * one) == min_impl{61.5} * si::metre); static_assert(123 * si::metre / (min_impl(2.) * one) == min_impl{61.5} * si::metre); -static_assert(min_impl{123} * si::metre / (min_impl{2.} * si::metre) == 61.5); -static_assert(min_impl{123} * si::metre / (double{2.} * si::metre) == 61.5); -static_assert(123 * si::metre / (min_impl{2.} * si::metre) == 61.5); +static_assert(min_impl{123} * si::metre / (min_impl{2.} * si::metre) == 61.5 * one); +static_assert(min_impl{123} * si::metre / (double{2.} * si::metre) == 61.5 * one); +static_assert(123 * si::metre / (min_impl{2.} * si::metre) == 61.5 * one); static_assert(min_impl{123} * si::metre % (min_impl(100) * si::metre) == 23 * si::metre); static_assert(min_impl{123} * si::metre % (100 * si::metre) == 23 * si::metre); diff --git a/test/unit_test/static/quantity_test.cpp b/test/unit_test/static/quantity_test.cpp index 5486b74c..a20f92e9 100644 --- a/test/unit_test/static/quantity_test.cpp +++ b/test/unit_test/static/quantity_test.cpp @@ -131,43 +131,11 @@ static_assert(!std::convertible_to>); static_assert(!std::constructible_from, int>); static_assert(!std::convertible_to>); -// exception, implicit construction from a value allowed for a dimensionless quantity -static_assert(std::constructible_from, double>); -static_assert(std::convertible_to>); +static_assert(!std::constructible_from, double>); +static_assert(!std::convertible_to>); -static_assert(std::constructible_from, float>); -static_assert(std::convertible_to>); - -static_assert(std::constructible_from, double>); -static_assert(std::convertible_to>); - -static_assert(std::constructible_from, int>); -static_assert(std::convertible_to>); - -static_assert(std::constructible_from, short>); -static_assert(std::convertible_to>); - -static_assert(std::constructible_from, int>); -static_assert(std::convertible_to>); - -// but only if a dimensionless quantity has a ratio(1) -static_assert(!std::constructible_from, double>); -static_assert(!std::convertible_to>); - -static_assert(!std::constructible_from, float>); -static_assert(!std::convertible_to>); - -static_assert(!std::constructible_from, double>); -static_assert(!std::convertible_to>); - -static_assert(!std::constructible_from, int>); -static_assert(!std::convertible_to>); - -static_assert(!std::constructible_from, short>); -static_assert(!std::convertible_to>); - -static_assert(!std::constructible_from, int>); -static_assert(!std::convertible_to>); +static_assert(!std::constructible_from, int>); +static_assert(!std::convertible_to>); /////////////////////////////////////// @@ -715,29 +683,20 @@ static_assert(1 * si::si2019::speed_of_light_in_vacuum + 10 * isq::speed[m / s] // Implicit conversions allowed between quantities of `convertible` references constexpr quantity speed = 120 * isq::length[km] / (2 * isq::time[h]); - // dimensionless - -static_assert((3 * one *= 2 * one) == 6); -static_assert((6 * one /= 2 * one) == 3); -static_assert(1 * one + 1 * one == 2); -static_assert(1 + 1 * one == 2); -static_assert(1 * one + 1 == 2); -static_assert(2 * one - 1 * one == 1); -static_assert(2 - 1 * one == 1); -static_assert(2 * one - 1 == 1); -static_assert(2 * one * (2 * one) == 4); -static_assert(2 * (2 * one) == 4); -static_assert(2 * one * 2 == 4); -static_assert(4 * one / (2 * one) == 2); -static_assert(4 / (2 * one) == 2); -static_assert(4 * one / 2 == 2); -static_assert(4 * one % (2 * one) == 0); -static_assert(4 % (2 * one) == 0); -static_assert(4 % (2 * one) == 0); +static_assert((3 * one *= 2 * one) == 6 * one); +static_assert((6 * one /= 2 * one) == 3 * one); +static_assert(1 * one + 1 * one == 2 * one); +static_assert(2 * one - 1 * one == 1 * one); +static_assert(2 * one * (2 * one) == 4 * one); +static_assert(2 * (2 * one) == 4 * one); +static_assert(2 * one * 2 == 4 * one); +static_assert(4 * one / (2 * one) == 2 * one); +static_assert(4 / (2 * one) == 2 * one); +static_assert(4 * one / 2 == 2 * one); +static_assert(4 * one % (2 * one) == 0 * one); // modulo arithmetics - static_assert(5 * h % (120 * min) == 60 * min); static_assert(300 * min % (2 * h) == 60 * min); static_assert(300 * min % (120 * min) == 60 * min); @@ -754,17 +713,13 @@ constexpr auto quotient_remainder_theorem(auto q1, auto q2) static_assert(quotient_remainder_theorem(7 * m, 3 * m) == 7 * m); static_assert(quotient_remainder_theorem(3'000 * m, 400 * m) == 3'000 * m); -static_assert(is_same_v); -static_assert(is_same_v); -static_assert(is_same_v); -static_assert(is_same_v); -static_assert(1 * one + 2.3 == (1 + 2.3) * one); -static_assert(1 * one - 2.3 == (1 - 2.3) * one); -static_assert(1.2 + 3 * one == (1.2 + 3) * one); -static_assert(1.2 - 3 * one == (1.2 - 3) * one); +static_assert(is_same_v); +static_assert(is_same_v); +static_assert(is_same_v); +static_assert(is_same_v); -static_assert(1 - 30 * percent == (100 - 30) * percent); -static_assert(1 + 30 * percent == (100 + 30) * percent); +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); @@ -821,17 +776,6 @@ static_assert(321 * km != 123'000 * m); static_assert(!(123 * km == 321'000 * m)); static_assert(!(123 * km != 123'000 * m)); -// dimensionless -static_assert(std::equality_comparable_with, double>); -static_assert(std::equality_comparable_with, int>); -static_assert(std::equality_comparable_with, int>); -static_assert(std::equality_comparable_with, double>); - -static_assert(123 * one == 123); -static_assert(321 * one != 123); -static_assert(123 == 123 * one); -static_assert(123 != 321 * one); - // Named and derived dimensions (same units) static_assert(10 * isq::length[m] / (2 * isq::time[s]) == 5 * isq::speed[m / s]); static_assert(5 * isq::speed[m / s] == 10 * isq::length[m] / (2 * isq::time[s])); @@ -908,21 +852,6 @@ static_assert(!(123 * km > 321'000 * m)); static_assert(!(123 * km > 123'000 * m)); static_assert(!(123 * km >= 321'000 * m)); -// dimensionless -static_assert(123 * one < 321); -static_assert(123 * one <= 123); -static_assert(123 * one <= 321); -static_assert(321 * one > 123); -static_assert(123 * one >= 123); -static_assert(321 * one >= 123); - -static_assert(123 < 321 * one); -static_assert(123 <= 123 * one); -static_assert(123 <= 321 * one); -static_assert(321 > 123 * one); -static_assert(123 >= 123 * one); -static_assert(321 >= 123 * one); - ////////////////// // dimensionless diff --git a/test/unit_test/static/reference_test.cpp b/test/unit_test/static/reference_test.cpp index 923cfb5a..83e2cc60 100644 --- a/test/unit_test/static/reference_test.cpp +++ b/test/unit_test/static/reference_test.cpp @@ -285,60 +285,39 @@ static_assert(no_common_reference); static_assert(no_common_reference); // addition of various dimensionless quantities -static_assert(is_of_type<1 * one + 1, quantity>); -static_assert(is_of_type>); - -static_assert(is_of_type<1 * radian + 1, quantity>); static_assert(is_of_type<1 * radian + 1 * one, quantity>); static_assert(is_of_type<1 * radian + dimensionless(1 * one), quantity>); -static_assert(is_of_type>); static_assert(is_of_type>); static_assert(is_of_type>); -static_assert(is_of_type<1 * steradian + 1, quantity>); static_assert(is_of_type<1 * steradian + 1 * one, quantity>); static_assert(is_of_type<1 * steradian + dimensionless(1 * one), quantity>); -static_assert(is_of_type>); static_assert( is_of_type>); static_assert(is_of_type>); // subtraction of various dimensionless quantities -static_assert(is_of_type<1 * one - 1, quantity>); -static_assert(is_of_type>); - -static_assert(is_of_type<1 * radian - 1, quantity>); static_assert(is_of_type<1 * radian - 1 * one, quantity>); static_assert(is_of_type<1 * radian - dimensionless(1 * one), quantity>); -static_assert(is_of_type>); static_assert(is_of_type>); static_assert(is_of_type>); -static_assert(is_of_type<1 * steradian - 1, quantity>); static_assert(is_of_type<1 * steradian - 1 * one, quantity>); static_assert(is_of_type<1 * steradian - dimensionless(1 * one), quantity>); -static_assert(is_of_type>); static_assert( is_of_type>); static_assert(is_of_type>); // comparison of various dimensionless quantities -static_assert(1 * one == 1); -static_assert(dimensionless(1 * one) == 1); - -static_assert(1 * radian == 1); static_assert(1 * radian == 1 * one); static_assert(1 * radian == dimensionless(1 * one)); -static_assert(angular_measure(1 * radian) == 1); static_assert(angular_measure(1 * radian) == 1 * one); static_assert(angular_measure(1 * radian) == dimensionless(1 * one)); -static_assert(1 * steradian == 1); static_assert(1 * steradian == 1 * one); static_assert(1 * steradian == dimensionless(1 * one)); -static_assert(solid_angular_measure(1 * steradian) == 1); static_assert(solid_angular_measure(1 * steradian) == 1 * one); static_assert(solid_angular_measure(1 * steradian) == dimensionless(1 * one));