From e25b153b53052c2c66a7ca76a8fcd192011e4f6a Mon Sep 17 00:00:00 2001 From: Robin Leroy Date: Sat, 16 Mar 2024 15:14:00 +0100 Subject: [PATCH] hilbert is a mess --- geometry/grassmann.hpp | 73 +++++++++---------- geometry/grassmann_body.hpp | 33 ++++++--- geometry/hilbert.hpp | 19 ++--- geometry/hilbert_body.hpp | 20 +++-- geometry/point.hpp | 56 +++++++------- geometry/point_body.hpp | 30 ++++---- geometry/point_test.cpp | 2 +- geometry/r3_element.hpp | 60 +++++++-------- geometry/r3_element_body.hpp | 33 ++++++--- geometry/r3x3_matrix.hpp | 21 +++--- numerics/double_precision_body.hpp | 10 +-- ...321\213\321\210\321\221\320\262_basis.hpp" | 10 +-- ...13\321\210\321\221\320\262_basis_body.hpp" | 10 +-- quantities/concepts.hpp | 26 +++++++ .../{traits_test.cpp => concepts_test.cpp} | 16 ++-- quantities/quantities.vcxproj | 4 +- quantities/quantities.vcxproj.filters | 8 +- quantities/traits.hpp | 34 --------- 18 files changed, 237 insertions(+), 228 deletions(-) create mode 100644 quantities/concepts.hpp rename quantities/{traits_test.cpp => concepts_test.cpp} (51%) delete mode 100644 quantities/traits.hpp diff --git a/geometry/grassmann.hpp b/geometry/grassmann.hpp index 702d481312..2db54de1ec 100644 --- a/geometry/grassmann.hpp +++ b/geometry/grassmann.hpp @@ -7,9 +7,9 @@ #include "base/concepts.hpp" #include "base/not_null.hpp" #include "geometry/r3_element.hpp" +#include "quantities/concepts.hpp" #include "quantities/named_quantities.hpp" #include "quantities/quantities.hpp" -#include "quantities/traits.hpp" #include "serialization/geometry.pb.h" namespace principia { @@ -20,9 +20,9 @@ namespace internal { using namespace principia::base::_concepts; using namespace principia::base::_not_null; using namespace principia::geometry::_r3_element; +using namespace principia::quantities::_concepts; using namespace principia::quantities::_named_quantities; using namespace principia::quantities::_quantities; -using namespace principia::quantities::_traits; // A multivector of rank |rank| on a three-dimensional real inner product // space bearing the dimensionality of |Scalar|, i.e., an element of @@ -258,71 +258,70 @@ Multivector operator-( Multivector const& left, Multivector const& right); -template>> -Multivector, Frame, rank> -operator*(LScalar const& left, - Multivector const& right); - -template>> -Multivector, Frame, rank> -operator*(Multivector const& left, - RScalar const& right); - -template>> -Multivector, Frame, rank> -operator/(Multivector const& left, - RScalar const& right); - - -template>> +template + requires quantity +Multivector, Frame, rank> operator*( + LScalar const& left, + Multivector const& right); + +template + requires quantity +Multivector, Frame, rank> operator*( + Multivector const& left, + RScalar const& right); + +template + requires quantity +Multivector, Frame, rank> operator/( + Multivector const& left, + RScalar const& right); + +template + requires quantity Multivector, Frame, rank> FusedMultiplyAdd( Multivector const& a, RScalar const& b, Multivector, Frame, rank> const& c); -template>> +template + requires quantity Multivector, Frame, rank> FusedMultiplySubtract( Multivector const& a, RScalar const& b, Multivector, Frame, rank> const& c); -template>> +template + requires quantity Multivector, Frame, rank> FusedNegatedMultiplyAdd( Multivector const& a, RScalar const& b, Multivector, Frame, rank> const& c); -template>> +template + requires quantity Multivector, Frame, rank> FusedNegatedMultiplySubtract( Multivector const& a, RScalar const& b, Multivector, Frame, rank> const& c); -template>> +template + requires quantity Multivector, Frame, rank> FusedMultiplyAdd( LScalar const& a, Multivector const& b, Multivector, Frame, rank> const& c); -template>> +template + requires quantity Multivector, Frame, rank> FusedMultiplySubtract( LScalar const& a, Multivector const& b, Multivector, Frame, rank> const& c); -template>> +template + requires quantity Multivector, Frame, rank> FusedNegatedMultiplyAdd( LScalar const& a, Multivector const& b, Multivector, Frame, rank> const& c); -template>> +template + requires quantity Multivector, Frame, rank> FusedNegatedMultiplySubtract( LScalar const& a, diff --git a/geometry/grassmann_body.hpp b/geometry/grassmann_body.hpp index 2ad752805a..f2e50122a8 100644 --- a/geometry/grassmann_body.hpp +++ b/geometry/grassmann_body.hpp @@ -341,7 +341,8 @@ Multivector operator-( left.coordinates() - right.coordinates()); } -template +template + requires quantity Multivector, Frame, rank> operator*(LScalar const& left, Multivector const& right) { @@ -349,7 +350,8 @@ operator*(LScalar const& left, left * right.coordinates()); } -template +template + requires quantity Multivector, Frame, rank> operator*(Multivector const& left, RScalar const& right) { @@ -357,7 +359,8 @@ operator*(Multivector const& left, left.coordinates() * right); } -template +template + requires quantity Multivector, Frame, rank> operator/(Multivector const& left, RScalar const& right) { @@ -365,7 +368,8 @@ operator/(Multivector const& left, left.coordinates() / right); } -template +template + requires quantity Multivector, Frame, rank> FusedMultiplyAdd( Multivector const& a, RScalar const& b, @@ -376,7 +380,8 @@ Multivector, Frame, rank> FusedMultiplyAdd( FusedMultiplyAdd(a.coordinates(), b, c.coordinates())); } -template +template + requires quantity Multivector, Frame, rank> FusedMultiplySubtract( Multivector const& a, RScalar const& b, @@ -387,7 +392,8 @@ Multivector, Frame, rank> FusedMultiplySubtract( FusedMultiplySubtract(a.coordinates(), b, c.coordinates())); } -template +template + requires quantity Multivector, Frame, rank> FusedNegatedMultiplyAdd( Multivector const& a, RScalar const& b, @@ -398,7 +404,8 @@ Multivector, Frame, rank> FusedNegatedMultiplyAdd( FusedNegatedMultiplyAdd(a.coordinates(), b, c.coordinates())); } -template +template + requires quantity Multivector, Frame, rank> FusedNegatedMultiplySubtract( Multivector const& a, @@ -410,7 +417,8 @@ FusedNegatedMultiplySubtract( FusedNegatedMultiplySubtract(a.coordinates(), b, c.coordinates())); } -template +template + requires quantity Multivector, Frame, rank> FusedMultiplyAdd( LScalar const& a, Multivector const& b, @@ -421,7 +429,8 @@ Multivector, Frame, rank> FusedMultiplyAdd( FusedMultiplyAdd(a, b.coordinates(), c.coordinates())); } -template +template + requires quantity Multivector, Frame, rank> FusedMultiplySubtract( LScalar const& a, Multivector const& b, @@ -432,7 +441,8 @@ Multivector, Frame, rank> FusedMultiplySubtract( FusedMultiplySubtract(a, b.coordinates(), c.coordinates())); } -template +template + requires quantity Multivector, Frame, rank> FusedNegatedMultiplyAdd( LScalar const& a, Multivector const& b, @@ -443,7 +453,8 @@ Multivector, Frame, rank> FusedNegatedMultiplyAdd( FusedNegatedMultiplyAdd(a, b.coordinates(), c.coordinates())); } -template +template + requires quantity Multivector, Frame, rank> FusedNegatedMultiplySubtract( LScalar const& a, diff --git a/geometry/hilbert.hpp b/geometry/hilbert.hpp index 2e897f9653..2e61500621 100644 --- a/geometry/hilbert.hpp +++ b/geometry/hilbert.hpp @@ -5,8 +5,8 @@ #include "base/not_constructible.hpp" #include "geometry/concepts.hpp" #include "geometry/grassmann.hpp" // 🧙 For _grassmann::internal. +#include "quantities/concepts.hpp" #include "quantities/named_quantities.hpp" -#include "quantities/traits.hpp" namespace principia { namespace geometry { @@ -15,31 +15,28 @@ namespace internal { using namespace principia::base::_not_constructible; using namespace principia::geometry::_concepts; +using namespace principia::quantities::_concepts; using namespace principia::quantities::_named_quantities; -using namespace principia::quantities::_traits; // A trait that represents a Hilbert space, i.e., a space with an inner product // and (possibly) a norm. The struct Hilbert exports a type InnerProductType // (the result of the inner product) and a function InnerProduct. In addition, // if only one parameter is given, or if the two parameters are identical, it // also exports a type NormType (the result of the norm) and a function Norm. -template +template struct Hilbert; template -struct Hilbert, is_quantity, - std::negation>>>> - : not_constructible { + requires quantity && quantity && (!std::is_same_v) +struct Hilbert : not_constructible { static constexpr int dimension = 1; using InnerProductType = Product; static InnerProductType InnerProduct(T1 const& t1, T2 const& t2); }; -template -struct Hilbert>> : not_constructible { +template requires quantity +struct Hilbert : not_constructible { static constexpr int dimension = 1; using InnerProductType = Square; @@ -55,7 +52,7 @@ struct Hilbert>> : not_constructible { }; template - requires hilbert + requires hilbert && (!std::is_same_v) struct Hilbert : not_constructible { static_assert(T1::dimension == T2::dimension); static constexpr int dimension = T1::dimension; diff --git a/geometry/hilbert_body.hpp b/geometry/hilbert_body.hpp index f7f54c803c..291431e7a0 100644 --- a/geometry/hilbert_body.hpp +++ b/geometry/hilbert_body.hpp @@ -12,29 +12,27 @@ namespace internal { using namespace principia::quantities::_elementary_functions; template -auto Hilbert, is_quantity, - std::negation>>>>:: - InnerProduct(T1 const& t1, T2 const& t2) -> InnerProductType { + requires quantity && quantity && (!std::is_same_v) +auto Hilbert::InnerProduct(T1 const& t1, T2 const& t2) + -> InnerProductType { return t1 * t2; } template -auto Hilbert>>:: - InnerProduct(T const& t1, T const& t2) -> InnerProductType { + requires quantity +auto Hilbert::InnerProduct(T const& t1, T const& t2) -> InnerProductType { return t1 * t2; } template -auto Hilbert>>::Norm²(T const& t) - -> Norm²Type { + requires quantity +auto Hilbert::Norm²(T const& t) -> Norm²Type { return t * t; } template -auto Hilbert>>::Norm( - T const& t) -> NormType { + requires quantity +auto Hilbert::Norm(T const& t) -> NormType { return Abs(t); } diff --git a/geometry/point.hpp b/geometry/point.hpp index d40929a261..91713ac254 100644 --- a/geometry/point.hpp +++ b/geometry/point.hpp @@ -8,8 +8,8 @@ #include "base/concepts.hpp" #include "base/not_null.hpp" #include "geometry/barycentre_calculator.hpp" // 🧙 For friendship. +#include "quantities/concepts.hpp" #include "quantities/named_quantities.hpp" -#include "quantities/traits.hpp" #include "serialization/geometry.pb.h" namespace principia { @@ -19,8 +19,8 @@ namespace internal { using namespace principia::base::_concepts; using namespace principia::base::_not_null; +using namespace principia::quantities::_concepts; using namespace principia::quantities::_named_quantities; -using namespace principia::quantities::_traits; // Point is an affine space on the vector space Vector. Vector should // be equipped with operators +, -, +=, -=, ==, !=, as well as Vector * Weight @@ -75,24 +75,24 @@ class Point final { L const& a, R const& b, Point> const& c); template - friend constexpr typename std::enable_if_t, bool> - operator<(Point const& left, Point const& right); + requires quantity + friend constexpr bool operator<(Point const& left, Point const& right); template - friend constexpr typename std::enable_if_t, bool> - operator<=(Point const& left, Point const& right); + requires quantity + friend constexpr bool operator<=(Point const& left, Point const& right); template - friend constexpr typename std::enable_if_t, bool> - operator>=(Point const& left, Point const& right); + requires quantity + friend constexpr bool operator>=(Point const& left, Point const& right); template - friend constexpr typename std::enable_if_t, bool> - operator>(Point const& left, Point const& right); + requires quantity + friend constexpr bool operator>(Point const& left, Point const& right); template - friend constexpr typename std::enable_if_t, Point> - NextUp(Point x); + requires quantity + friend constexpr Point NextUp(Point x); template - friend constexpr typename std::enable_if_t, Point> - NextDown(Point x); + requires quantity + friend constexpr Point NextDown(Point x); template friend std::string DebugString(Point const& point); @@ -115,27 +115,29 @@ Point> FusedNegatedMultiplyAdd(L const& a, Point> const& c); template -constexpr typename std::enable_if_t, bool> -operator<(Point const& left, Point const& right); + requires quantity +constexpr bool operator<(Point const& left, Point const& right); template -constexpr typename std::enable_if_t, bool> -operator<=(Point const& left, Point const& right); + requires quantity +constexpr bool operator<=(Point const& left, + Point const& right); template -constexpr typename std::enable_if_t, bool> -operator>=(Point const& left, Point const& right); + requires quantity +constexpr bool operator>=(Point const& left, + Point const& right); template -constexpr typename std::enable_if_t, bool> -operator>(Point const& left, Point const& right); + requires quantity +constexpr bool operator>(Point const& left, Point const& right); template -constexpr typename std::enable_if_t, Point> -NextUp(Point x); + requires quantity +constexpr Point NextUp(Point x); template -constexpr typename std::enable_if_t, Point> -NextDown(Point x); + requires quantity +constexpr Point NextDown(Point x); template std::string DebugString(Point const& point); @@ -155,7 +157,7 @@ namespace internal { using namespace principia::geometry::_point; using namespace principia::quantities::_named_quantities; -using namespace principia::quantities::_traits; +using namespace principia::quantities::_concepts; template class BarycentreCalculator, Weight> final { diff --git a/geometry/point_body.hpp b/geometry/point_body.hpp index 3be2423b9d..a46c7d548e 100644 --- a/geometry/point_body.hpp +++ b/geometry/point_body.hpp @@ -145,41 +145,43 @@ Point> FusedNegatedMultiplyAdd(L const& a, R const& b, } template -constexpr typename std::enable_if_t, bool> operator<( - Point const& left, - Point const& right) { + requires quantity +constexpr bool operator<(Point const& left, + Point const& right) { return left.coordinates_ < right.coordinates_; } template -constexpr typename std::enable_if_t, bool> -operator<=(Point const& left, Point const& right) { + requires quantity +constexpr bool operator<=(Point const& left, + Point const& right) { return left.coordinates_ <= right.coordinates_; } template -constexpr typename std::enable_if_t, bool> -operator>=(Point const& left, Point const& right) { + requires quantity +constexpr bool operator>=(Point const& left, + Point const& right) { return left.coordinates_ >= right.coordinates_; } template -constexpr typename std::enable_if_t, bool> operator>( - Point const& left, - Point const& right) { + requires quantity +constexpr bool operator>(Point const& left, + Point const& right) { return left.coordinates_ > right.coordinates_; } template -constexpr typename std::enable_if_t, Point> -NextUp(Point const x) { + requires quantity +constexpr Point NextUp(Point const x) { using quantities::_elementary_functions::NextUp; return Point(NextUp(x.coordinates_)); } template -constexpr typename std::enable_if_t, Point> -NextDown(Point const x) { + requires quantity +constexpr Point NextDown(Point const x) { using quantities::_elementary_functions::NextDown; return Point(NextDown(x.coordinates_)); } diff --git a/geometry/point_test.cpp b/geometry/point_test.cpp index 8ed28e69ad..2555fd7eb5 100644 --- a/geometry/point_test.cpp +++ b/geometry/point_test.cpp @@ -90,7 +90,7 @@ TEST_F(PointTest, AssignmentOperators) { } TEST_F(PointTest, Ordering) { - // Check that is_quantity_v works for double. + // Check that the quantity concept works for double. Point zero; Point d1 = zero + 1.0; Point d2 = zero -3.0; diff --git a/geometry/r3_element.hpp b/geometry/r3_element.hpp index 257d6e0ec1..7f6d62b425 100644 --- a/geometry/r3_element.hpp +++ b/geometry/r3_element.hpp @@ -7,9 +7,9 @@ #include "base/not_null.hpp" #include "base/tags.hpp" +#include "quantities/concepts.hpp" #include "quantities/named_quantities.hpp" #include "quantities/quantities.hpp" -#include "quantities/traits.hpp" #include "serialization/geometry.pb.h" namespace principia { @@ -21,7 +21,7 @@ using namespace principia::base::_not_null; using namespace principia::base::_tags; using namespace principia::quantities::_named_quantities; using namespace principia::quantities::_quantities; -using namespace principia::quantities::_traits; +using namespace principia::quantities::_concepts; template struct SphericalCoordinates; @@ -114,68 +114,68 @@ R3Element operator-(R3Element const& left, // Dimensionful multiplication |LScalar * R3Element| is the tensor // product LScalar ⊗ Scalar³. Since LScalar ⊗ Scalar³ ≅ (LScalar ⊗ Scalar)³, // the result is an R3Element>. -template>> -R3Element> -operator*(LScalar const& left, R3Element const& right); +template + requires quantity +R3Element> operator*(LScalar const& left, + R3Element const& right); -template>> -R3Element> -operator*(R3Element const& left, RScalar const& right); +template + requires quantity +R3Element> operator*(R3Element const& left, + RScalar const& right); -template>> -R3Element> -operator/(R3Element const& left, RScalar const& right); +template + requires quantity +R3Element> operator/(R3Element const& left, + RScalar const& right); // FMA for ±vector * scalar ± vector. -template>> +template + requires quantity R3Element> FusedMultiplyAdd( R3Element const& a, RScalar const& b, R3Element> const& c); -template>> +template + requires quantity R3Element> FusedMultiplySubtract( R3Element const& a, RScalar const& b, R3Element> const& c); -template>> +template + requires quantity R3Element> FusedNegatedMultiplyAdd( R3Element const& a, RScalar const& b, R3Element> const& c); -template>> +template + requires quantity R3Element> FusedNegatedMultiplySubtract( R3Element const& a, RScalar const& b, R3Element> const& c); // FMA for ±scalar * vector ± vector. -template>> +template + requires quantity R3Element> FusedMultiplyAdd( LScalar const& a, R3Element const& b, R3Element> const& c); -template>> +template + requires quantity R3Element> FusedMultiplySubtract( LScalar const& a, R3Element const& b, R3Element> const& c); -template>> +template + requires quantity R3Element> FusedNegatedMultiplyAdd( LScalar const& a, R3Element const& b, R3Element> const& c); -template>> +template + requires quantity R3Element> FusedNegatedMultiplySubtract( LScalar const& a, R3Element const& b, diff --git a/geometry/r3_element_body.hpp b/geometry/r3_element_body.hpp index f062bec495..1b3c47a691 100644 --- a/geometry/r3_element_body.hpp +++ b/geometry/r3_element_body.hpp @@ -252,7 +252,8 @@ R3Element operator-(R3Element const& left, #endif } -template +template + requires quantity R3Element> operator*( LScalar const& left, R3Element const& right) { @@ -267,7 +268,8 @@ R3Element> operator*( #endif } -template +template + requires quantity R3Element> operator*(R3Element const& left, RScalar const& right) { #if PRINCIPIA_USE_SSE3_INTRINSICS() @@ -281,7 +283,8 @@ R3Element> operator*(R3Element const& left, #endif } -template +template + requires quantity R3Element> operator/(R3Element const& left, RScalar const& right) { #if PRINCIPIA_USE_SSE3_INTRINSICS() @@ -295,7 +298,8 @@ R3Element> operator/(R3Element const& left, #endif } -template +template + requires quantity R3Element> FusedMultiplyAdd( R3Element const& a, RScalar const& b, @@ -309,7 +313,8 @@ R3Element> FusedMultiplyAdd( } } -template +template + requires quantity R3Element> FusedMultiplySubtract( R3Element const& a, RScalar const& b, @@ -323,7 +328,8 @@ R3Element> FusedMultiplySubtract( } } -template +template + requires quantity R3Element> FusedNegatedMultiplyAdd( R3Element const& a, RScalar const& b, @@ -337,7 +343,8 @@ R3Element> FusedNegatedMultiplyAdd( } } -template +template + requires quantity R3Element> FusedNegatedMultiplySubtract( R3Element const& a, RScalar const& b, @@ -351,7 +358,8 @@ R3Element> FusedNegatedMultiplySubtract( } } -template +template + requires quantity R3Element> FusedMultiplyAdd( LScalar const& a, R3Element const& b, @@ -365,7 +373,8 @@ R3Element> FusedMultiplyAdd( } } -template +template + requires quantity R3Element> FusedMultiplySubtract( LScalar const& a, R3Element const& b, @@ -379,7 +388,8 @@ R3Element> FusedMultiplySubtract( } } -template +template + requires quantity R3Element> FusedNegatedMultiplyAdd( LScalar const& a, R3Element const& b, @@ -393,7 +403,8 @@ R3Element> FusedNegatedMultiplyAdd( } } -template +template + requires quantity R3Element> FusedNegatedMultiplySubtract( LScalar const& a, R3Element const& b, diff --git a/geometry/r3x3_matrix.hpp b/geometry/r3x3_matrix.hpp index 8bcba617d3..0956ff42cb 100644 --- a/geometry/r3x3_matrix.hpp +++ b/geometry/r3x3_matrix.hpp @@ -9,8 +9,8 @@ #include "base/not_null.hpp" #include "base/tags.hpp" #include "geometry/r3_element.hpp" +#include "quantities/concepts.hpp" #include "quantities/named_quantities.hpp" -#include "quantities/traits.hpp" #include "serialization/geometry.pb.h" namespace principia { @@ -21,8 +21,8 @@ namespace internal { using namespace principia::base::_not_null; using namespace principia::base::_tags; using namespace principia::geometry::_r3_element; +using namespace principia::quantities::_concepts; using namespace principia::quantities::_named_quantities; -using namespace principia::quantities::_traits; // An |R3x3Matrix| is an element of the associative algebra of 3-by-3 matrices // over |Scalar|. |Scalar| should be a vector space over ℝ, represented by @@ -154,18 +154,17 @@ R3Element> operator*( R3Element const& left, R3x3Matrix const& right); -template>> +template + requires quantity R3x3Matrix> operator*( LScalar const& left, R3x3Matrix const& right); -template>> -R3x3Matrix> operator*( - R3x3Matrix const& left, - RScalar const& right); -template>> +template + requires quantity +R3x3Matrix> operator*(R3x3Matrix const& left, + RScalar const& right); +template + requires quantity R3x3Matrix> operator/( R3x3Matrix const& left, RScalar const& right); diff --git a/numerics/double_precision_body.hpp b/numerics/double_precision_body.hpp index c4d017b54c..1ff5311815 100644 --- a/numerics/double_precision_body.hpp +++ b/numerics/double_precision_body.hpp @@ -15,9 +15,9 @@ #include "geometry/r3_element.hpp" #include "geometry/serialization.hpp" #include "numerics/fma.hpp" +#include "quantities/concepts.hpp" #include "quantities/elementary_functions.hpp" #include "quantities/si.hpp" -#include "quantities/traits.hpp" namespace principia { namespace numerics { @@ -32,7 +32,7 @@ using namespace principia::geometry::_serialization; using namespace principia::numerics::_fma; using namespace principia::quantities::_elementary_functions; using namespace principia::quantities::_si; -using namespace principia::quantities::_traits; +using namespace principia::quantities::_concepts; // A helper to check that the preconditions of QuickTwoSum are met. Annoyingly // complicated as it needs to peel off all of our abstractions until it reaches @@ -101,10 +101,8 @@ struct ComponentwiseComparator, R3Element> : not_constructible { }; template -struct ComponentwiseComparator, - is_quantity>>> { + requires quantity && 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 9ca68d4d78..da89ecab3d 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" @@ -13,8 +13,8 @@ #include "absl/container/btree_set.h" #include "base/not_null.hpp" #include "numerics/fixed_arrays.hpp" +#include "quantities/concepts.hpp" #include "quantities/named_quantities.hpp" -#include "quantities/traits.hpp" #include "serialization/numerics.pb.h" namespace principia { @@ -50,8 +50,8 @@ namespace internal { using namespace principia::base::_not_null; using namespace principia::numerics::_fixed_arrays; using namespace principia::numerics::_polynomial; +using namespace principia::quantities::_concepts; using namespace principia::quantities::_named_quantities; -using namespace principia::quantities::_traits; template class PolynomialInЧебышёвBasis; @@ -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 is_quantity_v; + requires quantity; // Returns the real roots of the polynomial, computed as the eigenvalues of // the Frobenius companion matrix. absl::btree_set RealRoots(double ε) const - requires is_quantity_v; + requires 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 is_quantity_v; + requires 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 ab121da09f..3f16015f7b 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 is_quantity_v { + requires quantity { return MayHaveRealRootsOrDie(error_estimate); } @@ -45,7 +45,7 @@ template absl::btree_set PolynomialInЧебышёвBasis::RealRoots( double const ε) const - requires is_quantity_v { + requires quantity { return RealRootsOrDie(ε); } @@ -207,7 +207,7 @@ PolynomialInЧебышёвBasis::upper_bound() const template FixedMatrix PolynomialInЧебышёвBasis::FrobeniusCompanionMatrix() - const requires is_quantity_v { + const requires 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 (is_quantity_v) { + if constexpr (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 (is_quantity_v) { + if constexpr (quantity) { auto const companion_matrix = FrobeniusCompanionMatrix(); auto const real_schur_decomposition = RealSchurDecomposition(companion_matrix, ε); diff --git a/quantities/concepts.hpp b/quantities/concepts.hpp new file mode 100644 index 0000000000..7991bd8b0a --- /dev/null +++ b/quantities/concepts.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include +#include + +#include "quantities/quantities.hpp" + +namespace principia { +namespace quantities { +namespace _concepts { +namespace internal { + +using namespace quantities::_quantities; + +template +concept quantity = std::integral || std::floating_point || requires(T q) { + { Quantity{q} } -> std::same_as>; +}; + +} // namespace internal + +using internal::quantity; + +} // namespace _concepts +} // namespace quantities +} // namespace principia \ No newline at end of file diff --git a/quantities/traits_test.cpp b/quantities/concepts_test.cpp similarity index 51% rename from quantities/traits_test.cpp rename to quantities/concepts_test.cpp index 614791f850..066cffede4 100644 --- a/quantities/traits_test.cpp +++ b/quantities/concepts_test.cpp @@ -1,4 +1,4 @@ -#include "quantities/traits.hpp" +#include "quantities/concepts.hpp" #include "gtest/gtest.h" #include "quantities/named_quantities.hpp" @@ -7,17 +7,17 @@ namespace principia { namespace quantities { using namespace principia::quantities::_named_quantities; -using namespace principia::quantities::_traits; +using namespace principia::quantities::_concepts; TEST(Traits, IsQuantityV) { - static_assert(is_quantity_v); - static_assert(is_quantity_v); - static_assert(is_quantity_v); - static_assert(is_quantity_v); + 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(!is_quantity_v); - static_assert(!is_quantity_v); + static_assert(!quantity); + static_assert(!quantity); } } // namespace quantities diff --git a/quantities/quantities.vcxproj b/quantities/quantities.vcxproj index f884f98a01..dc5a07f2fa 100644 --- a/quantities/quantities.vcxproj +++ b/quantities/quantities.vcxproj @@ -12,6 +12,7 @@ + @@ -29,7 +30,6 @@ - @@ -38,7 +38,7 @@ - + \ No newline at end of file diff --git a/quantities/quantities.vcxproj.filters b/quantities/quantities.vcxproj.filters index 7fb93f11b5..abf95170ef 100644 --- a/quantities/quantities.vcxproj.filters +++ b/quantities/quantities.vcxproj.filters @@ -77,15 +77,15 @@ Source Files - - Header Files - Header Files Source Files + + Header Files + @@ -100,7 +100,7 @@ Test Files - + Test Files diff --git a/quantities/traits.hpp b/quantities/traits.hpp deleted file mode 100644 index 86c53f1c7a..0000000000 --- a/quantities/traits.hpp +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include - -#include "base/not_constructible.hpp" -#include "quantities/quantities.hpp" - -namespace principia { -namespace quantities { -namespace _traits { -namespace internal { - -using namespace principia::base::_not_constructible; -using namespace principia::quantities::_quantities; - -// A type trait for testing if a type is a quantity. -template -struct is_quantity : std::is_arithmetic, not_constructible {}; -template -struct is_quantity> : std::true_type, not_constructible {}; -template -struct is_quantity : is_quantity {}; - -template -constexpr bool is_quantity_v = is_quantity::value; - -} // namespace internal - -using internal::is_quantity; -using internal::is_quantity_v; - -} // namespace _traits -} // namespace quantities -} // namespace principia