diff --git a/example/include/validated_type.h b/example/include/validated_type.h index f37bec12..5e63f792 100644 --- a/example/include/validated_type.h +++ b/example/include/validated_type.h @@ -61,7 +61,7 @@ public: { } - constexpr explicit(false) operator T() const & noexcept(std::is_nothrow_copy_constructible_v) + constexpr explicit(false) operator T() const& noexcept(std::is_nothrow_copy_constructible_v) requires std::copyable { return value_; diff --git a/src/core/include/units/bits/basic_concepts.h b/src/core/include/units/bits/basic_concepts.h index ac073b28..397f5137 100644 --- a/src/core/include/units/bits/basic_concepts.h +++ b/src/core/include/units/bits/basic_concepts.h @@ -217,14 +217,13 @@ struct point_origin; * Satisfied by types derived from an specialization of @c point_origin. */ template -concept PointOrigin = is_derived_from_specialization_of && - requires { - typename T::dimension; - requires Dimension; - typename T::point_origin; - requires std::same_as>; - requires !std::same_as>; - }; +concept PointOrigin = is_derived_from_specialization_of && requires { + typename T::dimension; + requires Dimension; + typename T::point_origin; + requires std::same_as>; + requires !std::same_as>; +}; // RebindablePointOriginFor @@ -261,10 +260,10 @@ struct _kind_base; template typename Base> concept kind_impl_ = is_derived_from_specialization_of && requires { - typename T::base_kind; - typename T::dimension; - requires Dimension; - }; + typename T::base_kind; + typename T::dimension; + requires Dimension; +}; /** * @brief A concept matching all kind types @@ -389,12 +388,12 @@ concept QuantityPointLike = detail::is_quantity_point_like; template concept common_type_with_ = // exposition only - (std::same_as, std::common_type_t>) && - (std::constructible_from, T>) && (std::constructible_from, U>); + (std::same_as, std::common_type_t>)&&( + std::constructible_from, T>)&&(std::constructible_from, U>); template concept scalable_number_ = // exposition only - (std::regular_invocable, T, U>) && (std::regular_invocable, T, U>); + (std::regular_invocable, T, U>)&&(std::regular_invocable, T, U>); template concept castable_number_ = // exposition only @@ -443,37 +442,36 @@ concept wrapped_quantity_ = // exposition only * Satisfied by types that satisfy `(!Quantity) && (!WrappedQuantity) && std::regular`. */ template -concept Representation = (!Quantity) && (!QuantityLike) && - (!wrapped_quantity_) && std::regular && scalable_; +concept Representation = (!Quantity)&&(!QuantityLike)&&(!wrapped_quantity_)&&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 Representation::rep>; - { - quantity_like_traits::number(q) - } -> std::convertible_to::rep>; - } + typename quantity_like_traits::dimension; + typename quantity_like_traits::unit; + typename quantity_like_traits::rep; + requires Dimension::dimension>; + requires Unit::unit>; + requires Representation::rep>; + { + quantity_like_traits::number(q) + } -> std::convertible_to::rep>; + } inline constexpr bool is_quantity_like = true; template requires requires(T q) { - typename quantity_point_like_traits::dimension; - typename quantity_point_like_traits::unit; - typename quantity_point_like_traits::rep; - requires Dimension::dimension>; - requires Unit::unit>; - requires Representation::rep>; - { - quantity_point_like_traits::relative(q) - } -> QuantityLike; - } + typename quantity_point_like_traits::dimension; + typename quantity_point_like_traits::unit; + typename quantity_point_like_traits::rep; + requires Dimension::dimension>; + requires Unit::unit>; + requires Representation::rep>; + { + quantity_point_like_traits::relative(q) + } -> QuantityLike; + } inline constexpr bool is_quantity_point_like = true; } // namespace detail diff --git a/src/core/include/units/customization_points.h b/src/core/include/units/customization_points.h index 54bd9c35..106faffb 100644 --- a/src/core/include/units/customization_points.h +++ b/src/core/include/units/customization_points.h @@ -69,20 +69,20 @@ struct quantity_values { static constexpr Rep min() noexcept requires requires { - { - std::numeric_limits::lowest() - } -> std::same_as; - } + { + std::numeric_limits::lowest() + } -> std::same_as; + } { return std::numeric_limits::lowest(); } static constexpr Rep max() noexcept requires requires { - { - std::numeric_limits::max() - } -> std::same_as; - } + { + std::numeric_limits::max() + } -> std::same_as; + } { return std::numeric_limits::max(); } diff --git a/src/core/include/units/magnitude.h b/src/core/include/units/magnitude.h index 2760ee33..f565e80d 100644 --- a/src/core/include/units/magnitude.h +++ b/src/core/include/units/magnitude.h @@ -313,11 +313,9 @@ struct pairwise_all { }(sizeof...(Ts)); // Compare zero or more pairs of neighbours as needed. - return [this](std::tuple && t, std::index_sequence) - { + return [this](std::tuple&& t, std::index_sequence) { return (predicate(std::get(t), std::get(t)) && ...); - } - (std::make_tuple(std::forward(ts)...), std::make_index_sequence()); + }(std::make_tuple(std::forward(ts)...), std::make_index_sequence()); } }; diff --git a/src/core/include/units/math.h b/src/core/include/units/math.h index 20a111d2..cc86712b 100644 --- a/src/core/include/units/math.h +++ b/src/core/include/units/math.h @@ -159,9 +159,9 @@ template requires((!treat_as_floating_point) || requires { floor(q.number()); } || requires { std::floor(q.number()); }) && (std::same_as || requires { - ::units::quantity_cast(q); - quantity::one(); - }) + ::units::quantity_cast(q); + quantity::one(); + }) { const auto handle_signed_results = [&](const T& res) { if (res > q) { @@ -208,9 +208,9 @@ template [[nodiscard]] constexpr quantity ceil(const quantity& q) noexcept requires((!treat_as_floating_point) || requires { ceil(q.number()); } || requires { std::ceil(q.number()); }) && (std::same_as || requires { - ::units::quantity_cast(q); - quantity::one(); - }) + ::units::quantity_cast(q); + quantity::one(); + }) { const auto handle_signed_results = [&](const T& res) { if (res < q) { @@ -260,9 +260,9 @@ template requires((!treat_as_floating_point) || requires { round(q.number()); } || requires { std::round(q.number()); }) && (std::same_as || requires { - ::units::floor(q); - quantity::one(); - }) + ::units::floor(q); + quantity::one(); + }) { if constexpr (std::is_same_v) { if constexpr (treat_as_floating_point) { @@ -308,10 +308,9 @@ template D, typename U, std::s */ template [[nodiscard]] inline std::common_type_t hypot(const Q1& x, const Q2& y) noexcept - requires requires { typename std::common_type_t; } && - requires(std::common_type_t q) { - requires requires { hypot(q.number(), q.number()); } || requires { std::hypot(q.number(), q.number()); }; - } + requires requires { typename std::common_type_t; } && requires(std::common_type_t q) { + requires requires { hypot(q.number(), q.number()); } || requires { std::hypot(q.number(), q.number()); }; + } { using type = std::common_type_t; type xx = x; @@ -326,11 +325,10 @@ template */ template [[nodiscard]] inline std::common_type_t hypot(const Q1& x, const Q2& y, const Q3& z) noexcept - requires requires { typename std::common_type_t; } && - requires(std::common_type_t q) { - requires requires { hypot(q.number(), q.number(), q.number()); } || - requires { std::hypot(q.number(), q.number(), q.number()); }; - } + requires requires { typename std::common_type_t; } && requires(std::common_type_t q) { + requires requires { hypot(q.number(), q.number(), q.number()); } || + requires { std::hypot(q.number(), q.number(), q.number()); }; + } { using type = std::common_type_t; type xx = x; diff --git a/src/core/include/units/quantity.h b/src/core/include/units/quantity.h index 25ad6fd7..306e460b 100644 --- a/src/core/include/units/quantity.h +++ b/src/core/include/units/quantity.h @@ -51,8 +51,8 @@ inline constexpr auto make_quantity = [](auto&& v) { template concept quantity_one = Quantity && - (std::same_as || std::same_as>) && - detail::equivalent_unit::value; + (std::same_as || std::same_as>)&&detail:: + equivalent_unit::value; } // namespace detail @@ -62,7 +62,7 @@ concept floating_point_ = // exposition only template concept safe_convertible_to_ = // exposition only - (!Quantity) && (!Quantity) && std::convertible_to && + (!Quantity)&&(!Quantity)&&std::convertible_to && (floating_point_ || (!floating_point_)); // QFrom ratio is an exact multiple of QTo @@ -84,7 +84,7 @@ concept invoke_result_convertible_to_ = Representation && quantity_value_for_ && safe_convertible_to_>; template -concept have_quantity_for_ = Quantity && (!Quantity) && quantity_value_for_; +concept have_quantity_for_ = Quantity && (!Quantity)&&quantity_value_for_; template using quantity_like_type = quantity::dimension, typename quantity_like_traits::unit, @@ -169,10 +169,10 @@ public: // member unary operators [[nodiscard]] constexpr Quantity auto operator+() const requires requires(rep v) { - { - +v - } -> std::common_with; - } + { + +v + } -> std::common_with; + } { using ret = quantity; return ret(+number()); @@ -187,10 +187,10 @@ public: constexpr quantity& operator++() requires requires(rep v) { - { - ++v - } -> std::same_as; - } + { + ++v + } -> std::same_as; + } { ++number_; return *this; @@ -198,20 +198,20 @@ public: [[nodiscard]] constexpr quantity operator++(int) requires requires(rep v) { - { - v++ - } -> std::same_as; - } + { + v++ + } -> std::same_as; + } { return quantity(number_++); } constexpr quantity& operator--() requires requires(rep v) { - { - --v - } -> std::same_as; - } + { + --v + } -> std::same_as; + } { --number_; return *this; @@ -219,20 +219,20 @@ public: [[nodiscard]] constexpr quantity operator--(int) requires requires(rep v) { - { - v-- - } -> std::same_as; - } + { + v-- + } -> std::same_as; + } { return quantity(number_--); } constexpr quantity& operator+=(const quantity& q) requires requires(rep a, rep b) { - { - a += b - } -> std::same_as; - } + { + a += b + } -> std::same_as; + } { number_ += q.number(); return *this; @@ -240,10 +240,10 @@ public: constexpr quantity& operator-=(const quantity& q) requires requires(rep a, rep b) { - { - a -= b - } -> std::same_as; - } + { + a -= b + } -> std::same_as; + } { number_ -= q.number(); return *this; @@ -252,10 +252,10 @@ public: template constexpr quantity& operator*=(const Rep2& rhs) requires requires(rep a, const Rep2 b) { - { - a *= b - } -> std::same_as; - } + { + a *= b + } -> std::same_as; + } { number_ *= rhs; return *this; @@ -263,10 +263,10 @@ public: template constexpr quantity& operator*=(const Q& rhs) requires requires(rep a, const typename Q::rep b) { - { - a *= b - } -> std::same_as; - } + { + a *= b + } -> std::same_as; + } { number_ *= rhs.number(); return *this; @@ -275,10 +275,10 @@ public: template constexpr quantity& operator/=(const Rep2& rhs) requires requires(rep a, const Rep2 b) { - { - a /= b - } -> std::same_as; - } + { + a /= b + } -> std::same_as; + } { gsl_ExpectsAudit(rhs != quantity_values::zero()); number_ /= rhs; @@ -287,10 +287,10 @@ public: template constexpr quantity& operator/=(const Q& rhs) requires requires(rep a, const typename Q::rep b) { - { - a /= b - } -> std::same_as; - } + { + a /= b + } -> std::same_as; + } { gsl_ExpectsAudit(rhs.number() != quantity_values::zero()); number_ /= rhs.number(); @@ -300,10 +300,10 @@ public: template constexpr quantity& operator%=(const Rep2& rhs) requires(!floating_point_) && (!floating_point_) && requires(rep a, const Rep2 b) { - { - a %= b - } -> std::same_as; - } + { + a %= b + } -> std::same_as; + } { gsl_ExpectsAudit(rhs != quantity_values::zero()); number_ %= rhs; @@ -313,10 +313,10 @@ public: template constexpr quantity& operator%=(const Q& rhs) requires(!floating_point_) && (!floating_point_) && requires(rep a, const typename Q::rep b) { - { - a %= b - } -> std::same_as; - } + { + a %= b + } -> std::same_as; + } { gsl_ExpectsAudit(rhs.number() != quantity_values::zero()); number_ %= rhs.number(); @@ -325,10 +325,10 @@ public: constexpr quantity& operator%=(const quantity& q) requires(!floating_point_) && requires(rep a, rep b) { - { - a %= b - } -> std::same_as; - } + { + a %= b + } -> std::same_as; + } { gsl_ExpectsAudit(q.number() != quantity_values::zero()); number_ %= q.number(); @@ -340,20 +340,20 @@ public: template [[nodiscard]] friend constexpr Quantity auto operator+(const quantity& lhs, const Value& rhs) requires requires { // TODO: Simplify when Clang catches up. - requires !Quantity; - requires is_same_v; - requires invoke_result_convertible_to_, rep, Value>; - } + requires !Quantity; + requires is_same_v; + requires invoke_result_convertible_to_, rep, Value>; + } { return units::quantity(lhs.number() + rhs); } template [[nodiscard]] friend constexpr Quantity auto operator+(const Value& lhs, const quantity& rhs) requires requires { // TODO: Simplify when Clang catches up. - requires !Quantity; - requires is_same_v; - requires invoke_result_convertible_to_, Value, rep>; - } + requires !Quantity; + requires is_same_v; + requires invoke_result_convertible_to_, Value, rep>; + } { return units::quantity(lhs + rhs.number()); } @@ -361,20 +361,20 @@ public: template [[nodiscard]] friend constexpr Quantity auto operator-(const quantity& lhs, const Value& rhs) requires requires { // TODO: Simplify when Clang catches up. - requires !Quantity; - requires is_same_v; - requires invoke_result_convertible_to_, rep, Value>; - } + requires !Quantity; + requires is_same_v; + requires invoke_result_convertible_to_, rep, Value>; + } { return units::quantity(lhs.number() - rhs); } template [[nodiscard]] friend constexpr Quantity auto operator-(const Value& lhs, const quantity& rhs) requires requires { // TODO: Simplify when Clang catches up. - requires !Quantity; - requires is_same_v; - requires invoke_result_convertible_to_, Value, rep>; - } + requires !Quantity; + requires is_same_v; + requires invoke_result_convertible_to_, Value, rep>; + } { return units::quantity(lhs - rhs.number()); } @@ -445,14 +445,14 @@ public: // CTAD #if !UNITS_COMP_CLANG || UNITS_COMP_CLANG > 17 template -explicit(false) quantity(Rep&&)->quantity; +explicit(false) quantity(Rep&&) -> quantity; #endif template -explicit(false) quantity(quantity)->quantity; +explicit(false) quantity(quantity) -> quantity; template -explicit(false) quantity(Rep)->quantity; +explicit(false) quantity(Rep) -> quantity; template explicit quantity(Q) -> quantity::dimension, typename quantity_like_traits::unit, diff --git a/src/core/include/units/quantity_cast.h b/src/core/include/units/quantity_cast.h index 4449d722..8faf23e1 100644 --- a/src/core/include/units/quantity_cast.h +++ b/src/core/include/units/quantity_cast.h @@ -213,10 +213,10 @@ template Rep template [[nodiscard]] constexpr auto quantity_point_cast(const quantity_point& qp) requires requires { - requires is_specialization_of; - requires requires { quantity_cast(qp.relative()); }; - requires equivalent; - } || // TODO: Simplify when Clang catches up. + requires is_specialization_of; + requires requires { quantity_cast(qp.relative()); }; + requires equivalent; + } || // TODO: Simplify when Clang catches up. requires { quantity_cast(qp.relative()); } { if constexpr (is_specialization_of) @@ -268,12 +268,12 @@ template template [[nodiscard]] constexpr QuantityKind auto quantity_kind_cast(const quantity_kind& qk) requires requires { - requires is_specialization_of; - requires requires { quantity_cast(qk.common()); }; - } || requires { - requires Kind; - requires UnitOf; - } || requires { quantity_cast(qk.common()); } // TODO: Simplify when Clang catches up. + requires is_specialization_of; + requires requires { quantity_cast(qk.common()); }; + } || requires { + requires Kind; + requires UnitOf; + } || requires { quantity_cast(qk.common()); } // TODO: Simplify when Clang catches up. { if constexpr (is_specialization_of) return CastSpec(quantity_cast(qk.common())); @@ -331,10 +331,10 @@ template template [[nodiscard]] constexpr QuantityPointKind auto quantity_point_kind_cast(const quantity_point_kind& qpk) requires requires { - requires is_specialization_of; - requires requires { quantity_kind_cast(qpk.relative()); }; - requires equivalent; - } || requires { requires PointKind && UnitOf; } || + requires is_specialization_of; + requires requires { quantity_kind_cast(qpk.relative()); }; + requires equivalent; + } || requires { requires PointKind && UnitOf; } || requires { quantity_kind_cast(qpk.relative()); } // TODO: Simplify when Clang catches up. { if constexpr (is_specialization_of) diff --git a/src/core/include/units/quantity_kind.h b/src/core/include/units/quantity_kind.h index a47fd547..e806074f 100644 --- a/src/core/include/units/quantity_kind.h +++ b/src/core/include/units/quantity_kind.h @@ -250,10 +250,10 @@ public: template [[nodiscard]] friend constexpr QuantityKind auto operator*(const quantity_kind& qk, const Value& v) requires requires(quantity_type q) { - { - q* v - } -> Quantity; - } + { + q* v + } -> Quantity; + } { return detail::make_quantity_kind(qk.common() * v); } @@ -261,10 +261,10 @@ public: template [[nodiscard]] friend constexpr QuantityKind auto operator*(const Value& v, const quantity_kind& qk) requires requires(quantity_type q) { - { - v* q - } -> Quantity; - } + { + v* q + } -> Quantity; + } { return detail::make_quantity_kind(v * qk.common()); } @@ -272,10 +272,10 @@ public: template [[nodiscard]] friend constexpr QuantityKind auto operator/(const quantity_kind& qk, const Value& v) requires requires(quantity_type q) { - { - q / v - } -> Quantity; - } + { + q / v + } -> Quantity; + } { gsl_ExpectsAudit(v != quantity_values::zero()); return detail::make_quantity_kind(qk.common() / v); @@ -284,10 +284,10 @@ public: template [[nodiscard]] friend constexpr QuantityKind auto operator/(const Value& v, const quantity_kind& qk) requires requires(quantity_type q) { - { - v / q - } -> Quantity; - } + { + v / q + } -> Quantity; + } { gsl_ExpectsAudit(qk.common().number() != quantity_values::zero()); return detail::downcasted_kind(v / qk.common()); diff --git a/src/core/include/units/symbol_text.h b/src/core/include/units/symbol_text.h index 6eb71e6d..5ca2d12d 100644 --- a/src/core/include/units/symbol_text.h +++ b/src/core/include/units/symbol_text.h @@ -162,7 +162,7 @@ struct basic_symbol_text { } }; -basic_symbol_text(char)->basic_symbol_text; +basic_symbol_text(char) -> basic_symbol_text; template basic_symbol_text(StandardCharT, char) -> basic_symbol_text; diff --git a/src/core/include/units/unit.h b/src/core/include/units/unit.h index c388369c..f6a3aba1 100644 --- a/src/core/include/units/unit.h +++ b/src/core/include/units/unit.h @@ -211,7 +211,7 @@ template void is_named_impl(const volatile prefixed_alias_unit*); template -inline constexpr bool is_named = requires(U * u) { is_named_impl(u); }; +inline constexpr bool is_named = requires(U* u) { is_named_impl(u); }; template void can_be_prefixed_impl(const volatile named_unit*); @@ -223,7 +223,7 @@ template void can_be_prefixed_impl(const volatile alias_unit*); template -inline constexpr bool can_be_prefixed = requires(U * u) { can_be_prefixed_impl(u); }; +inline constexpr bool can_be_prefixed = requires(U* u) { can_be_prefixed_impl(u); }; template inline constexpr bool can_be_prefixed> = can_be_prefixed; diff --git a/test/unit_test/runtime/almost_equals.h b/test/unit_test/runtime/almost_equals.h index 561fc08a..19d4ed8e 100644 --- a/test/unit_test/runtime/almost_equals.h +++ b/test/unit_test/runtime/almost_equals.h @@ -31,8 +31,8 @@ struct AlmostEqualsMatcher : Catch::Matchers::MatcherGenericBase { AlmostEqualsMatcher(const T& target) : target_{target} {} template U> - requires std::same_as && treat_as_floating_point bool - match(const U& other) const + requires std::same_as && treat_as_floating_point + bool match(const U& other) const { using std::abs; using common = std::common_type_t; 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 b1f367c1..689c9666 100644 --- a/test/unit_test/static/custom_rep_test_min_expl.cpp +++ b/test/unit_test/static/custom_rep_test_min_expl.cpp @@ -187,42 +187,42 @@ static_assert(!Representation>); // quantity's operators should mirror the representation type capabilities template concept invalid_member_operations = requires(length lhs) { - requires !requires { +lhs; }; - requires !requires { -lhs; }; - requires !requires { ++lhs; }; - requires !requires { lhs++; }; - requires !requires { --lhs; }; - requires !requires { lhs--; }; + requires !requires { +lhs; }; + requires !requires { -lhs; }; + requires !requires { ++lhs; }; + requires !requires { lhs++; }; + requires !requires { --lhs; }; + requires !requires { lhs--; }; - requires !requires(length rhs) { lhs += rhs; }; - requires !requires(length 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(length rhs) { lhs += rhs; }; + requires !requires(length 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(length rhs) { lhs + rhs; }; - requires !requires(length 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(length rhs) { lhs + rhs; }; + requires !requires(length 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(length rhs) { lhs + rhs; }; - requires !requires(length 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(length rhs) { lhs + rhs; }; + requires !requires(length 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(std::ostream os) { os << lhs; }; - }; + requires !requires(std::ostream os) { os << lhs; }; +}; static_assert(invalid_member_operations>); // equality diff --git a/test/unit_test/static/quantity_kind_test.cpp b/test/unit_test/static/quantity_kind_test.cpp index 1d246f23..7ff5786c 100644 --- a/test/unit_test/static/quantity_kind_test.cpp +++ b/test/unit_test/static/quantity_kind_test.cpp @@ -110,17 +110,16 @@ static_assert(sizeof(width) == sizeof(double)); static_assert(sizeof(height) == sizeof(short)); template -concept invalid_types = - requires { - requires !requires { typename quantity_kind; }; // unit of a different dimension - requires !requires { typename quantity_kind>; }; // quantity used as Rep - requires !requires { // quantity point used as Rep - typename quantity_kind, metre>>; - }; - requires !requires { typename quantity_kind>; }; // quantity kind used as Rep - requires !requires { typename quantity_kind; }; // reordered arguments - requires !requires { typename quantity_kind; }; // reordered arguments +concept invalid_types = requires { + requires !requires { typename quantity_kind; }; // unit of a different dimension + requires !requires { typename quantity_kind>; }; // quantity used as Rep + requires !requires { // quantity point used as Rep + typename quantity_kind, metre>>; }; + requires !requires { typename quantity_kind>; }; // quantity kind used as Rep + requires !requires { typename quantity_kind; }; // reordered arguments + requires !requires { typename quantity_kind; }; // reordered arguments +}; static_assert(invalid_types); static_assert(std::is_trivially_default_constructible_v>); @@ -437,39 +436,38 @@ static_assert(same((-width(short{1} * m)).common(), int{-1} * m)); template concept invalid_compound_assignments_ = requires(quantity_kind w, Qx q) { - requires !requires { w += q; }; - requires !requires { w -= q; }; - requires !requires { w *= q; }; - requires !requires { w /= q; }; - requires !requires { w %= q; }; - }; + requires !requires { w += q; }; + requires !requires { w -= q; }; + requires !requires { w *= q; }; + requires !requires { w /= q; }; + requires !requires { w %= q; }; +}; template -concept invalid_compound_assignments = - requires(quantity_kind w, height h) { - requires !requires { w += 1; }; - requires !requires { w -= 1; }; - requires !requires { w *= 1 * (km / m); }; - requires !requires { w /= 1 * (km / m); }; - requires !requires { w %= 1 * (km / m); }; - requires !requires { w += m; }; - requires !requires { w -= m; }; - requires !requires { w *= m; }; - requires !requires { w /= m; }; - requires !requires { w %= m; }; - requires !requires { w *= quantity_kind, scaled_unit(), one>, int>{1}; }; - requires !requires { w /= quantity_kind, scaled_unit(), one>, int>{1}; }; - requires !requires { w %= quantity_kind, scaled_unit(), one>, int>{1}; }; - requires !requires { w %= 1.0; }; - requires !requires { w %= quantity(1.0); }; - requires !requires { w %= 1.0 * (w / w); }; - requires !requires { w %= 1.0 * w; }; - requires !requires { w %= h / h; }; - requires invalid_compound_assignments_>; - requires invalid_compound_assignments_>; - requires invalid_compound_assignments_>; - requires invalid_compound_assignments_, metre, int>>; - requires invalid_compound_assignments_; - }; +concept invalid_compound_assignments = requires(quantity_kind w, height h) { + requires !requires { w += 1; }; + requires !requires { w -= 1; }; + requires !requires { w *= 1 * (km / m); }; + requires !requires { w /= 1 * (km / m); }; + requires !requires { w %= 1 * (km / m); }; + requires !requires { w += m; }; + requires !requires { w -= m; }; + requires !requires { w *= m; }; + requires !requires { w /= m; }; + requires !requires { w %= m; }; + requires !requires { w *= quantity_kind, scaled_unit(), one>, int>{1}; }; + requires !requires { w /= quantity_kind, scaled_unit(), one>, int>{1}; }; + requires !requires { w %= quantity_kind, scaled_unit(), one>, int>{1}; }; + requires !requires { w %= 1.0; }; + requires !requires { w %= quantity(1.0); }; + requires !requires { w %= 1.0 * (w / w); }; + requires !requires { w %= 1.0 * w; }; + requires !requires { w %= h / h; }; + requires invalid_compound_assignments_>; + requires invalid_compound_assignments_>; + requires invalid_compound_assignments_>; + requires invalid_compound_assignments_, metre, int>>; + requires invalid_compound_assignments_; +}; static_assert(invalid_compound_assignments); static_assert(invalid_compound_assignments_); @@ -721,24 +719,24 @@ static_assert(std::equality_comparable_with, width, width>); template concept invalid_equality = requires(quantity_kind w) { - requires !requires { w == 1; }; - requires !requires { w != 1.0; }; - requires !requires { w == 1 * m; }; - requires !requires { w != 1.0 * cgs_cm; }; - requires !requires { w == 1 * km; }; - requires !requires { w != m; }; - requires !requires { w == km; }; - requires !requires { w != quantity(1); }; - requires !requires { w == dimensionless(1.0); }; - requires !requires { w != height(1 * m); }; - requires !requires { w == height(1.0 * km); }; - requires !requires { w != horizontal_area(1 * (m * m)); }; - requires !requires { w == rate_of_climb(1.0 * (km / h)); }; - requires !requires { w != quantity_point(1 * m); }; - requires !requires { w == quantity_point(1.0 * mm); }; - requires !requires { w != quantity_point(quantity(1)); }; - requires !requires { w == quantity_point(dimensionless(1.0)); }; - }; + requires !requires { w == 1; }; + requires !requires { w != 1.0; }; + requires !requires { w == 1 * m; }; + requires !requires { w != 1.0 * cgs_cm; }; + requires !requires { w == 1 * km; }; + requires !requires { w != m; }; + requires !requires { w == km; }; + requires !requires { w != quantity(1); }; + requires !requires { w == dimensionless(1.0); }; + requires !requires { w != height(1 * m); }; + requires !requires { w == height(1.0 * km); }; + requires !requires { w != horizontal_area(1 * (m * m)); }; + requires !requires { w == rate_of_climb(1.0 * (km / h)); }; + requires !requires { w != quantity_point(1 * m); }; + requires !requires { w == quantity_point(1.0 * mm); }; + requires !requires { w != quantity_point(quantity(1)); }; + requires !requires { w == quantity_point(dimensionless(1.0)); }; +}; static_assert(invalid_equality); static_assert(width(1 * m) < width(2 * m)); @@ -753,22 +751,22 @@ static_assert(std::three_way_comparable_with, width< static_assert(std::three_way_comparable_with, width>); template concept invalid_relational = requires(quantity_kind w) { - requires !requires { w < 1; }; - requires !requires { w <= 1.0; }; - requires !requires { w >= 1 * m; }; - requires !requires { w > 1.0 * cgs_cm; }; - requires !requires { w <=> 1 * km; }; - requires !requires { w < quantity(1); }; - requires !requires { w <= dimensionless(1.0); }; - requires !requires { w >= height(1 * m); }; - requires !requires { w > height(1.0 * km); }; - requires !requires { w <=> horizontal_area(1 * (m * m)); }; - requires !requires { w < rate_of_climb(1.0 * (km / h)); }; - requires !requires { w <= quantity_point(1 * m); }; - requires !requires { w >= quantity_point(1.0 * mm); }; - requires !requires { w > quantity_point(quantity(1)); }; - requires !requires { w <=> quantity_point(dimensionless(1.0)); }; - }; + requires !requires { w < 1; }; + requires !requires { w <= 1.0; }; + requires !requires { w >= 1 * m; }; + requires !requires { w > 1.0 * cgs_cm; }; + requires !requires { w <=> 1 * km; }; + requires !requires { w < quantity(1); }; + requires !requires { w <= dimensionless(1.0); }; + requires !requires { w >= height(1 * m); }; + requires !requires { w > height(1.0 * km); }; + requires !requires { w <=> horizontal_area(1 * (m * m)); }; + requires !requires { w < rate_of_climb(1.0 * (km / h)); }; + requires !requires { w <= quantity_point(1 * m); }; + requires !requires { w >= quantity_point(1.0 * mm); }; + requires !requires { w > quantity_point(quantity(1)); }; + requires !requires { w <=> quantity_point(dimensionless(1.0)); }; +}; static_assert(invalid_relational); @@ -807,37 +805,34 @@ static_assert(same(quantity_kind_cast>(width>(width(1 * cgs_cm)), width(1 * cgs_cm))); // clang-format on template -concept invalid_cast = - requires { - requires !requires { quantity_kind_cast>(quantity_kind(1 * m)); }; - requires !requires { - quantity_kind_cast>(quantity_kind(1 * m)); - }; - requires !requires { - quantity_kind_cast>(quantity_kind(1 * m)); - }; - requires !requires { quantity_kind_cast(quantity_kind(1 * m)); }; - requires !requires { quantity_kind_cast(quantity_kind(1 * m)); }; - requires !requires { quantity_kind_cast(quantity_kind(1 * m)); }; - requires !requires { quantity_kind_cast(quantity_kind(1 * m)); }; - requires !requires { - quantity_kind_cast(quantity_kind(1 * m)); - }; - requires !requires { - quantity_kind_cast(quantity_kind(1 * m)); - }; - requires !requires { quantity_kind_cast>(quantity_kind(1 * m)); }; - requires !requires { quantity_kind_cast(quantity_kind(1 * m)); }; - requires !requires { quantity_kind_cast(quantity_kind(1 * m)); }; - requires !requires { - quantity_kind_cast, metre, int>>( - quantity_kind(1 * m)); - }; - requires !requires { - quantity_kind_cast, one, int>>( - quantity_kind(1 * m)); - }; +concept invalid_cast = requires { + requires !requires { quantity_kind_cast>(quantity_kind(1 * m)); }; + requires !requires { + quantity_kind_cast>(quantity_kind(1 * m)); }; + requires !requires { + quantity_kind_cast>(quantity_kind(1 * m)); + }; + requires !requires { quantity_kind_cast(quantity_kind(1 * m)); }; + requires !requires { quantity_kind_cast(quantity_kind(1 * m)); }; + requires !requires { quantity_kind_cast(quantity_kind(1 * m)); }; + requires !requires { quantity_kind_cast(quantity_kind(1 * m)); }; + requires !requires { + quantity_kind_cast(quantity_kind(1 * m)); + }; + requires !requires { + quantity_kind_cast(quantity_kind(1 * m)); + }; + requires !requires { quantity_kind_cast>(quantity_kind(1 * m)); }; + requires !requires { quantity_kind_cast(quantity_kind(1 * m)); }; + requires !requires { quantity_kind_cast(quantity_kind(1 * m)); }; + requires !requires { + quantity_kind_cast, metre, int>>(quantity_kind(1 * m)); + }; + requires !requires { + quantity_kind_cast, one, int>>(quantity_kind(1 * m)); + }; +}; static_assert(invalid_cast); diff --git a/test/unit_test/static/quantity_point_kind_test.cpp b/test/unit_test/static/quantity_point_kind_test.cpp index 9a234a29..07de439b 100644 --- a/test/unit_test/static/quantity_point_kind_test.cpp +++ b/test/unit_test/static/quantity_point_kind_test.cpp @@ -150,21 +150,20 @@ static_assert(sizeof(abscissa) == sizeof(double)); static_assert(sizeof(ordinate) == sizeof(short)); template -concept invalid_types = - requires { - requires !requires { typename quantity_point_kind; }; // width_kind is not a point kind - requires !requires { typename quantity_point_kind; }; // unit of a different dimension - requires !requires { typename quantity_point_kind>; }; // quantity used as Rep - requires !requires { - typename quantity_point_kind, metre>>; - }; // quantity point used as Rep - requires !requires { typename quantity_point_kind>; }; // quantity kind used as Rep - requires !requires { - typename quantity_point_kind>; - }; // quantity point kind used as Rep - requires !requires { typename quantity_point_kind; }; // reordered arguments - requires !requires { typename quantity_point_kind; }; // reordered arguments - }; +concept invalid_types = requires { + requires !requires { typename quantity_point_kind; }; // width_kind is not a point kind + requires !requires { typename quantity_point_kind; }; // unit of a different dimension + requires !requires { typename quantity_point_kind>; }; // quantity used as Rep + requires !requires { + typename quantity_point_kind, metre>>; + }; // quantity point used as Rep + requires !requires { typename quantity_point_kind>; }; // quantity kind used as Rep + requires !requires { + typename quantity_point_kind>; + }; // quantity point kind used as Rep + requires !requires { typename quantity_point_kind; }; // reordered arguments + requires !requires { typename quantity_point_kind; }; // reordered arguments +}; static_assert(invalid_types); static_assert(std::is_trivially_default_constructible_v>); @@ -474,20 +473,19 @@ static_assert([]() { template concept invalid_compound_assignments_ = requires(quantity_point_kind x, Qx q) { - requires !requires { x += q; }; - requires !requires { x -= q; }; - }; + requires !requires { x += q; }; + requires !requires { x -= q; }; +}; template -concept invalid_compound_assignments = - requires(quantity_point_kind x) { - requires !requires { x += 1; }; - requires !requires { x -= 1; }; - requires invalid_compound_assignments_>; - requires invalid_compound_assignments_>; - requires invalid_compound_assignments_>; - requires invalid_compound_assignments_, metre, int>>; - requires invalid_compound_assignments_; - }; +concept invalid_compound_assignments = requires(quantity_point_kind x) { + requires !requires { x += 1; }; + requires !requires { x -= 1; }; + requires invalid_compound_assignments_>; + requires invalid_compound_assignments_>; + requires invalid_compound_assignments_>; + requires invalid_compound_assignments_, metre, int>>; + requires invalid_compound_assignments_; +}; static_assert(invalid_compound_assignments); static_assert(invalid_compound_assignments_); #if __cpp_lib_chrono >= 201907L @@ -564,26 +562,26 @@ static_assert(std::equality_comparable_with, abscissa concept invalid_equality = requires(quantity_point_kind x, Int i) { - requires !requires { x == 1; }; - requires !requires { x != 1.0; }; - requires !requires { x == 1 * m; }; - requires !requires { x != 1.0 * cgs_cm; }; - requires !requires { x == 1 * km; }; - requires !requires { x != quantity(1); }; - requires !requires { x == dimensionless(1.0); }; - requires !requires { x != width(1 * m); }; - requires !requires { x == width(1.0 * km); }; - requires !requires { x != height(1 * m); }; - requires !requires { x == height(1.0 * km); }; - requires !requires { x == rate_of_climb(1.0 * (km / h)); }; - requires !requires { x != quantity_point(1 * m); }; - requires !requires { x == quantity_point(1.0 * mm); }; - requires !requires { x != quantity_point(quantity(1)); }; - requires !requires { x == quantity_point(dimensionless(1.0)); }; - requires !requires { x != quantity_point_kind(cgs_width(1 * m)); }; - requires !requires { x == ordinate(1 * m); }; - requires !requires { screen_si_width{} != screen_si_cgs_width{}; }; - }; + requires !requires { x == 1; }; + requires !requires { x != 1.0; }; + requires !requires { x == 1 * m; }; + requires !requires { x != 1.0 * cgs_cm; }; + requires !requires { x == 1 * km; }; + requires !requires { x != quantity(1); }; + requires !requires { x == dimensionless(1.0); }; + requires !requires { x != width(1 * m); }; + requires !requires { x == width(1.0 * km); }; + requires !requires { x != height(1 * m); }; + requires !requires { x == height(1.0 * km); }; + requires !requires { x == rate_of_climb(1.0 * (km / h)); }; + requires !requires { x != quantity_point(1 * m); }; + requires !requires { x == quantity_point(1.0 * mm); }; + requires !requires { x != quantity_point(quantity(1)); }; + requires !requires { x == quantity_point(dimensionless(1.0)); }; + requires !requires { x != quantity_point_kind(cgs_width(1 * m)); }; + requires !requires { x == ordinate(1 * m); }; + requires !requires { screen_si_width{} != screen_si_cgs_width{}; }; +}; static_assert(invalid_equality); // clang-format off @@ -599,28 +597,27 @@ static_assert(std::three_way_comparable_with, abs static_assert(std::three_way_comparable_with, abscissa>); // clang-format on template -concept invalid_relational = - requires(quantity_point_kind x, Int i) { - requires !requires { x < 1; }; - requires !requires { x <= 1.0; }; - requires !requires { x >= 1 * m; }; - requires !requires { x > 1.0 * cgs_cm; }; - requires !requires { x <=> 1 * km; }; - requires !requires { x < quantity(1); }; - requires !requires { x <= dimensionless(1.0); }; - requires !requires { x >= width(1 * m); }; - requires !requires { x > width(1.0 * km); }; - requires !requires { x <=> height(1 * m); }; - requires !requires { x < height(1.0 * km); }; - requires !requires { x <= rate_of_climb(1.0 * (km / h)); }; - requires !requires { x >= quantity_point(1 * m); }; - requires !requires { x > quantity_point(1.0 * mm); }; - requires !requires { x <=> quantity_point(quantity(1)); }; - requires !requires { x < quantity_point(dimensionless(1.0)); }; - requires !requires { x <= quantity_point_kind(cgs_width(1 * m)); }; - requires !requires { x >= ordinate(1 * m); }; - requires !requires { screen_si_width{} > screen_si_cgs_width{}; }; - }; +concept invalid_relational = requires(quantity_point_kind x, Int i) { + requires !requires { x < 1; }; + requires !requires { x <= 1.0; }; + requires !requires { x >= 1 * m; }; + requires !requires { x > 1.0 * cgs_cm; }; + requires !requires { x <=> 1 * km; }; + requires !requires { x < quantity(1); }; + requires !requires { x <= dimensionless(1.0); }; + requires !requires { x >= width(1 * m); }; + requires !requires { x > width(1.0 * km); }; + requires !requires { x <=> height(1 * m); }; + requires !requires { x < height(1.0 * km); }; + requires !requires { x <= rate_of_climb(1.0 * (km / h)); }; + requires !requires { x >= quantity_point(1 * m); }; + requires !requires { x > quantity_point(1.0 * mm); }; + requires !requires { x <=> quantity_point(quantity(1)); }; + requires !requires { x < quantity_point(dimensionless(1.0)); }; + requires !requires { x <= quantity_point_kind(cgs_width(1 * m)); }; + requires !requires { x >= ordinate(1 * m); }; + requires !requires { screen_si_width{} > screen_si_cgs_width{}; }; +}; static_assert(invalid_relational); @@ -672,35 +669,32 @@ static_assert(comp(quantity_point_kind_cast>(abscissa>(screen_si_width(1 * m)), screen_si_cgs_width(1 * m))); // clang-format on template -concept invalid_cast = - requires(Int i) { - requires !requires { quantity_point_kind_cast>(abscissa(i * m)); }; - requires !requires { quantity_point_kind_cast>(abscissa(i * m)); }; - requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; - requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; - requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; - requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; - requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; - requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; - requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; - requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; - requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; - requires !requires { quantity_point_kind_cast>(abscissa(i * m)); }; - requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; - requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; - requires !requires { - quantity_point_kind_cast, metre, Int>>( - abscissa(i * m)); - }; - requires !requires { - quantity_point_kind_cast, one, Int>>( - abscissa(i * m)); - }; - requires !requires { - quantity_point_kind_cast, metre, Int>>( - screen_si_width(i * m)); - }; +concept invalid_cast = requires(Int i) { + requires !requires { quantity_point_kind_cast>(abscissa(i * m)); }; + requires !requires { quantity_point_kind_cast>(abscissa(i * m)); }; + requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; + requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; + requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; + requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; + requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; + requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; + requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; + requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; + requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; + requires !requires { quantity_point_kind_cast>(abscissa(i * m)); }; + requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; + requires !requires { quantity_point_kind_cast(abscissa(i * m)); }; + requires !requires { + quantity_point_kind_cast, metre, Int>>(abscissa(i * m)); }; + requires !requires { + quantity_point_kind_cast, one, Int>>(abscissa(i * m)); + }; + requires !requires { + quantity_point_kind_cast, metre, Int>>( + screen_si_width(i * m)); + }; +}; static_assert(invalid_cast); diff --git a/test/unit_test/static/quantity_point_test.cpp b/test/unit_test/static/quantity_point_test.cpp index 8eb42c4c..cd57a32d 100644 --- a/test/unit_test/static/quantity_point_test.cpp +++ b/test/unit_test/static/quantity_point_test.cpp @@ -46,22 +46,20 @@ struct sea_level_origin : point_origin {}; // class invariants template -concept invalid_types = - requires { - // unit of a different dimension: - requires !requires { typename quantity_point, second, int>; }; - // quantity used as Rep: - requires !requires { typename quantity_point, metre, quantity>; }; - // quantity point used as Rep: - requires !requires { - typename quantity_point, metre, - quantity_point, metre, int>>; - }; - // reordered arguments: - requires !requires { typename quantity_point, double>; }; - // dimension used as origin: - requires !requires { typename quantity_point; }; +concept invalid_types = requires { + // unit of a different dimension: + requires !requires { typename quantity_point, second, int>; }; + // quantity used as Rep: + requires !requires { typename quantity_point, metre, quantity>; }; + // quantity point used as Rep: + requires !requires { + typename quantity_point, metre, quantity_point, metre, int>>; }; + // reordered arguments: + requires !requires { typename quantity_point, double>; }; + // dimension used as origin: + requires !requires { typename quantity_point; }; +}; static_assert(invalid_types); @@ -237,9 +235,9 @@ static_assert(quantity_point(1000_q_m) <= quantity_point(1_q_km)); template concept invalid_comparisons = requires(quantity_point, metre, Int> lhs, quantity_point rhs) { - requires !requires { lhs == rhs; }; - requires !requires { lhs < rhs; }; - }; + requires !requires { lhs == rhs; }; + requires !requires { lhs < rhs; }; +}; static_assert(invalid_comparisons); // alias units @@ -295,16 +293,15 @@ static_assert( quantity_point_cast(quantity_point(2000.0_q_m / 3600.0_q_s)).relative().number() == 2); template -concept invalid_cast = - requires(Int i) { - requires !requires { - quantity_point_cast, second, Int>>(quantity_point(i * m)); - }; - requires !requires { - quantity_point_cast, metre, Int>>( - quantity_point(i * m)); - }; +concept invalid_cast = requires(Int i) { + requires !requires { + quantity_point_cast, second, Int>>(quantity_point(i * m)); }; + requires !requires { + quantity_point_cast, metre, Int>>( + quantity_point(i * m)); + }; +}; static_assert(invalid_cast); // time diff --git a/test/unit_test/static/quantity_test.cpp b/test/unit_test/static/quantity_test.cpp index 2a7bc682..1c285a87 100644 --- a/test/unit_test/static/quantity_test.cpp +++ b/test/unit_test/static/quantity_test.cpp @@ -58,11 +58,11 @@ static_assert(sizeof(length) == sizeof(short)); #if UNITS_COMP_GCC != 10 || UNITS_COMP_GCC_MINOR > 2 template typename Q> concept invalid_types = requires { - requires !requires { typename Q; }; // unit of a different dimension - requires !requires { typename Q>; }; // quantity used as Rep - requires !requires { typename Q; }; // reordered arguments - requires !requires { typename Q; }; // reordered arguments - }; + requires !requires { typename Q; }; // unit of a different dimension + requires !requires { typename Q>; }; // quantity used as Rep + requires !requires { typename Q; }; // reordered arguments + requires !requires { typename Q; }; // reordered arguments +}; static_assert(invalid_types); #endif @@ -408,44 +408,43 @@ static_assert((22_q_m /= quantity(3.33)).number() == 6); #endif template -concept invalid_compound_assignments = - requires() { - // truncating not allowed - requires !requires(length l) { l += 2.5_q_m; }; - requires !requires(length l) { l -= 2.5_q_m; }; - requires !requires(length l) { l += length(2); }; - requires !requires(length l) { l -= length(2); }; - requires !requires(length l) { l %= length(2); }; - requires !requires(length l) { l %= dimensionless(2); }; - requires !requires(length l) { l %= dimensionless(2); }; +concept invalid_compound_assignments = requires() { + // truncating not allowed + requires !requires(length l) { l += 2.5_q_m; }; + requires !requires(length l) { l -= 2.5_q_m; }; + requires !requires(length l) { l += length(2); }; + requires !requires(length l) { l -= length(2); }; + requires !requires(length l) { l %= length(2); }; + requires !requires(length l) { l %= dimensionless(2); }; + requires !requires(length l) { l %= dimensionless(2); }; - // TODO: accept non-truncating argument - requires !requires(length l) { l *= 1 * (km / m); }; - requires !requires(length l) { l /= 1 * (km / m); }; - requires !requires(length l) { l %= 1 * (km / m); }; + // TODO: accept non-truncating argument + requires !requires(length l) { l *= 1 * (km / m); }; + requires !requires(length l) { l /= 1 * (km / m); }; + requires !requires(length l) { l %= 1 * (km / m); }; - // only quantities can be added or subtracted - requires !requires(length l) { l += 2; }; - requires !requires(length l) { l -= 2; }; + // only quantities can be added or subtracted + requires !requires(length l) { l += 2; }; + requires !requires(length l) { l -= 2; }; - // compound multiply/divide by another quantity not allowed - requires !requires(length l) { l *= 2_q_m; }; - requires !requires(length l) { l /= 2_q_m; }; + // compound multiply/divide by another quantity not allowed + requires !requires(length l) { l *= 2_q_m; }; + requires !requires(length l) { l /= 2_q_m; }; - // modulo operations on a floating point representation not allowed - requires !requires(length l) { l %= 2.; }; - requires !requires(length l) { l %= 2; }; - requires !requires(length l) { l %= 2._q_m; }; - requires !requires(length l) { l %= 2_q_m; }; - requires !requires(length l) { l %= 2._q_m; }; + // modulo operations on a floating point representation not allowed + requires !requires(length l) { l %= 2.; }; + requires !requires(length l) { l %= 2; }; + requires !requires(length l) { l %= 2._q_m; }; + requires !requires(length l) { l %= 2_q_m; }; + requires !requires(length l) { l %= 2._q_m; }; - // no unit constants - requires !requires(length l) { l += m; }; - requires !requires(length l) { l -= m; }; - requires !requires(length l) { l *= m; }; - requires !requires(length l) { l /= m; }; - requires !requires(length l) { l %= m; }; - }; + // no unit constants + requires !requires(length l) { l += m; }; + requires !requires(length l) { l -= m; }; + requires !requires(length l) { l *= m; }; + requires !requires(length l) { l /= m; }; + requires !requires(length l) { l %= m; }; +}; static_assert(invalid_compound_assignments); @@ -455,26 +454,26 @@ static_assert(invalid_compound_assignments); template concept invalid_binary_operations = requires { - // no crossdimensional addition and subtraction - requires !requires { 1_q_s + length(1); }; - requires !requires { 1_q_s - length(1); }; + // no crossdimensional addition and subtraction + requires !requires { 1_q_s + length(1); }; + requires !requires { 1_q_s - length(1); }; - // no floating-point modulo - requires !requires(length a) { a % 2_q_m; }; - requires !requires(length a) { 2_q_m % a; }; - requires !requires(length a) { a % 2; }; - requires !requires(length a, length b) { a % b; }; - requires !requires(length a, length b) { a % b; }; - requires !requires(length a, length b) { b % a; }; + // no floating-point modulo + requires !requires(length a) { a % 2_q_m; }; + requires !requires(length a) { 2_q_m % a; }; + requires !requires(length a) { a % 2; }; + requires !requires(length a, length b) { a % b; }; + requires !requires(length a, length b) { a % b; }; + requires !requires(length a, length b) { b % a; }; - // unit constants - requires !requires { length(1) + m; }; - requires !requires { length(1) - m; }; - requires !requires { length(1) % m; }; - requires !requires { m + length(1); }; - requires !requires { m - length(1); }; - requires !requires { m % length(1); }; - }; + // unit constants + requires !requires { length(1) + m; }; + requires !requires { length(1) - m; }; + requires !requires { length(1) % m; }; + requires !requires { m + length(1); }; + requires !requires { m - length(1); }; + requires !requires { m % length(1); }; +}; static_assert(invalid_binary_operations); // same representation type @@ -725,9 +724,9 @@ static_assert(quantity{2} / (1 * m) == 2 / 1_q_m); template concept no_crossdimensional_equality = requires { - requires !requires { 1_q_s == length(1); }; - requires !requires { 1_q_s != length(1); }; - }; + requires !requires { 1_q_s == length(1); }; + requires !requires { 1_q_s != length(1); }; +}; static_assert(no_crossdimensional_equality); // same type @@ -761,11 +760,11 @@ static_assert(123 != quantity{321}); template concept no_crossdimensional_ordering = requires { - requires !requires { 1_q_s < length(1); }; - requires !requires { 1_q_s > length(1); }; - requires !requires { 1_q_s <= length(1); }; - requires !requires { 1_q_s >= length(1); }; - }; + requires !requires { 1_q_s < length(1); }; + requires !requires { 1_q_s > length(1); }; + requires !requires { 1_q_s <= length(1); }; + requires !requires { 1_q_s >= length(1); }; +}; static_assert(no_crossdimensional_ordering); // same type @@ -837,9 +836,9 @@ static_assert(!std::equality_comparable_with, double>); template concept invalid_dimensionless_operations = requires { - requires !requires(dimensionless d) { 1 + d; }; - requires !requires(dimensionless d) { d + 1; }; - }; + requires !requires(dimensionless d) { 1 + d; }; + requires !requires(dimensionless d) { d + 1; }; +}; static_assert(invalid_dimensionless_operations); static_assert(compare>); diff --git a/test/unit_test/static/references_test.cpp b/test/unit_test/static/references_test.cpp index 56714358..0447e098 100644 --- a/test/unit_test/static/references_test.cpp +++ b/test/unit_test/static/references_test.cpp @@ -37,24 +37,24 @@ static_assert(2 * m == 2_q_m); static_assert(2 * s == 2_q_s); template concept invalid_operations = requires { - requires !requires { 2 / s; }; - requires !requires { s / 2; }; - requires !requires { s * 2; }; - requires !requires { s + 2; }; - requires !requires { 2 + s; }; - requires !requires { s + s; }; - requires !requires { s - 2; }; - requires !requires { 2 - s; }; - requires !requires { s - s; }; - requires !requires { s + 1_q_s; }; - requires !requires { s - 1_q_s; }; - requires !requires { s * 1_q_s; }; - requires !requires { s / 1_q_s; }; - requires !requires { 1_q_s + s; }; - requires !requires { 1_q_s - s; }; - requires !requires { 1_q_s * s; }; - requires !requires { 1_q_s / s; }; - }; + requires !requires { 2 / s; }; + requires !requires { s / 2; }; + requires !requires { s * 2; }; + requires !requires { s + 2; }; + requires !requires { 2 + s; }; + requires !requires { s + s; }; + requires !requires { s - 2; }; + requires !requires { 2 - s; }; + requires !requires { s - s; }; + requires !requires { s + 1_q_s; }; + requires !requires { s - 1_q_s; }; + requires !requires { s * 1_q_s; }; + requires !requires { s / 1_q_s; }; + requires !requires { 1_q_s + s; }; + requires !requires { 1_q_s - s; }; + requires !requires { 1_q_s * s; }; + requires !requires { 1_q_s / s; }; +}; static_assert(invalid_operations); static_assert(2_q_m / (1 * s) == 2_q_m_per_s);