From 9c979fc03a87d4542629455983a0b07a4dc5cd72 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Mon, 5 Aug 2019 18:22:53 +0200 Subject: [PATCH] Missing op*() added --- doc/DESIGN.md | 12 +++++++++--- src/include/units/quantity.h | 15 +++++++++++++-- test/unit_test/test_units.cpp | 4 +++- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/doc/DESIGN.md b/doc/DESIGN.md index ee6fc03e..04fc23f8 100644 --- a/doc/DESIGN.md +++ b/doc/DESIGN.md @@ -258,14 +258,20 @@ public: [[nodiscard]] static constexpr quantity one() noexcept { return quantity(quantity_values::one()); } template - requires treat_as_floating_point || - (std::ratio_multiply::den == 1) + requires std::Same> + [[nodiscard]] constexpr Scalar operator*(const quantity& lhs, + const quantity& rhs); + + template + requires (!std::Same>) && + (treat_as_floating_point || + (std::ratio_multiply::den == 1)) [[nodiscard]] constexpr Quantity operator*(const quantity& lhs, const quantity& rhs); template [[nodiscard]] constexpr Quantity operator/(const Rep1& v, - const quantity& q) + const quantity& q); template requires std::Same diff --git a/src/include/units/quantity.h b/src/include/units/quantity.h index 77bb3fb0..5d3d9471 100644 --- a/src/include/units/quantity.h +++ b/src/include/units/quantity.h @@ -277,11 +277,22 @@ namespace std::experimental::units { return q * v; } + template + [[nodiscard]] constexpr Scalar operator*(const quantity& lhs, + const quantity& rhs) + requires std::Same> + { + using common_rep = decltype(lhs.count() * rhs.count()); + using ratio = ratio_multiply; + return common_rep(lhs.count()) * common_rep(rhs.count()) * common_rep(ratio::num) / common_rep(ratio::den); + } + template [[nodiscard]] constexpr Quantity operator*(const quantity& lhs, const quantity& rhs) - requires treat_as_floating_point || - (std::ratio_multiply::den == 1) + requires (!std::Same>) && + (treat_as_floating_point || + (std::ratio_multiply::den == 1)) { using dim = dimension_multiply_t; using common_rep = decltype(lhs.count() * rhs.count()); diff --git a/test/unit_test/test_units.cpp b/test/unit_test/test_units.cpp index dbe57911..c559d131 100644 --- a/test/unit_test/test_units.cpp +++ b/test/unit_test/test_units.cpp @@ -61,6 +61,7 @@ namespace { static_assert(1m == 1000mm); static_assert(1km + 1m == 1001m); static_assert(10km / 5km == 2); + static_assert(100mm / 5cm == 2); static_assert(10km / 2 == 5km); static_assert(1yd == 0.9144m); @@ -77,10 +78,11 @@ namespace { // frequency static_assert(2 / 1s == 2Hz); + static_assert(120 / 1min == 2Hz); static_assert(1000 / 1s == 1kHz); static_assert(1 / 1ms == 1kHz); static_assert(3.2GHz == 3'200'000'000Hz); -// static_assert(10hz * 1min == 600); + static_assert(10Hz * 1min == 600); // force