diff --git a/src/core/include/units/quantity.h b/src/core/include/units/quantity.h index 9eb2722b..39c3c805 100644 --- a/src/core/include/units/quantity.h +++ b/src/core/include/units/quantity.h @@ -45,6 +45,12 @@ inline constexpr auto make_quantity = [](auto&& v) { return quantity(std::forward(v)); }; +template +concept quantity_one = + Quantity && + (std::same_as || std::same_as>) && + detail::equivalent_unit::value; + } // namespace detail template @@ -133,8 +139,7 @@ public: template requires(safe_convertible_to_, rep>) - constexpr explicit(!(std::same_as && std::same_as)) quantity(Value&& v) : - number_(std::forward(v)) + constexpr explicit(!detail::quantity_one) quantity(Value&& v) : number_(std::forward(v)) { } @@ -252,9 +257,9 @@ public: number_ *= rhs; return *this; } - template - constexpr quantity& operator*=(const dimensionless& rhs) - requires requires(rep a, const Rep2 b) { + template + constexpr quantity& operator*=(const Q& rhs) + requires requires(rep a, const typename Q::rep b) { { a *= b } -> std::same_as; @@ -276,15 +281,15 @@ public: number_ /= rhs; return *this; } - template - constexpr quantity& operator/=(const dimensionless& rhs) - requires requires(rep a, const Rep2 b) { + template + constexpr quantity& operator/=(const Q& rhs) + requires requires(rep a, const typename Q::rep b) { { a /= b } -> std::same_as; } { - gsl_ExpectsAudit(rhs.number() != quantity_values::zero()); + gsl_ExpectsAudit(rhs.number() != quantity_values::zero()); number_ /= rhs.number(); return *this; } @@ -302,15 +307,15 @@ public: return *this; } - template - constexpr quantity& operator%=(const dimensionless& rhs) - requires(!floating_point_) && (!floating_point_) && requires(rep a, const Rep2 b) { - { - a %= b - } -> std::same_as; - } + 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; + } { - gsl_ExpectsAudit(rhs.number() != quantity_values::zero()); + gsl_ExpectsAudit(rhs.number() != quantity_values::zero()); number_ %= rhs.number(); return *this; } diff --git a/src/core/include/units/quantity_kind.h b/src/core/include/units/quantity_kind.h index a4bcc594..a47fd547 100644 --- a/src/core/include/units/quantity_kind.h +++ b/src/core/include/units/quantity_kind.h @@ -54,6 +54,10 @@ inline constexpr auto downcasted_kind_fn = [](auto q) { template inline constexpr auto& downcasted_kind = downcasted_kind_fn; +template +concept quantity_kind_one = QuantityKind && equivalent> && + detail::quantity_one; + } // namespace detail /** @@ -198,8 +202,8 @@ public: q_ *= rhs; return *this; } - template - constexpr quantity_kind& operator*=(const quantity_kind, units::one, Rep2>& rhs) + template QK> + constexpr quantity_kind& operator*=(const QK& rhs) requires requires(quantity_type q) { q *= rhs.common(); } { q_ *= rhs.common(); @@ -214,8 +218,8 @@ public: q_ /= rhs; return *this; } - template - constexpr quantity_kind& operator/=(const quantity_kind, units::one, Rep2>& rhs) + template QK> + constexpr quantity_kind& operator/=(const QK& rhs) requires requires(quantity_type q) { q /= rhs.common(); } { q_ /= rhs.common(); @@ -233,8 +237,7 @@ public: template constexpr quantity_kind& operator%=(const QK& rhs) - requires(QuantityKindEquivalentTo || - std::same_as>) && + requires(QuantityKindEquivalentTo || detail::quantity_kind_one) && requires(quantity_type q) { q %= rhs.common(); } { gsl_ExpectsAudit(rhs.common().number() != quantity_values::zero()); diff --git a/test/unit_test/static/chrono_test.cpp b/test/unit_test/static/chrono_test.cpp index 348ec3ba..952ce1fa 100644 --- a/test/unit_test/static/chrono_test.cpp +++ b/test/unit_test/static/chrono_test.cpp @@ -20,6 +20,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. +#include "test_tools.h" #include #include #include @@ -82,12 +83,12 @@ static_assert(!std::convertible_to>); -static_assert(is_same_v>); -static_assert(is_same_v>); -static_assert(is_same_v>); +static_assert(compare>); +static_assert(compare>); +static_assert(compare>); +static_assert(compare>); // operators static_assert(quantity{1s} + 1_q_s == 2_q_s); diff --git a/test/unit_test/static/kind_test.cpp b/test/unit_test/static/kind_test.cpp index 3e9b4eb8..0c79059c 100644 --- a/test/unit_test/static/kind_test.cpp +++ b/test/unit_test/static/kind_test.cpp @@ -20,6 +20,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. +#include "test_tools.h" #include #include #include @@ -62,7 +63,7 @@ static_assert(!PointKind); static_assert(is_same_v); static_assert(is_same_v); -static_assert(is_same_v, downcast_kind>); +static_assert(compare, downcast_kind>); static_assert(equivalent); static_assert(equivalent); @@ -124,7 +125,7 @@ static_assert(PointKind); static_assert(is_same_v); static_assert(is_same_v); -static_assert(is_same_v, downcast_point_kind>); +static_assert(compare, downcast_point_kind>); static_assert(equivalent); static_assert(equivalent); @@ -162,8 +163,8 @@ static_assert(!PointKind); static_assert(is_same_v); static_assert(is_same_v); -static_assert(is_same_v, downcast_kind>); -static_assert(is_same_v, downcast_kind>); +static_assert(compare, downcast_kind>); +static_assert(compare, downcast_kind>); static_assert(equivalent); static_assert(equivalent); @@ -181,7 +182,7 @@ static_assert(PointKind); static_assert(is_same_v); static_assert(is_same_v); -static_assert(is_same_v, downcast_point_kind>); +static_assert(compare, downcast_point_kind>); static_assert(equivalent); static_assert(equivalent); @@ -200,6 +201,6 @@ static_assert(!equivalent); static_assert(!equivalent); -static_assert(is_same_v, downcast_kind>); +static_assert(compare, downcast_kind>); } // namespace diff --git a/test/unit_test/static/quantity_kind_test.cpp b/test/unit_test/static/quantity_kind_test.cpp index d9dc2961..c696c1ca 100644 --- a/test/unit_test/static/quantity_kind_test.cpp +++ b/test/unit_test/static/quantity_kind_test.cpp @@ -481,11 +481,11 @@ static_assert(invalid_compound_assignments_(2 * m) + width(3 * m), width(5 * m))); static_assert(same(width(2 * m) + width(3. * m), width(5. * m))); static_assert(same(width(2. * m) + width(3 * m), width(5. * m))); -static_assert(same(width(2 * km) + width(3e3 * m), width(5e3 * m))); +static_assert(comp(width(2 * km) + width(3e3 * m), width(5e3 * m))); static_assert(same(width(2 * m) - width(3 * m), width(-1 * m))); static_assert(same(width(2 * m) - width(3. * m), width(-1. * m))); static_assert(same(width(2. * m) - width(3 * m), width(-1. * m))); -static_assert(same(width(2e3 * m) - width(3 * km), width(-1e3 * m))); +static_assert(comp(width(2e3 * m) - width(3 * km), width(-1e3 * m))); static_assert( is_same_v(0 * m) + width(0 * m)).common().number()), @@ -531,131 +531,131 @@ static_assert(same(2 * width(3 * m), width(6 * m))); static_assert(same(2 * width(3. * m), width(6. * m))); static_assert(same(2. * width(3 * m), width(6. * m))); -static_assert(same(width(2 * m) * quantity(3), width(6 * m))); -static_assert(same(width(2 * m) * quantity(3.), width(6. * m))); -static_assert(same(width(2. * m) * quantity(3), width(6. * m))); -static_assert(same(quantity(2) * width(3 * m), width(6 * m))); -static_assert(same(quantity(2) * width(3. * m), width(6. * m))); -static_assert(same(quantity(2.) * width(3 * m), width(6. * m))); +static_assert(comp(width(2 * m) * quantity(3), width(6 * m))); +static_assert(comp(width(2 * m) * quantity(3.), width(6. * m))); +static_assert(comp(width(2. * m) * quantity(3), width(6. * m))); +static_assert(comp(quantity(2) * width(3 * m), width(6 * m))); +static_assert(comp(quantity(2) * width(3. * m), width(6. * m))); +static_assert(comp(quantity(2.) * width(3 * m), width(6. * m))); -static_assert(same(width(2 * m) * quantity_kind, one, int>(3), +static_assert(comp(width(2 * m) * quantity_kind, one, int>(3), width(6 * m))); -static_assert(same(width(2 * m) * quantity_kind, one, double>(3.), +static_assert(comp(width(2 * m) * quantity_kind, one, double>(3.), width(6. * m))); -static_assert(same(width(2. * m) * quantity_kind, one, int>(3), +static_assert(comp(width(2. * m) * quantity_kind, one, int>(3), width(6. * m))); -static_assert(same(quantity_kind, one, int>(2) * width(3 * m), +static_assert(comp(quantity_kind, one, int>(2) * width(3 * m), width(6 * m))); -static_assert(same(quantity_kind, one, int>(2) * width(3. * m), +static_assert(comp(quantity_kind, one, int>(2) * width(3. * m), width(6. * m))); -static_assert(same(quantity_kind, one, double>(2.) * width(3 * m), +static_assert(comp(quantity_kind, one, double>(2.) * width(3 * m), width(6. * m))); -static_assert(same(height(2 * m) * (3 * Hz), rate_of_climb(6 * (m / s)))); -static_assert(same(height(2 * m) * (3. * Hz), rate_of_climb(6. * (m / s)))); -static_assert(same(height(2. * m) * (3 * Hz), rate_of_climb(6. * (m / s)))); -static_assert(same((2 * Hz) * height(3 * m), rate_of_climb(6 * (m / s)))); -static_assert(same((2 * Hz) * height(3. * m), rate_of_climb(6. * (m / s)))); -static_assert(same((2. * Hz) * height(3 * m), rate_of_climb(6. * (m / s)))); +static_assert(comp(height(2 * m) * (3 * Hz), rate_of_climb(6 * (m / s)))); +static_assert(comp(height(2 * m) * (3. * Hz), rate_of_climb(6. * (m / s)))); +static_assert(comp(height(2. * m) * (3 * Hz), rate_of_climb(6. * (m / s)))); +static_assert(comp((2 * Hz) * height(3 * m), rate_of_climb(6 * (m / s)))); +static_assert(comp((2 * Hz) * height(3. * m), rate_of_climb(6. * (m / s)))); +static_assert(comp((2. * Hz) * height(3 * m), rate_of_climb(6. * (m / s)))); -static_assert(same(quantity_kind(2 * s) * (3 * Hz), +static_assert(comp(quantity_kind(2 * s) * (3 * Hz), quantity_kind, one, int>(6))); -static_assert(same((3 * Hz) * quantity_kind(2 * s), +static_assert(comp((3 * Hz) * quantity_kind(2 * s), quantity_kind, one, int>(6))); -static_assert(same(apples(2) * quantity(2), apples(4))); -static_assert(same(quantity(2) * apples(2), apples(4))); +static_assert(comp(apples(2) * quantity(2), apples(4))); +static_assert(comp(quantity(2) * apples(2), apples(4))); // clang-format off -static_assert(same(width(4 * m) * (1 * m), horizontal_area(4 * (m * m)))); -static_assert(same(width(2 * m) * width(2 * m), horizontal_area(4 * (m * m)))); -static_assert(same(width(2 * m) * width(2 * m), horizontal_area(4 * (m * m)))); -static_assert(same(width(2 * m) * width(2 * m), horizontal_area(4 * (m * m)))); +static_assert(comp(width(4 * m) * (1 * m), horizontal_area(4 * (m * m)))); +static_assert(comp(width(2 * m) * width(2 * m), horizontal_area(4 * (m * m)))); +static_assert(comp(width(2 * m) * width(2 * m), horizontal_area(4 * (m * m)))); +static_assert(comp(width(2 * m) * width(2 * m), horizontal_area(4 * (m * m)))); // clang-format on -static_assert(same(apples(2) * apples(2), apples(4))); -static_assert(same(apples(2) * (2 / apples(1)), apples(4))); +static_assert(comp(apples(2) * apples(2), apples(4))); +static_assert(comp(apples(2) * (2 / apples(1)), apples(4))); -static_assert(same(width(4 * m) * (1 * mm), horizontal_area(4 * (m * mm)))); -static_assert(same(width(2 * m) * width(2 * m), horizontal_area(4 * (m * m)))); -static_assert(same(width(2 * m) * (1 / width(2 * m)), +static_assert(comp(width(4 * m) * (1 * mm), horizontal_area(4 * (m * mm)))); +static_assert(comp(width(2 * m) * width(2 * m), horizontal_area(4 * (m * m)))); +static_assert(comp(width(2 * m) * (1 / width(2 * m)), quantity_kind, one>(1))); static_assert(same(width(2 * m) / 3, width(0 * m))); static_assert(same(width(2 * m) / 3., width(2 / 3. * m))); static_assert(same(width(2. * m) / 3, width(2. / 3 * m))); -static_assert(same(width(2 * m) / quantity(3), width(0 * m))); -static_assert(same(width(2 * m) / quantity(3.), width(2 / 3. * m))); -static_assert(same(width(2. * m) / quantity(3), width(2. / 3 * m))); +static_assert(comp(width(2 * m) / quantity(3), width(0 * m))); +static_assert(comp(width(2 * m) / quantity(3.), width(2 / 3. * m))); +static_assert(comp(width(2. * m) / quantity(3), width(2. / 3 * m))); -static_assert(same(width(2 * m) / quantity_kind, one, int>(3), +static_assert(comp(width(2 * m) / quantity_kind, one, int>(3), width(0 * m))); -static_assert(same(width(2 * m) / quantity_kind, one, double>(3.), +static_assert(comp(width(2 * m) / quantity_kind, one, double>(3.), width(2 / 3. * m))); -static_assert(same(width(2. * m) / quantity_kind, one, double>(3), +static_assert(comp(width(2. * m) / quantity_kind, one, double>(3), width(2. / 3 * m))); -static_assert(same(2 / quantity_kind(3 * s), +static_assert(comp(2 / quantity_kind(3 * s), quantity_kind, hertz, int>(2 / 3 / (1 * s)))); -static_assert(same(2 / quantity_kind(3. * s), +static_assert(comp(2 / quantity_kind(3. * s), quantity_kind, hertz, double>(2 / 3. / (1 * s)))); -static_assert(same(2. / quantity_kind(3 * s), +static_assert(comp(2. / quantity_kind(3 * s), quantity_kind, hertz, double>(2 / 3. / (1 * s)))); -static_assert(same(quantity(2) / quantity_kind(3 * s), +static_assert(comp(quantity(2) / quantity_kind(3 * s), quantity_kind, hertz, int>(2 / 3 / (1 * s)))); -static_assert(same(quantity(2) / quantity_kind(3. * s), +static_assert(comp(quantity(2) / quantity_kind(3. * s), quantity_kind, hertz, double>(2 / 3. / (1 * s)))); -static_assert(same(quantity(2.) / quantity_kind(3 * s), +static_assert(comp(quantity(2.) / quantity_kind(3 * s), quantity_kind, hertz, double>(2 / 3. / (1 * s)))); -static_assert(same(quantity_kind, one, int>(2) / +static_assert(comp(quantity_kind, one, int>(2) / quantity_kind(3 * s), quantity_kind, hertz, int>(2 / 3 / (1 * s)))); -static_assert(same(quantity_kind, one, int>(2) / +static_assert(comp(quantity_kind, one, int>(2) / quantity_kind(3. * s), quantity_kind, hertz, double>(2 / 3. / (1 * s)))); -static_assert(same(quantity_kind, one, double>(2.) / +static_assert(comp(quantity_kind, one, double>(2.) / quantity_kind(3 * s), quantity_kind, hertz, double>(2 / 3. / (1 * s)))); -static_assert(same(height(2 * m) / (3 * s), rate_of_climb(0 * (m / s)))); -static_assert(same(height(2 * m) / (3. * s), rate_of_climb(2 / 3. * (m / s)))); -static_assert(same(height(2. * m) / (3 * s), rate_of_climb(2. / 3 * (m / s)))); +static_assert(comp(height(2 * m) / (3 * s), rate_of_climb(0 * (m / s)))); +static_assert(comp(height(2 * m) / (3. * s), rate_of_climb(2 / 3. * (m / s)))); +static_assert(comp(height(2. * m) / (3 * s), rate_of_climb(2. / 3 * (m / s)))); -static_assert(same(width(2 * m) * dimensionless(3), width(6 * cm))); -static_assert(same(dimensionless(2) * width(3 * m), width(6 * cm))); -static_assert(same(width(2 * m) / dimensionless(3), +static_assert(comp(width(2 * m) * dimensionless(3), width(6 * cm))); +static_assert(comp(dimensionless(2) * width(3 * m), width(6 * cm))); +static_assert(comp(width(2 * m) / dimensionless(3), width(2. / 3 * hm))); static_assert(same(width(2 * m) % dimensionless(3), width(2 * m))); -static_assert(same(height(2 * m) / (3 * m), +static_assert(comp(height(2 * m) / (3 * m), quantity_kind, one, int>(0))); -static_assert(same(height(2 * m) / (3. * m), +static_assert(comp(height(2 * m) / (3. * m), quantity_kind, one, double>(2 / 3.))); -static_assert(same(height(2. * m) / (3 * m), +static_assert(comp(height(2. * m) / (3 * m), quantity_kind, one, double>(2. / 3))); -static_assert(same((2 * m) / height(3 * m), +static_assert(comp((2 * m) / height(3 * m), quantity_kind, one, int>(0))); -static_assert(same((2 * m) / height(3. * m), +static_assert(comp((2 * m) / height(3. * m), quantity_kind, one, double>(2 / 3.))); -static_assert(same((2. * m) / height(3 * m), +static_assert(comp((2. * m) / height(3 * m), quantity_kind, one, double>(2. / 3))); -static_assert(same(width(8 * m) / width(2 * m), +static_assert(comp(width(8 * m) / width(2 * m), quantity_kind, one, int>(4))); -static_assert(same(width(8 * m) / width(2 * m), +static_assert(comp(width(8 * m) / width(2 * m), quantity_kind, one, double>(4.0))); -static_assert(same(width(8 * m) / width(2 * m), +static_assert(comp(width(8 * m) / width(2 * m), quantity_kind, one, double>(4.0))); -static_assert(same(apples(8) / apples(2), apples(4))); -static_assert(same(apples(8) / (2 / apples(1)), apples(4))); +static_assert(comp(apples(8) / apples(2), apples(4))); +static_assert(comp(apples(8) / (2 / apples(1)), apples(4))); -static_assert(same(horizontal_area(8 * (m * m)) / width(2 * m), width(4 * m))); -static_assert(same(horizontal_area(4 * (m * m)) / (1 * m), width(4 * m))); +static_assert(comp(horizontal_area(8 * (m * m)) / width(2 * m), width(4 * m))); +static_assert(comp(horizontal_area(4 * (m * m)) / (1 * m), width(4 * m))); static_assert(same(width(2 * m) % 3, width(2 * m))); static_assert(same(width(3 * m) % width(2 * m), width(1 * m))); @@ -800,7 +800,7 @@ static_assert(same(quantity_kind_cast(width(1 * static_assert(same(quantity_kind_cast(width(1 * cm)), cgs_width(1 * cgs_cm))); static_assert(same(quantity_kind_cast(width(1 * m)), cgs_width(1 * m))); static_assert(same(quantity_kind_cast(width(1 * m)), cgs_width(1 * m))); -static_assert(same(quantity_kind_cast(width(1 * cm)), width(1 * cgs_cm))); +static_assert(comp(quantity_kind_cast(width(1 * cm)), width(1 * cgs_cm))); static_assert(same(quantity_kind_cast>(width(1 * m)), width(0 * km))); static_assert(same(quantity_kind_cast>(width(1 * m)), width(100 * cm))); static_assert(same(quantity_kind_cast>(width(0.01 * m)), width(1 * cm))); diff --git a/test/unit_test/static/quantity_point_kind_test.cpp b/test/unit_test/static/quantity_point_kind_test.cpp index ab6e3cb6..f8febd8e 100644 --- a/test/unit_test/static/quantity_point_kind_test.cpp +++ b/test/unit_test/static/quantity_point_kind_test.cpp @@ -250,7 +250,7 @@ static_assert(abscissa{}.relative().common() == 0 * m); // CTAD ///////// -static_assert(same(quantity_point_kind(width(0 * m)), abscissa{})); +static_assert(comp(quantity_point_kind(width(0 * m)), abscissa{})); static_assert(same(quantity_point_kind(abscissa(0 * m)), abscissa{})); @@ -500,16 +500,16 @@ static_assert(invalid_compound_assignments_(2 * m) + width(3 * m), abscissa(5 * m))); -static_assert(same(abscissa(2 * m) + width(3. * m), abscissa(5. * m))); -static_assert(same(abscissa(2. * m) + width(3 * m), abscissa(5. * m))); -static_assert(same(abscissa(2 * km) + width(3e3 * m), abscissa(5e3 * m))); -static_assert(same(abscissa(2e3 * m) + width(3 * km), abscissa(5e3 * m))); -static_assert(same(width(2 * m) + abscissa(3 * m), abscissa(5 * m))); -static_assert(same(width(2 * m) + abscissa(3. * m), abscissa(5. * m))); -static_assert(same(width(2. * m) + abscissa(3 * m), abscissa(5. * m))); -static_assert(same(width(2 * km) + abscissa(3e3 * m), abscissa(5e3 * m))); -static_assert(same(width(2e3 * m) + abscissa(3 * km), abscissa(5e3 * m))); +static_assert(comp(abscissa(2 * m) + width(3 * m), abscissa(5 * m))); +static_assert(comp(abscissa(2 * m) + width(3. * m), abscissa(5. * m))); +static_assert(comp(abscissa(2. * m) + width(3 * m), abscissa(5. * m))); +static_assert(comp(abscissa(2 * km) + width(3e3 * m), abscissa(5e3 * m))); +static_assert(comp(abscissa(2e3 * m) + width(3 * km), abscissa(5e3 * m))); +static_assert(comp(width(2 * m) + abscissa(3 * m), abscissa(5 * m))); +static_assert(comp(width(2 * m) + abscissa(3. * m), abscissa(5. * m))); +static_assert(comp(width(2. * m) + abscissa(3 * m), abscissa(5. * m))); +static_assert(comp(width(2 * km) + abscissa(3e3 * m), abscissa(5e3 * m))); +static_assert(comp(width(2e3 * m) + abscissa(3 * km), abscissa(5e3 * m))); static_assert(!std::is_invocable_v, abscissa, double>); static_assert(!std::is_invocable_v, abscissa, length>); static_assert(!std::is_invocable_v, abscissa, quantity_point, metre>>); @@ -522,16 +522,16 @@ static_assert(!std::is_invocable_v, quantity_point, length, abscissa>); static_assert(!std::is_invocable_v, double, abscissa>); -static_assert(same(abscissa(2 * m) - width(3 * m), abscissa(-1 * m))); -static_assert(same(abscissa(2 * m) - width(3. * m), abscissa(-1. * m))); -static_assert(same(abscissa(2. * m) - width(3 * m), abscissa(-1. * m))); -static_assert(same(abscissa(2 * km) - width(3e3 * m), abscissa(-1e3 * m))); -static_assert(same(abscissa(2e3 * m) - width(3 * km), abscissa(-1e3 * m))); +static_assert(comp(abscissa(2 * m) - width(3 * m), abscissa(-1 * m))); +static_assert(comp(abscissa(2 * m) - width(3. * m), abscissa(-1. * m))); +static_assert(comp(abscissa(2. * m) - width(3 * m), abscissa(-1. * m))); +static_assert(comp(abscissa(2 * km) - width(3e3 * m), abscissa(-1e3 * m))); +static_assert(comp(abscissa(2e3 * m) - width(3 * km), abscissa(-1e3 * m))); static_assert(same(abscissa(2 * m) - abscissa(3 * m), width(-1 * m))); static_assert(same(abscissa(2 * m) - abscissa(3. * m), width(-1. * m))); static_assert(same(abscissa(2. * m) - abscissa(3 * m), width(-1. * m))); -static_assert(same(abscissa(2 * km) - abscissa(3e3 * m), width(-1e3 * m))); -static_assert(same(abscissa(2e3 * m) - abscissa(3 * km), width(-1e3 * m))); +static_assert(comp(abscissa(2 * km) - abscissa(3e3 * m), width(-1e3 * m))); +static_assert(comp(abscissa(2e3 * m) - abscissa(3 * km), width(-1e3 * m))); static_assert(!std::is_invocable_v, abscissa, double>); static_assert(!std::is_invocable_v, abscissa, length>); static_assert(!std::is_invocable_v, abscissa, quantity_point, metre>>); @@ -634,41 +634,41 @@ static_assert(same(quantity_point_kind_cast>(abscissa>(abscissa(999 * m)), abscissa(0 * km))); static_assert(same(quantity_point_kind_cast>(abscissa(1000 * m)), abscissa(1 * km))); static_assert(same(quantity_point_kind_cast>(abscissa(999 * m)), abscissa(0.999 * km))); -static_assert(same(quantity_point_kind_cast>(abscissa(1 * m)), abscissa(1 * m))); -static_assert(same(quantity_point_kind_cast>(abscissa(1 * m)), abscissa(1.0 * m))); -static_assert(same(quantity_point_kind_cast>(abscissa(999 * m)), abscissa(0 * km))); -static_assert(same(quantity_point_kind_cast>(abscissa(1000 * m)), abscissa(1 * km))); -static_assert(same(quantity_point_kind_cast>(abscissa(999 * m)), abscissa(0.999 * km))); -static_assert(same(quantity_point_kind_cast(abscissa(1 * m)), abscissa(1.0 * m))); -static_assert(same(quantity_point_kind_cast(abscissa(1 * m)), abscissa(1 * m))); -static_assert(same(quantity_point_kind_cast(abscissa(999 * m)), abscissa(0 * km))); -static_assert(same(quantity_point_kind_cast(abscissa(1000 * m)), abscissa(1 * km))); +static_assert(comp(quantity_point_kind_cast>(abscissa(1 * m)), abscissa(1 * m))); +static_assert(comp(quantity_point_kind_cast>(abscissa(1 * m)), abscissa(1.0 * m))); +static_assert(comp(quantity_point_kind_cast>(abscissa(999 * m)), abscissa(0 * km))); +static_assert(comp(quantity_point_kind_cast>(abscissa(1000 * m)), abscissa(1 * km))); +static_assert(comp(quantity_point_kind_cast>(abscissa(999 * m)), abscissa(0.999 * km))); +static_assert(comp(quantity_point_kind_cast(abscissa(1 * m)), abscissa(1.0 * m))); +static_assert(comp(quantity_point_kind_cast(abscissa(1 * m)), abscissa(1 * m))); +static_assert(comp(quantity_point_kind_cast(abscissa(999 * m)), abscissa(0 * km))); +static_assert(comp(quantity_point_kind_cast(abscissa(1000 * m)), abscissa(1 * km))); static_assert(same(quantity_point_kind_cast>(abscissa(1 * m)), ordinate(1 * m))); static_assert(same(quantity_point_kind_cast>(abscissa(1 * m)), ordinate(1.0 * m))); static_assert(same(quantity_point_kind_cast>(abscissa(999 * m)), ordinate(0 * km))); static_assert(same(quantity_point_kind_cast>(abscissa(1000 * m)), ordinate(1 * km))); static_assert(same(quantity_point_kind_cast>(abscissa(999 * m)), ordinate(0.999 * km))); -static_assert(same(quantity_point_kind_cast>(abscissa(1 * m)), ordinate(1 * m))); -static_assert(same(quantity_point_kind_cast>(abscissa(1 * m)), ordinate(1.0 * m))); -static_assert(same(quantity_point_kind_cast>(abscissa(999 * m)), ordinate(0 * km))); -static_assert(same(quantity_point_kind_cast>(abscissa(1000 * m)), ordinate(1 * km))); -static_assert(same(quantity_point_kind_cast>(abscissa(999 * m)), ordinate(0.999 * km))); -static_assert(same(quantity_point_kind_cast(abscissa(1 * m)), ordinate(1 * m))); +static_assert(comp(quantity_point_kind_cast>(abscissa(1 * m)), ordinate(1 * m))); +static_assert(comp(quantity_point_kind_cast>(abscissa(1 * m)), ordinate(1.0 * m))); +static_assert(comp(quantity_point_kind_cast>(abscissa(999 * m)), ordinate(0 * km))); +static_assert(comp(quantity_point_kind_cast>(abscissa(1000 * m)), ordinate(1 * km))); +static_assert(comp(quantity_point_kind_cast>(abscissa(999 * m)), ordinate(0.999 * km))); +static_assert(comp(quantity_point_kind_cast(abscissa(1 * m)), ordinate(1 * m))); static_assert(same(quantity_point_kind_cast(abscissa(1 * m)), ordinate(1 * m))); static_assert(same(quantity_point_kind_cast(abscissa(999 * m)), ordinate(0 * km))); static_assert(same(quantity_point_kind_cast(abscissa(1000 * m)), ordinate(1 * km))); static_assert(same(quantity_point_kind_cast>(abscissa(1 * cm)), quantity_point_kind(cgs_width(1 * cgs_cm)))); static_assert(same(quantity_point_kind_cast(abscissa(1 * cm)), quantity_point_kind(cgs_width(1 * cgs_cm)))); -static_assert(same(quantity_point_kind_cast(abscissa(1 * cm)), altitude(1 * cgs_cm))); +static_assert(comp(quantity_point_kind_cast(abscissa(1 * cm)), altitude(1 * cgs_cm))); static_assert(same(quantity_point_kind_cast(abscissa(1 * cm)), altitude(1 * cgs_cm))); static_assert(same(quantity_point_kind_cast(abscissa(1 * m)), quantity_point_kind(cgs_width(1 * m)))); -static_assert(same(quantity_point_kind_cast(abscissa(1 * m)), altitude(1 * m))); +static_assert(comp(quantity_point_kind_cast(abscissa(1 * m)), altitude(1 * m))); static_assert(same(quantity_point_kind_cast(abscissa(1 * m)), altitude(1 * m))); -static_assert(same(quantity_point_kind_cast(abscissa(1 * cm)), abscissa(1 * cgs_cm))); -static_assert(same(quantity_point_kind_cast>(abscissa(1 * m)), abscissa(0 * km))); -static_assert(same(quantity_point_kind_cast>(abscissa(1 * m)), abscissa(100 * cm))); -static_assert(same(quantity_point_kind_cast>(abscissa(0.01 * m)), abscissa(1 * cm))); -static_assert(same(quantity_point_kind_cast>(abscissa(1 * cgs_cm)), abscissa(1 * cgs_cm))); +static_assert(comp(quantity_point_kind_cast(abscissa(1 * cm)), abscissa(1 * cgs_cm))); +static_assert(comp(quantity_point_kind_cast>(abscissa(1 * m)), abscissa(0 * km))); +static_assert(comp(quantity_point_kind_cast>(abscissa(1 * m)), abscissa(100 * cm))); +static_assert(comp(quantity_point_kind_cast>(abscissa(0.01 * m)), abscissa(1 * cm))); +static_assert(comp(quantity_point_kind_cast>(abscissa(1 * cgs_cm)), abscissa(1 * cgs_cm))); static_assert(same(quantity_point_kind_cast>(screen_si_width(1 * m)), screen_si_cgs_width(1 * m))); // clang-format on template diff --git a/test/unit_test/static/quantity_test.cpp b/test/unit_test/static/quantity_test.cpp index 9f9b87ae..f01f4a89 100644 --- a/test/unit_test/static/quantity_test.cpp +++ b/test/unit_test/static/quantity_test.cpp @@ -427,11 +427,11 @@ static_assert(invalid_binary_operations); static_assert(is_same_v>); static_assert(is_same_v>); static_assert(is_same_v>); -static_assert(is_same_v>); +static_assert(compare>); static_assert(is_same_v>); -static_assert(is_same_v>); +static_assert(compare>); static_assert(is_same_v>); -static_assert(is_same_v>); +static_assert(compare>); static_assert(is_same_v>); static_assert(is_same_v>); static_assert(is_same_v>); @@ -458,10 +458,10 @@ static_assert(is_same_v>); static_assert(is_same_v>); static_assert(is_same_v>); // TODO should we address fundamental types implicit truncating conversions with concepts? static_assert(is_same_v>); -static_assert(is_same_v>); // TODO should we address fundamental types implicit truncating conversions with concepts? -static_assert(is_same_v>); +static_assert(compare>); // TODO should we address fundamental types implicit truncating conversions with concepts? +static_assert(compare>); static_assert(is_same_v>); -static_assert(is_same_v>); +static_assert(compare>); static_assert(compare(1)), length>); static_assert(compare(1) * 1._q_m), length>); static_assert(compare>); @@ -479,10 +479,10 @@ static_assert(is_same_v>); static_assert(is_same_v>); static_assert(is_same_v>); static_assert(is_same_v>); -static_assert(is_same_v>); -static_assert(is_same_v>); +static_assert(compare>); +static_assert(compare>); static_assert(is_same_v>); -static_assert(is_same_v>); +static_assert(compare>); static_assert(compare(1)), length>); static_assert(compare(1) * 1_q_m), length>); static_assert(compare(1)), length>); @@ -493,25 +493,25 @@ static_assert(compare(1) / 1_q_s), frequency, long double>>); // different units -static_assert(is_same_v>); -static_assert(is_same_v>); -static_assert(is_same_v>); -static_assert(is_same_v>); +static_assert(compare>); +static_assert(compare>); +static_assert(compare>); +static_assert(compare>); -static_assert(is_same_v>); -static_assert(is_same_v>); -static_assert(is_same_v>); -static_assert(is_same_v>); +static_assert(compare>); +static_assert(compare>); +static_assert(compare>); +static_assert(compare>); -static_assert(is_same_v>); -static_assert(is_same_v>); -static_assert(is_same_v>); -static_assert(is_same_v>); +static_assert(compare>); +static_assert(compare>); +static_assert(compare>); +static_assert(compare>); -static_assert(is_same_v>); -static_assert(is_same_v>); -static_assert(is_same_v>); -static_assert(is_same_v>); +static_assert(compare>); +static_assert(compare>); +static_assert(compare>); +static_assert(compare>); static_assert(is_same_v>); static_assert(is_same_v>); @@ -820,8 +820,8 @@ static_assert(is_same_v>); -static_assert(is_same_v>); +static_assert(compare>); +static_assert(compare>); #endif @@ -835,17 +835,17 @@ constexpr auto quotient_remainder_theorem(auto q1, auto q2) return q; } -static_assert(same(quotient_remainder_theorem(3'000 * m, 400 * m), 3'000 * m)); -static_assert(same(quotient_remainder_theorem(3 * km, 400 * m), 3 * km)); -static_assert(same(quotient_remainder_theorem(3 * km, 2 * m), 3 * km)); -static_assert(same(quotient_remainder_theorem(3 * km, 400'000 * mm), 3 * km)); -static_assert(same(quotient_remainder_theorem(3 * km, 2'000 * mm), 3 * km)); -static_assert(same(quotient_remainder_theorem(3 * km, 400 * mm), 3 * km)); -static_assert(same(quotient_remainder_theorem(3 * km, 2 * mm), 3 * km)); +static_assert(comp(quotient_remainder_theorem(3'000 * m, 400 * m), 3'000 * m)); +static_assert(comp(quotient_remainder_theorem(3 * km, 400 * m), 3 * km)); +static_assert(comp(quotient_remainder_theorem(3 * km, 2 * m), 3 * km)); +static_assert(comp(quotient_remainder_theorem(3 * km, 400'000 * mm), 3 * km)); +static_assert(comp(quotient_remainder_theorem(3 * km, 2'000 * mm), 3 * km)); +static_assert(comp(quotient_remainder_theorem(3 * km, 400 * mm), 3 * km)); +static_assert(comp(quotient_remainder_theorem(3 * km, 2 * mm), 3 * km)); static_assert(same(quotient_remainder_theorem(3'000 * m, 400), 3'000 * m)); -static_assert(same(quotient_remainder_theorem(3'000 * m, quantity(400)), 3'000 * m)); -static_assert(same(quotient_remainder_theorem(3 * km, quantity(400)), 3 * km)); -static_assert(same(quotient_remainder_theorem(3 * km, quantity(2)), 3 * km)); -static_assert(same(quotient_remainder_theorem(3 * km, dimensionless, int>(400)), 3 * km)); +static_assert(comp(quotient_remainder_theorem(3'000 * m, quantity(400)), 3'000 * m)); +static_assert(comp(quotient_remainder_theorem(3 * km, quantity(400)), 3 * km)); +static_assert(comp(quotient_remainder_theorem(3 * km, quantity(2)), 3 * km)); +static_assert(comp(quotient_remainder_theorem(3 * km, dimensionless, int>(400)), 3 * km)); } // namespace diff --git a/test/unit_test/static/references_test.cpp b/test/unit_test/static/references_test.cpp index 670f0975..f3072acf 100644 --- a/test/unit_test/static/references_test.cpp +++ b/test/unit_test/static/references_test.cpp @@ -20,6 +20,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. +#include "test_tools.h" #include #include #include @@ -70,8 +71,8 @@ static_assert([] { const auto duration{2}; return length * km / (duration * h); }() == 60_q_km_per_h); -static_assert(is_same_v); -static_assert(is_same_v); +static_assert(compare); +static_assert(compare); static_assert(1. / 4 * m2 == 1._q_m2 / 4); diff --git a/test/unit_test/static/test_tools.h b/test/unit_test/static/test_tools.h index 70ef41a1..4116ed7c 100644 --- a/test/unit_test/static/test_tools.h +++ b/test/unit_test/static/test_tools.h @@ -123,16 +123,9 @@ constexpr bool ctad_constructible_from(Vs...) return ctad_constructible_from_; } -#if UNITS_DOWNCAST_MODE constexpr auto same = [](T l, T r) { return l == r; }; -#else -constexpr auto same = [](T l, U r) - requires requires { l == r; } -// requires std::equality_comparable_with // TODO: Fix #205 -{ - return l == r; -}; -#endif +constexpr auto comp = // TODO: Fix #205 to use `std::equality_comparable_with U`. + [](T l, U r) requires compare { return l == r; }; template requires requires { F(); }