From 6539b492a34b3359ef14962c3b3c2192c2db77ef Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Mon, 4 Jan 2021 13:05:26 +0100 Subject: [PATCH] fix: `std::chrono::duration` support fixed Resolves #198 --- src/include/units/quantity.h | 8 ++++---- test/unit_test/static/chrono_test.cpp | 13 +++++++++++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/include/units/quantity.h b/src/include/units/quantity.h index 142cf80b..a3b91944 100644 --- a/src/include/units/quantity.h +++ b/src/include/units/quantity.h @@ -136,13 +136,13 @@ public: explicit(!(is_same_v && is_same_v)) constexpr quantity(const Value& v) : value_(static_cast(v)) {} - template - requires std::same_as> - explicit constexpr quantity(const Q& q) : value_(q.count()) {} - template Q> constexpr quantity(const Q& q) : value_(quantity_cast(q).count()) {} + template + requires safe_castable_to_, quantity> + explicit constexpr quantity(const Q& q) : quantity(quantity_like_type(quantity_like_traits::count(q))) {} + quantity& operator=(const quantity&) = default; quantity& operator=(quantity&&) = default; diff --git a/test/unit_test/static/chrono_test.cpp b/test/unit_test/static/chrono_test.cpp index 7186300b..75fd86f6 100644 --- a/test/unit_test/static/chrono_test.cpp +++ b/test/unit_test/static/chrono_test.cpp @@ -32,16 +32,25 @@ using namespace units::physical::si::literals; using namespace std::chrono_literals; -// construction +// construction - same rep type static_assert(std::constructible_from, std::chrono::seconds>); static_assert(!std::convertible_to>); static_assert(std::constructible_from, std::chrono::hours>); static_assert(!std::convertible_to>); -static_assert(!std::constructible_from, std::chrono::hours>); +static_assert(std::constructible_from, std::chrono::hours>); static_assert(!std::convertible_to>); static_assert(!std::constructible_from, std::chrono::seconds>); static_assert(!std::convertible_to>); +// construction - different rep type (integral to a floating-point) +static_assert(std::constructible_from, std::chrono::seconds>); +static_assert(!std::convertible_to>); +static_assert(std::constructible_from, std::chrono::hours>); +static_assert(!std::convertible_to>); +static_assert(std::constructible_from, std::chrono::seconds>); +static_assert(!std::convertible_to>); + + // CTAD static_assert(is_same_v>); static_assert(is_same_v>);