From 2b2f381ad5482d70f93e26141c0db52722b46568 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Mon, 12 Jun 2023 11:51:18 +0300 Subject: [PATCH] test: `custom_rep_test_min_expl` updated for V2 --- test/unit_test/static/CMakeLists.txt | 1 + .../static/custom_rep_test_min_expl.cpp | 147 ++++++++++-------- 2 files changed, 81 insertions(+), 67 deletions(-) diff --git a/test/unit_test/static/CMakeLists.txt b/test/unit_test/static/CMakeLists.txt index f5135edb..4af05b6a 100644 --- a/test/unit_test/static/CMakeLists.txt +++ b/test/unit_test/static/CMakeLists.txt @@ -35,6 +35,7 @@ add_library( chrono_test.cpp concepts_test.cpp # custom_rep_test_min_expl.cpp + custom_rep_test_min_impl.cpp dimension_test.cpp fixed_string_test.cpp fractional_exponent_quantity.cpp diff --git a/test/unit_test/static/custom_rep_test_min_expl.cpp b/test/unit_test/static/custom_rep_test_min_expl.cpp index 689c9666..e69af5d9 100644 --- a/test/unit_test/static/custom_rep_test_min_expl.cpp +++ b/test/unit_test/static/custom_rep_test_min_expl.cpp @@ -20,9 +20,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. -#include -#include -#include +#include #include #include @@ -43,6 +41,8 @@ template class min_expl { std::intmax_t value_; public: + using value_type = std::intmax_t; + // default construction min_expl() requires(Mode != 1) @@ -103,6 +103,9 @@ public: } // namespace +template +inline constexpr bool mp_units::is_scalar> = true; + template struct std::common_type> : std::type_identity> {}; template @@ -110,63 +113,68 @@ struct std::common_type, std::intmax_t> : std::type_identity>, min_expl<>>); -static_assert(!std::convertible_to, length>>); +static_assert(!std::constructible_from>, min_expl<>>); +static_assert(!std::convertible_to, quantity>>); // not constructible from an underlying type -static_assert(!std::constructible_from>, int>); -static_assert(!std::convertible_to>>); +static_assert(!std::constructible_from>, int>); +static_assert(!std::convertible_to>>); + +// multiply syntax should work +template +concept creates_quantity = requires { T{} * U; }; + +static_assert(creates_quantity, si::metre>); // dimensionless quantity implicitly convertible from the representation type -static_assert(std::constructible_from>, min_expl<>>); -static_assert(std::convertible_to, dimensionless>>); +static_assert(std::constructible_from>, min_expl<>>); +static_assert(std::convertible_to, quantity>>); // but not from an underlying type -static_assert(!std::constructible_from>, int>); -static_assert(!std::convertible_to>>); +static_assert(std::constructible_from>, int>); +static_assert(!std::convertible_to>>); // or for ratio != 1 -static_assert(std::constructible_from>, min_expl<>>); -static_assert(!std::convertible_to, dimensionless>>); +static_assert(!std::constructible_from>, min_expl<>>); +static_assert(!std::convertible_to, quantity>>); // quantity convertible from itself -static_assert(std::constructible_from>, length>>); -static_assert(std::convertible_to>, length>>); +static_assert(std::constructible_from>, quantity>>); +static_assert(std::convertible_to>, quantity>>); // not convertible from an underlying type -static_assert(!std::constructible_from>, length>); -static_assert(!std::convertible_to, length>>); +static_assert(std::constructible_from>, quantity>); +static_assert(!std::convertible_to, quantity>>); // quantity convertible from another non truncating unit -static_assert(std::constructible_from>, length>>); -static_assert(std::convertible_to>, length>>); +static_assert(std::constructible_from>, quantity, min_expl<>>>); +static_assert(std::convertible_to, min_expl<>>, quantity>>); // quantity not convertible from another truncating unit -static_assert(!std::constructible_from>, length>>); -static_assert(!std::convertible_to>, length>>); +static_assert(!std::constructible_from, min_expl<>>, quantity>>); +static_assert(!std::convertible_to>, quantity, min_expl<>>>); // rep type with explicit constructor - implicit construction of rep not allowed -static_assert(!std::constructible_from>, int>); -static_assert(!std::convertible_to>>); +static_assert(!std::constructible_from>, int>); +static_assert(!std::convertible_to>>); -static_assert(!std::constructible_from>, length>); -static_assert(!std::convertible_to, length>>); +static_assert(!std::constructible_from>, quantity>); +static_assert(!std::convertible_to, quantity>>); -static_assert(!std::constructible_from, min_expl<>>); -static_assert(!std::convertible_to, length>); +static_assert(!std::constructible_from, min_expl<>>); +static_assert(!std::convertible_to, quantity>); -static_assert(!std::constructible_from, length>>); -static_assert(!std::convertible_to>, length>); +static_assert(!std::constructible_from, quantity>>); +static_assert(!std::convertible_to>, quantity>); -static_assert(!std::constructible_from>, dimensionless>); -static_assert(!std::convertible_to, length>>); +static_assert(!std::constructible_from>, quantity>); +static_assert(!std::convertible_to, quantity>>); -static_assert(!std::constructible_from, dimensionless>>); -static_assert(!std::convertible_to>, length>); +static_assert(!std::constructible_from, quantity>>); +static_assert(!std::convertible_to>, quantity>); // all operations needed to satisfy concept static_assert(Representation>); @@ -186,7 +194,7 @@ static_assert(!Representation>); // quantity's operators should mirror the representation type capabilities template -concept invalid_member_operations = requires(length lhs) { +concept invalid_member_operations = requires(quantity lhs) { requires !requires { +lhs; }; requires !requires { -lhs; }; requires !requires { ++lhs; }; @@ -194,50 +202,55 @@ concept invalid_member_operations = requires(length lhs) { requires !requires { --lhs; }; requires !requires { lhs--; }; - requires !requires(length rhs) { lhs += rhs; }; - requires !requires(length rhs) { lhs -= rhs; }; + requires !requires(quantity rhs) { lhs += rhs; }; + requires !requires(quantity rhs) { lhs -= rhs; }; requires !requires(Rep rhs) { lhs *= rhs; }; requires !requires(Rep rhs) { lhs /= rhs; }; requires !requires(Rep rhs) { lhs %= rhs; }; - requires !requires(length rhs) { lhs %= rhs; }; + requires !requires(quantity rhs) { lhs %= rhs; }; - requires !requires(length rhs) { lhs + rhs; }; - requires !requires(length rhs) { lhs - rhs; }; + requires !requires(quantity rhs) { lhs + rhs; }; + requires !requires(quantity rhs) { lhs - rhs; }; requires !requires(Rep rhs) { lhs % rhs; }; - requires !requires(length rhs) { lhs % rhs; }; - requires !requires(length rhs) { lhs < rhs; }; - requires !requires(length rhs) { lhs > rhs; }; - requires !requires(length rhs) { lhs <= rhs; }; - requires !requires(length rhs) { lhs >= rhs; }; + requires !requires(quantity rhs) { lhs % rhs; }; + requires !requires(quantity rhs) { lhs < rhs; }; + requires !requires(quantity rhs) { lhs > rhs; }; + requires !requires(quantity rhs) { lhs <= rhs; }; + requires !requires(quantity rhs) { lhs >= rhs; }; - requires !requires(length rhs) { lhs + rhs; }; - requires !requires(length rhs) { lhs - rhs; }; + requires !requires(quantity rhs) { lhs + rhs; }; + requires !requires(quantity rhs) { lhs - rhs; }; requires !requires(int rhs) { lhs % rhs; }; - requires !requires(length rhs) { lhs % rhs; }; - requires !requires(length rhs) { lhs == rhs; }; - requires !requires(length rhs) { lhs != rhs; }; - requires !requires(length rhs) { lhs < rhs; }; - requires !requires(length rhs) { lhs > rhs; }; - requires !requires(length rhs) { lhs <= rhs; }; - requires !requires(length rhs) { lhs >= rhs; }; + requires !requires(quantity rhs) { lhs % rhs; }; + requires !requires(quantity rhs) { lhs == rhs; }; + requires !requires(quantity rhs) { lhs != rhs; }; + requires !requires(quantity rhs) { lhs < rhs; }; + requires !requires(quantity rhs) { lhs > rhs; }; + requires !requires(quantity rhs) { lhs <= rhs; }; + requires !requires(quantity rhs) { lhs >= rhs; }; requires !requires(std::ostream os) { os << lhs; }; }; static_assert(invalid_member_operations>); // equality -static_assert(length>(min_expl(2)) == length>(min_expl(2000))); -static_assert(length>(min_expl(123)) * min_expl(2) == length>(min_expl(246))); -static_assert(length>(min_expl(123)) * quantity{min_expl(2)} == - length>(min_expl(246))); -static_assert(min_expl(2) * length>(min_expl(123)) == length>(min_expl(246))); -static_assert(quantity{min_expl(2)} * length>(min_expl(123)) == - length>(min_expl(246))); -static_assert(length>(min_expl(246)) / min_expl(2) == length>(min_expl(123))); -static_assert(length>(min_expl(246)) / quantity{min_expl(2)} == - length>(min_expl(123))); -static_assert(length>(min_expl(246)) / length>(min_expl(2)) == +static_assert(quantity, min_expl<>>(min_expl(2)) == + quantity>(min_expl(2'000))); +static_assert(quantity>(min_expl(123)) * min_expl(2) == + quantity>(min_expl(246))); +static_assert(quantity>(min_expl(123)) * quantity{min_expl(2)} == + quantity>(min_expl(246))); +static_assert(min_expl(2) * quantity>(min_expl(123)) == + quantity>(min_expl(246))); +static_assert(quantity{min_expl(2)} * quantity>(min_expl(123)) == + quantity>(min_expl(246))); +static_assert(quantity>(min_expl(246)) / min_expl(2) == + quantity>(min_expl(123))); +static_assert(quantity>(min_expl(246)) / quantity{min_expl(2)} == + quantity>(min_expl(123))); +static_assert(quantity>(min_expl(246)) / quantity>(min_expl(2)) == quantity{min_expl(123)}); -static_assert(length>(min_expl(246)) / length>(min_expl(2)) == min_expl(123)); +static_assert(quantity>(min_expl(246)) / quantity>(min_expl(2)) == + min_expl(123)); } // namespace