fix: std::chrono::duration support fixed

Resolves #198
This commit is contained in:
Mateusz Pusz
2021-01-04 13:05:26 +01:00
parent e9db800193
commit 6539b492a3
2 changed files with 15 additions and 6 deletions

View File

@@ -136,13 +136,13 @@ public:
explicit(!(is_same_v<dimension, dim_one> && is_same_v<unit, ::units::one>)) explicit(!(is_same_v<dimension, dim_one> && is_same_v<unit, ::units::one>))
constexpr quantity(const Value& v) : value_(static_cast<rep>(v)) {} constexpr quantity(const Value& v) : value_(static_cast<rep>(v)) {}
template<QuantityLike Q>
requires std::same_as<quantity, quantity_like_type<Q>>
explicit constexpr quantity(const Q& q) : value_(q.count()) {}
template<safe_castable_to_<quantity> Q> template<safe_castable_to_<quantity> Q>
constexpr quantity(const Q& q) : value_(quantity_cast<quantity>(q).count()) {} constexpr quantity(const Q& q) : value_(quantity_cast<quantity>(q).count()) {}
template<QuantityLike Q>
requires safe_castable_to_<quantity_like_type<Q>, quantity>
explicit constexpr quantity(const Q& q) : quantity(quantity_like_type<Q>(quantity_like_traits<Q>::count(q))) {}
quantity& operator=(const quantity&) = default; quantity& operator=(const quantity&) = default;
quantity& operator=(quantity&&) = default; quantity& operator=(quantity&&) = default;

View File

@@ -32,16 +32,25 @@ using namespace units::physical::si::literals;
using namespace std::chrono_literals; using namespace std::chrono_literals;
// construction // construction - same rep type
static_assert(std::constructible_from<si::time<si::second, std::chrono::seconds::rep>, std::chrono::seconds>); static_assert(std::constructible_from<si::time<si::second, std::chrono::seconds::rep>, std::chrono::seconds>);
static_assert(!std::convertible_to<std::chrono::seconds, si::time<si::second, std::chrono::seconds::rep>>); static_assert(!std::convertible_to<std::chrono::seconds, si::time<si::second, std::chrono::seconds::rep>>);
static_assert(std::constructible_from<si::time<si::hour, std::chrono::hours::rep>, std::chrono::hours>); static_assert(std::constructible_from<si::time<si::hour, std::chrono::hours::rep>, std::chrono::hours>);
static_assert(!std::convertible_to<std::chrono::hours, si::time<si::hour, std::chrono::hours::rep>>); static_assert(!std::convertible_to<std::chrono::hours, si::time<si::hour, std::chrono::hours::rep>>);
static_assert(!std::constructible_from<si::time<si::second, std::chrono::hours::rep>, std::chrono::hours>); static_assert(std::constructible_from<si::time<si::second, std::chrono::hours::rep>, std::chrono::hours>);
static_assert(!std::convertible_to<std::chrono::hours, si::time<si::second, std::chrono::hours::rep>>); static_assert(!std::convertible_to<std::chrono::hours, si::time<si::second, std::chrono::hours::rep>>);
static_assert(!std::constructible_from<si::time<si::hour, std::chrono::seconds::rep>, std::chrono::seconds>); static_assert(!std::constructible_from<si::time<si::hour, std::chrono::seconds::rep>, std::chrono::seconds>);
static_assert(!std::convertible_to<std::chrono::seconds, si::time<si::hour, std::chrono::seconds::rep>>); static_assert(!std::convertible_to<std::chrono::seconds, si::time<si::hour, std::chrono::seconds::rep>>);
// construction - different rep type (integral to a floating-point)
static_assert(std::constructible_from<si::time<si::second>, std::chrono::seconds>);
static_assert(!std::convertible_to<std::chrono::seconds, si::time<si::second>>);
static_assert(std::constructible_from<si::time<si::second>, std::chrono::hours>);
static_assert(!std::convertible_to<std::chrono::hours, si::time<si::second>>);
static_assert(std::constructible_from<si::time<si::hour>, std::chrono::seconds>);
static_assert(!std::convertible_to<std::chrono::seconds, si::time<si::hour>>);
// CTAD // CTAD
static_assert(is_same_v<decltype(quantity{1s}), si::time<si::second, std::chrono::seconds::rep>>); static_assert(is_same_v<decltype(quantity{1s}), si::time<si::second, std::chrono::seconds::rep>>);
static_assert(is_same_v<decltype(quantity{1h}), si::time<si::hour, std::chrono::hours::rep>>); static_assert(is_same_v<decltype(quantity{1h}), si::time<si::hour, std::chrono::hours::rep>>);