From ada3c60ee9f6db71aa40828738a6301d2da77b98 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Tue, 16 Feb 2021 19:18:14 +0100 Subject: [PATCH] refactor: QuantityLike concept improved --- src/include/units/bits/basic_concepts.h | 26 +++++++++++++++++++------ test/unit_test/static/chrono_test.cpp | 1 + 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/include/units/bits/basic_concepts.h b/src/include/units/bits/basic_concepts.h index 50456c84..a6cb8569 100644 --- a/src/include/units/bits/basic_concepts.h +++ b/src/include/units/bits/basic_concepts.h @@ -261,6 +261,9 @@ inline constexpr bool is_quantity_kind = false; template inline constexpr bool is_quantity_point_kind = false; +template +inline constexpr bool is_quantity_like = false; + } // namespace detail /** @@ -304,12 +307,7 @@ concept QuantityPointKind = detail::is_quantity_point_kind; * type trait is provided. */ template -concept QuantityLike = requires(T q) { - typename quantity_like_traits::dimension; - typename quantity_like_traits::unit; - typename quantity_like_traits::rep; - { quantity_like_traits::count(q) } -> std::convertible_to::rep>; -}; +concept QuantityLike = detail::is_quantity_like; // QuantityValue @@ -378,4 +376,20 @@ concept QuantityValue = std::regular && scalable_; +namespace detail { + +template + requires requires(T q) { + typename quantity_like_traits::dimension; + typename quantity_like_traits::unit; + typename quantity_like_traits::rep; + requires Dimension::dimension>; + requires Unit::unit>; + requires QuantityValue::rep>; + { quantity_like_traits::count(q) } -> std::convertible_to::rep>; + } +inline constexpr bool is_quantity_like = true; + +} // namespace detail + } // namespace units diff --git a/test/unit_test/static/chrono_test.cpp b/test/unit_test/static/chrono_test.cpp index 75fd86f6..61d80d3f 100644 --- a/test/unit_test/static/chrono_test.cpp +++ b/test/unit_test/static/chrono_test.cpp @@ -31,6 +31,7 @@ using namespace units::physical; using namespace units::physical::si::literals; using namespace std::chrono_literals; +static_assert(QuantityLike); // construction - same rep type static_assert(std::constructible_from, std::chrono::seconds>);