From be8fc9eb984bd1ff2ba3e4aa3da1f734e4677353 Mon Sep 17 00:00:00 2001 From: Yves Delley Date: Fri, 10 May 2024 22:38:15 +0200 Subject: [PATCH 1/4] add tests for value_cast of quantity_point --- test/static/quantity_point_test.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/static/quantity_point_test.cpp b/test/static/quantity_point_test.cpp index 27016618..b186689c 100644 --- a/test/static/quantity_point_test.cpp +++ b/test/static/quantity_point_test.cpp @@ -1677,4 +1677,17 @@ static_assert(invalid_addition(5 * isq::activity[Bq], 10 / (2 * isq::time[s]), q static_assert(invalid_subtraction(quantity_point{5 * isq::activity[Bq]}, 10 / (2 * isq::time[s]), 5 * isq::frequency[Hz])); +// value_cast + +static_assert(value_cast(quantity_point{2 * km}).quantity_from_zero().numerical_value_in(m) == 2000); +static_assert(value_cast(quantity_point{2000 * m}).quantity_from_zero().numerical_value_in(km) == 2); +static_assert(value_cast(quantity_point{1.23 * m}).quantity_from_zero().numerical_value_in(m) == 1); +static_assert( + value_cast(quantity_point{2000.0 * m / (3600.0 * s)}).quantity_from_zero().numerical_value_in(km / h) == 2); +// lvalue references in value_cast +namespace lvalue_tests { +constexpr quantity_point lvalue_qp{2 * km}; +static_assert(value_cast(lvalue_qp).quantity_from_zero().numerical_value_in(m) == 2000); +} // namespace lvalue_tests + } // namespace From 8f8b908b3dfc471b79e5ec8ce1d2e86cc8fb4e24 Mon Sep 17 00:00:00 2001 From: Yves Delley Date: Fri, 10 May 2024 23:07:55 +0200 Subject: [PATCH 2/4] added more tests, hopefully, the issue does now surface --- test/static/quantity_point_test.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/static/quantity_point_test.cpp b/test/static/quantity_point_test.cpp index b186689c..8de77236 100644 --- a/test/static/quantity_point_test.cpp +++ b/test/static/quantity_point_test.cpp @@ -1688,6 +1688,8 @@ static_assert( namespace lvalue_tests { constexpr quantity_point lvalue_qp{2 * km}; static_assert(value_cast(lvalue_qp).quantity_from_zero().numerical_value_in(m) == 2000); +static_assert(value_cast(lvalue_qp).quantity_from_zero().numerical_value_in(km) == 2.f); +static_assert(value_cast(lvalue_qp).quantity_from_zero().numerical_value_in(m) == 2000.f); } // namespace lvalue_tests } // namespace From 14f658120e522a2ecab58637dec996c6c93a9700 Mon Sep 17 00:00:00 2001 From: Yves Delley Date: Fri, 10 May 2024 23:08:46 +0200 Subject: [PATCH 3/4] fix value_cast with lvalue references to quantity_point --- src/core/include/mp-units/framework/value_cast.h | 8 ++++---- test/static/quantity_point_test.cpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/core/include/mp-units/framework/value_cast.h b/src/core/include/mp-units/framework/value_cast.h index eaedbd17..96b86dbc 100644 --- a/src/core/include/mp-units/framework/value_cast.h +++ b/src/core/include/mp-units/framework/value_cast.h @@ -107,7 +107,7 @@ template [[nodiscard]] constexpr QuantityPoint auto value_cast(QP&& qp) { return quantity_point{value_cast(std::forward(qp).quantity_from_origin_is_an_implementation_detail_), - qp.point_origin}; + std::remove_reference_t::point_origin}; } /** @@ -124,10 +124,10 @@ template requires QuantityPoint> && RepresentationOf::quantity_spec.character> && std::constructible_from::rep> -[[nodiscard]] constexpr quantity_point::reference, QP::point_origin, ToRep> value_cast( +[[nodiscard]] constexpr quantity_point::reference, std::remove_reference_t::point_origin, ToRep> value_cast( QP&& qp) { - return {value_cast(std::forward(qp).quantity_from_origin_is_an_implementation_detail_), qp.point_origin}; + return {value_cast(std::forward(qp).quantity_from_origin_is_an_implementation_detail_), std::remove_reference_t::point_origin}; } /** @@ -147,7 +147,7 @@ template [[nodiscard]] constexpr QuantityPoint auto value_cast(QP&& qp) { return quantity_point{value_cast(std::forward(qp).quantity_from_origin_is_an_implementation_detail_), - qp.point_origin}; + std::remove_reference_t::point_origin}; } } // namespace mp_units diff --git a/test/static/quantity_point_test.cpp b/test/static/quantity_point_test.cpp index 8de77236..acc53416 100644 --- a/test/static/quantity_point_test.cpp +++ b/test/static/quantity_point_test.cpp @@ -1689,7 +1689,7 @@ namespace lvalue_tests { constexpr quantity_point lvalue_qp{2 * km}; static_assert(value_cast(lvalue_qp).quantity_from_zero().numerical_value_in(m) == 2000); static_assert(value_cast(lvalue_qp).quantity_from_zero().numerical_value_in(km) == 2.f); -static_assert(value_cast(lvalue_qp).quantity_from_zero().numerical_value_in(m) == 2000.f); +static_assert(value_cast(lvalue_qp).quantity_from_zero().numerical_value_in(m) == 2000.f); } // namespace lvalue_tests } // namespace From 1eb491750cf5155cc8944121e51a17c42fdbcd81 Mon Sep 17 00:00:00 2001 From: Yves Delley Date: Fri, 10 May 2024 23:26:12 +0200 Subject: [PATCH 4/4] fix formatting --- src/core/include/mp-units/framework/value_cast.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/core/include/mp-units/framework/value_cast.h b/src/core/include/mp-units/framework/value_cast.h index 96b86dbc..1f92bcea 100644 --- a/src/core/include/mp-units/framework/value_cast.h +++ b/src/core/include/mp-units/framework/value_cast.h @@ -124,10 +124,12 @@ template requires QuantityPoint> && RepresentationOf::quantity_spec.character> && std::constructible_from::rep> -[[nodiscard]] constexpr quantity_point::reference, std::remove_reference_t::point_origin, ToRep> value_cast( - QP&& qp) +[[nodiscard]] constexpr quantity_point::reference, + std::remove_reference_t::point_origin, ToRep> +value_cast(QP&& qp) { - return {value_cast(std::forward(qp).quantity_from_origin_is_an_implementation_detail_), std::remove_reference_t::point_origin}; + return {value_cast(std::forward(qp).quantity_from_origin_is_an_implementation_detail_), + std::remove_reference_t::point_origin}; } /**