diff --git a/geometry/grassmann.hpp b/geometry/grassmann.hpp index 2db54de1ec..93c9a21942 100644 --- a/geometry/grassmann.hpp +++ b/geometry/grassmann.hpp @@ -259,43 +259,43 @@ Multivector operator-( Multivector const& right); template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> operator*( LScalar const& left, Multivector const& right); template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> operator*( Multivector const& left, RScalar const& right); template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> operator/( Multivector const& left, RScalar const& right); template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> FusedMultiplyAdd( Multivector const& a, RScalar const& b, Multivector, Frame, rank> const& c); template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> FusedMultiplySubtract( Multivector const& a, RScalar const& b, Multivector, Frame, rank> const& c); template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> FusedNegatedMultiplyAdd( Multivector const& a, RScalar const& b, Multivector, Frame, rank> const& c); template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> FusedNegatedMultiplySubtract( Multivector const& a, @@ -303,25 +303,25 @@ FusedNegatedMultiplySubtract( Multivector, Frame, rank> const& c); template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> FusedMultiplyAdd( LScalar const& a, Multivector const& b, Multivector, Frame, rank> const& c); template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> FusedMultiplySubtract( LScalar const& a, Multivector const& b, Multivector, Frame, rank> const& c); template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> FusedNegatedMultiplyAdd( LScalar const& a, Multivector const& b, Multivector, Frame, rank> const& c); template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> FusedNegatedMultiplySubtract( LScalar const& a, diff --git a/geometry/grassmann_body.hpp b/geometry/grassmann_body.hpp index f2e50122a8..ce1b287cae 100644 --- a/geometry/grassmann_body.hpp +++ b/geometry/grassmann_body.hpp @@ -342,7 +342,7 @@ Multivector operator-( } template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> operator*(LScalar const& left, Multivector const& right) { @@ -351,7 +351,7 @@ operator*(LScalar const& left, } template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> operator*(Multivector const& left, RScalar const& right) { @@ -360,7 +360,7 @@ operator*(Multivector const& left, } template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> operator/(Multivector const& left, RScalar const& right) { @@ -369,7 +369,7 @@ operator/(Multivector const& left, } template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> FusedMultiplyAdd( Multivector const& a, RScalar const& b, @@ -381,7 +381,7 @@ Multivector, Frame, rank> FusedMultiplyAdd( } template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> FusedMultiplySubtract( Multivector const& a, RScalar const& b, @@ -393,7 +393,7 @@ Multivector, Frame, rank> FusedMultiplySubtract( } template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> FusedNegatedMultiplyAdd( Multivector const& a, RScalar const& b, @@ -405,7 +405,7 @@ Multivector, Frame, rank> FusedNegatedMultiplyAdd( } template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> FusedNegatedMultiplySubtract( Multivector const& a, @@ -418,7 +418,7 @@ FusedNegatedMultiplySubtract( } template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> FusedMultiplyAdd( LScalar const& a, Multivector const& b, @@ -430,7 +430,7 @@ Multivector, Frame, rank> FusedMultiplyAdd( } template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> FusedMultiplySubtract( LScalar const& a, Multivector const& b, @@ -442,7 +442,7 @@ Multivector, Frame, rank> FusedMultiplySubtract( } template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> FusedNegatedMultiplyAdd( LScalar const& a, Multivector const& b, @@ -454,7 +454,7 @@ Multivector, Frame, rank> FusedNegatedMultiplyAdd( } template - requires quantity + requires convertible_to_quantity Multivector, Frame, rank> FusedNegatedMultiplySubtract( LScalar const& a, diff --git a/geometry/hilbert.hpp b/geometry/hilbert.hpp index db0709a3d0..8d1ffb7c69 100644 --- a/geometry/hilbert.hpp +++ b/geometry/hilbert.hpp @@ -27,7 +27,7 @@ template struct Hilbert; template - requires quantity && quantity + requires convertible_to_quantity && convertible_to_quantity struct Hilbert : not_constructible { static constexpr int dimension = 1; @@ -36,7 +36,7 @@ struct Hilbert : not_constructible { }; template - requires quantity + requires convertible_to_quantity struct Hilbert : not_constructible { static constexpr int dimension = 1; diff --git a/geometry/hilbert_body.hpp b/geometry/hilbert_body.hpp index 8f7ab58944..9252eb0612 100644 --- a/geometry/hilbert_body.hpp +++ b/geometry/hilbert_body.hpp @@ -12,26 +12,26 @@ namespace internal { using namespace principia::quantities::_elementary_functions; template - requires quantity && quantity + requires convertible_to_quantity && convertible_to_quantity auto Hilbert::InnerProduct(T1 const& t1, T2 const& t2) -> InnerProductType { return t1 * t2; } template - requires quantity + requires convertible_to_quantity auto Hilbert::InnerProduct(T const& t1, T const& t2) -> InnerProductType { return t1 * t2; } template - requires quantity + requires convertible_to_quantity auto Hilbert::Norm²(T const& t) -> Norm²Type { return t * t; } template - requires quantity + requires convertible_to_quantity auto Hilbert::Norm(T const& t) -> NormType { return Abs(t); } diff --git a/geometry/point.hpp b/geometry/point.hpp index b354da81f9..c6b76dd311 100644 --- a/geometry/point.hpp +++ b/geometry/point.hpp @@ -75,23 +75,23 @@ class Point final { L const& a, R const& b, Point> const& c); template - requires quantity + requires convertible_to_quantity friend constexpr bool operator<(Point const& left, Point const& right); template - requires quantity + requires convertible_to_quantity friend constexpr bool operator<=(Point const& left, Point const& right); template - requires quantity + requires convertible_to_quantity friend constexpr bool operator>=(Point const& left, Point const& right); template - requires quantity + requires convertible_to_quantity friend constexpr bool operator>(Point const& left, Point const& right); template - requires quantity + requires convertible_to_quantity friend constexpr Point NextUp(Point x); template - requires quantity + requires convertible_to_quantity friend constexpr Point NextDown(Point x); template @@ -115,28 +115,28 @@ Point> FusedNegatedMultiplyAdd(L const& a, Point> const& c); template - requires quantity + requires convertible_to_quantity constexpr bool operator<(Point const& left, Point const& right); template - requires quantity + requires convertible_to_quantity constexpr bool operator<=(Point const& left, Point const& right); template - requires quantity + requires convertible_to_quantity constexpr bool operator>=(Point const& left, Point const& right); template - requires quantity + requires convertible_to_quantity constexpr bool operator>(Point const& left, Point const& right); template - requires quantity + requires convertible_to_quantity constexpr Point NextUp(Point x); template - requires quantity + requires convertible_to_quantity constexpr Point NextDown(Point x); template diff --git a/geometry/point_body.hpp b/geometry/point_body.hpp index a46c7d548e..2b8e16f07b 100644 --- a/geometry/point_body.hpp +++ b/geometry/point_body.hpp @@ -145,42 +145,42 @@ Point> FusedNegatedMultiplyAdd(L const& a, R const& b, } template - requires quantity + requires convertible_to_quantity constexpr bool operator<(Point const& left, Point const& right) { return left.coordinates_ < right.coordinates_; } template - requires quantity + requires convertible_to_quantity constexpr bool operator<=(Point const& left, Point const& right) { return left.coordinates_ <= right.coordinates_; } template - requires quantity + requires convertible_to_quantity constexpr bool operator>=(Point const& left, Point const& right) { return left.coordinates_ >= right.coordinates_; } template - requires quantity + requires convertible_to_quantity constexpr bool operator>(Point const& left, Point const& right) { return left.coordinates_ > right.coordinates_; } template - requires quantity + requires convertible_to_quantity constexpr Point NextUp(Point const x) { using quantities::_elementary_functions::NextUp; return Point(NextUp(x.coordinates_)); } template - requires quantity + requires convertible_to_quantity constexpr Point NextDown(Point const x) { using quantities::_elementary_functions::NextDown; return Point(NextDown(x.coordinates_)); diff --git a/geometry/r3_element.hpp b/geometry/r3_element.hpp index 17606e700d..0f8c4f0779 100644 --- a/geometry/r3_element.hpp +++ b/geometry/r3_element.hpp @@ -115,41 +115,41 @@ R3Element operator-(R3Element const& left, // product LScalar ⊗ Scalar³. Since LScalar ⊗ Scalar³ ≅ (LScalar ⊗ Scalar)³, // the result is an R3Element>. template - requires quantity + requires convertible_to_quantity R3Element> operator*(LScalar const& left, R3Element const& right); template - requires quantity + requires convertible_to_quantity R3Element> operator*(R3Element const& left, RScalar const& right); template - requires quantity + requires convertible_to_quantity R3Element> operator/(R3Element const& left, RScalar const& right); // FMA for ±vector * scalar ± vector. template - requires quantity + requires convertible_to_quantity R3Element> FusedMultiplyAdd( R3Element const& a, RScalar const& b, R3Element> const& c); template - requires quantity + requires convertible_to_quantity R3Element> FusedMultiplySubtract( R3Element const& a, RScalar const& b, R3Element> const& c); template - requires quantity + requires convertible_to_quantity R3Element> FusedNegatedMultiplyAdd( R3Element const& a, RScalar const& b, R3Element> const& c); template - requires quantity + requires convertible_to_quantity R3Element> FusedNegatedMultiplySubtract( R3Element const& a, RScalar const& b, @@ -157,25 +157,25 @@ R3Element> FusedNegatedMultiplySubtract( // FMA for ±scalar * vector ± vector. template - requires quantity + requires convertible_to_quantity R3Element> FusedMultiplyAdd( LScalar const& a, R3Element const& b, R3Element> const& c); template - requires quantity + requires convertible_to_quantity R3Element> FusedMultiplySubtract( LScalar const& a, R3Element const& b, R3Element> const& c); template - requires quantity + requires convertible_to_quantity R3Element> FusedNegatedMultiplyAdd( LScalar const& a, R3Element const& b, R3Element> const& c); template - requires quantity + requires convertible_to_quantity R3Element> FusedNegatedMultiplySubtract( LScalar const& a, R3Element const& b, diff --git a/geometry/r3_element_body.hpp b/geometry/r3_element_body.hpp index 1b3c47a691..fbe12704e0 100644 --- a/geometry/r3_element_body.hpp +++ b/geometry/r3_element_body.hpp @@ -253,7 +253,7 @@ R3Element operator-(R3Element const& left, } template - requires quantity + requires convertible_to_quantity R3Element> operator*( LScalar const& left, R3Element const& right) { @@ -269,7 +269,7 @@ R3Element> operator*( } template - requires quantity + requires convertible_to_quantity R3Element> operator*(R3Element const& left, RScalar const& right) { #if PRINCIPIA_USE_SSE3_INTRINSICS() @@ -284,7 +284,7 @@ R3Element> operator*(R3Element const& left, } template - requires quantity + requires convertible_to_quantity R3Element> operator/(R3Element const& left, RScalar const& right) { #if PRINCIPIA_USE_SSE3_INTRINSICS() @@ -299,7 +299,7 @@ R3Element> operator/(R3Element const& left, } template - requires quantity + requires convertible_to_quantity R3Element> FusedMultiplyAdd( R3Element const& a, RScalar const& b, @@ -314,7 +314,7 @@ R3Element> FusedMultiplyAdd( } template - requires quantity + requires convertible_to_quantity R3Element> FusedMultiplySubtract( R3Element const& a, RScalar const& b, @@ -329,7 +329,7 @@ R3Element> FusedMultiplySubtract( } template - requires quantity + requires convertible_to_quantity R3Element> FusedNegatedMultiplyAdd( R3Element const& a, RScalar const& b, @@ -344,7 +344,7 @@ R3Element> FusedNegatedMultiplyAdd( } template - requires quantity + requires convertible_to_quantity R3Element> FusedNegatedMultiplySubtract( R3Element const& a, RScalar const& b, @@ -359,7 +359,7 @@ R3Element> FusedNegatedMultiplySubtract( } template - requires quantity + requires convertible_to_quantity R3Element> FusedMultiplyAdd( LScalar const& a, R3Element const& b, @@ -374,7 +374,7 @@ R3Element> FusedMultiplyAdd( } template - requires quantity + requires convertible_to_quantity R3Element> FusedMultiplySubtract( LScalar const& a, R3Element const& b, @@ -389,7 +389,7 @@ R3Element> FusedMultiplySubtract( } template - requires quantity + requires convertible_to_quantity R3Element> FusedNegatedMultiplyAdd( LScalar const& a, R3Element const& b, @@ -404,7 +404,7 @@ R3Element> FusedNegatedMultiplyAdd( } template - requires quantity + requires convertible_to_quantity R3Element> FusedNegatedMultiplySubtract( LScalar const& a, R3Element const& b, diff --git a/geometry/r3x3_matrix.hpp b/geometry/r3x3_matrix.hpp index 75a45d3491..89ec2ab237 100644 --- a/geometry/r3x3_matrix.hpp +++ b/geometry/r3x3_matrix.hpp @@ -107,15 +107,15 @@ class R3x3Matrix final { R3x3Matrix const& right); template - requires quantity + requires convertible_to_quantity friend R3x3Matrix> operator*(LS const& left, R3x3Matrix const& right); template - requires quantity + requires convertible_to_quantity friend R3x3Matrix> operator*(R3x3Matrix const& left, RS const& right); template - requires quantity + requires convertible_to_quantity friend R3x3Matrix> operator/(R3x3Matrix const& left, RS const& right); @@ -158,16 +158,16 @@ R3Element> operator*( R3x3Matrix const& right); template - requires quantity + requires convertible_to_quantity R3x3Matrix> operator*( LScalar const& left, R3x3Matrix const& right); template - requires quantity + requires convertible_to_quantity R3x3Matrix> operator*(R3x3Matrix const& left, RScalar const& right); template - requires quantity + requires convertible_to_quantity R3x3Matrix> operator/( R3x3Matrix const& left, RScalar const& right); diff --git a/geometry/r3x3_matrix_body.hpp b/geometry/r3x3_matrix_body.hpp index 90dafc872f..8c52dc8e13 100644 --- a/geometry/r3x3_matrix_body.hpp +++ b/geometry/r3x3_matrix_body.hpp @@ -342,7 +342,7 @@ R3Element> operator*( template - requires quantity + requires convertible_to_quantity R3x3Matrix> operator*( LScalar const& left, R3x3Matrix const& right) { @@ -355,7 +355,7 @@ R3x3Matrix> operator*( } template - requires quantity + requires convertible_to_quantity R3x3Matrix> operator*( R3x3Matrix const& left, RScalar const& right) { @@ -368,7 +368,7 @@ R3x3Matrix> operator*( } template - requires quantity + requires convertible_to_quantity R3x3Matrix> operator/( R3x3Matrix const& left, RScalar const& right) { diff --git a/numerics/double_precision_body.hpp b/numerics/double_precision_body.hpp index 271706b1a5..042083101a 100644 --- a/numerics/double_precision_body.hpp +++ b/numerics/double_precision_body.hpp @@ -101,7 +101,7 @@ struct ComponentwiseComparator, R3Element> : not_constructible { }; template - requires quantity && quantity + requires convertible_to_quantity && convertible_to_quantity struct ComponentwiseComparator { static bool GreaterThanOrEqualOrZero(T const& left, U const& right) { return Abs(left) >= Abs(right) || left == T{}; diff --git "a/numerics/polynomial_in_\321\207\320\265\320\261\321\213\321\210\321\221\320\262_basis.hpp" "b/numerics/polynomial_in_\321\207\320\265\320\261\321\213\321\210\321\221\320\262_basis.hpp" index da89ecab3d..41a1499291 100644 --- "a/numerics/polynomial_in_\321\207\320\265\320\261\321\213\321\210\321\221\320\262_basis.hpp" +++ "b/numerics/polynomial_in_\321\207\320\265\320\261\321\213\321\210\321\221\320\262_basis.hpp" @@ -76,12 +76,12 @@ class PolynomialInЧебышёвBasis // of |error_estimate| has no real roots. This is useful if the series is an // approximation of some function with an L∞ error less than |error_estimate|. bool MayHaveRealRoots(Value error_estimate = Value{}) const - requires quantity; + requires convertible_to_quantity; // Returns the real roots of the polynomial, computed as the eigenvalues of // the Frobenius companion matrix. absl::btree_set RealRoots(double ε) const - requires quantity; + requires convertible_to_quantity; // Compatibility deserialization: this class is the equivalent of the old // ЧебышёвSeries. @@ -124,7 +124,7 @@ class PolynomialInЧебышёвBasis // Returns the Frobenius companion matrix suitable for the Чебышёв basis. FixedMatrix FrobeniusCompanionMatrix() const - requires quantity; + requires convertible_to_quantity; void WriteToMessage(not_null message) const; static PolynomialInЧебышёвBasis ReadFromMessage( diff --git "a/numerics/polynomial_in_\321\207\320\265\320\261\321\213\321\210\321\221\320\262_basis_body.hpp" "b/numerics/polynomial_in_\321\207\320\265\320\261\321\213\321\210\321\221\320\262_basis_body.hpp" index 3f16015f7b..f934579631 100644 --- "a/numerics/polynomial_in_\321\207\320\265\320\261\321\213\321\210\321\221\320\262_basis_body.hpp" +++ "b/numerics/polynomial_in_\321\207\320\265\320\261\321\213\321\210\321\221\320\262_basis_body.hpp" @@ -37,7 +37,7 @@ using namespace principia::quantities::_si; template bool PolynomialInЧебышёвBasis:: MayHaveRealRoots(Value const error_estimate) const - requires quantity { + requires convertible_to_quantity { return MayHaveRealRootsOrDie(error_estimate); } @@ -45,7 +45,7 @@ template absl::btree_set PolynomialInЧебышёвBasis::RealRoots( double const ε) const - requires quantity { + requires convertible_to_quantity { return RealRootsOrDie(ε); } @@ -207,7 +207,7 @@ PolynomialInЧебышёвBasis::upper_bound() const template FixedMatrix PolynomialInЧебышёвBasis::FrobeniusCompanionMatrix() - const requires quantity { + const requires convertible_to_quantity { int const N = degree(); FixedMatrix A(uninitialized); @@ -299,7 +299,7 @@ PolynomialInЧебышёвBasis::ReadFromMessage( template bool PolynomialInЧебышёвBasis:: MayHaveRealRootsOrDie(Value const error_estimate) const { - if constexpr (quantity) { + if constexpr (convertible_to_quantity) { CHECK_LE(Value{}, error_estimate); // This code follow [Boy06], theorem 2. Note that [Boy06] has another // criterion, B₁ and concludes: “There was no detectable difference between @@ -327,7 +327,7 @@ template absl::btree_set PolynomialInЧебышёвBasis:: RealRootsOrDie(double const ε) const { - if constexpr (quantity) { + if constexpr (convertible_to_quantity) { auto const companion_matrix = FrobeniusCompanionMatrix(); auto const real_schur_decomposition = RealSchurDecomposition(companion_matrix, ε); diff --git a/quantities/concepts.hpp b/quantities/concepts.hpp index 80a3f571ac..2b46b19bbf 100644 --- a/quantities/concepts.hpp +++ b/quantities/concepts.hpp @@ -50,8 +50,9 @@ template concept real_affine_space = affine_space; template -concept quantity = std::integral || std::floating_point || - is_instance_of_v>; +concept convertible_to_quantity = + std::convertible_to || + is_instance_of_v>; } // namespace internal @@ -59,7 +60,7 @@ using internal::additive_group; using internal::affine_space; using internal::real_affine_space; using internal::real_vector_space; -using internal::quantity; +using internal::convertible_to_quantity; using internal::vector_space; } // namespace _concepts diff --git a/quantities/concepts_test.cpp b/quantities/concepts_test.cpp index e6815c4461..a5f224531e 100644 --- a/quantities/concepts_test.cpp +++ b/quantities/concepts_test.cpp @@ -12,14 +12,14 @@ using namespace principia::quantities::_named_quantities; using namespace principia::quantities::_quantities; TEST(Traits, IsQuantityV) { - static_assert(quantity); - static_assert(quantity); - static_assert(quantity); - static_assert(quantity); - // Not sure if the following is what we want, but at least let's nail it in a - // test. - static_assert(!quantity); - static_assert(!quantity); + static_assert(convertible_to_quantity); + static_assert(convertible_to_quantity); + static_assert(convertible_to_quantity); + static_assert(convertible_to_quantity); + static_assert(convertible_to_quantity); + static_assert(convertible_to_quantity); + + static_assert(!convertible_to_quantity); } } // namespace quantities