diff --git a/base/traits.hpp b/base/traits.hpp index bcf95c0cd5..d62399bdc5 100644 --- a/base/traits.hpp +++ b/base/traits.hpp @@ -59,6 +59,11 @@ using internal::all_different_v; template typename T, typename U> inline constexpr bool is_instance_of_v = internal::is_instance_of::value; +// Note the argument inversion so that we can use instance_of in a requires +// clause. +template typename T> +concept instance_of = is_instance_of_v; + // True if and only if T and U are the same template. template typename T, template typename U> inline constexpr bool is_same_template_v = diff --git a/geometry/grassmann.hpp b/geometry/grassmann.hpp index 40b6b01096..df04768e80 100644 --- a/geometry/grassmann.hpp +++ b/geometry/grassmann.hpp @@ -29,10 +29,10 @@ using namespace principia::quantities::_quantities; // ⋀ⁿ Scalar³. Do not use this type for |rank == 0| (scalars), use the |Scalar| // type directly instead. // |Frame| represents a reference frame together with an orthonormal basis. -template +template class Multivector; -template +template class Multivector final { public: static constexpr int dimension = 3; @@ -66,11 +66,11 @@ class Multivector final { private: R3Element coordinates_; - template + template friend class Multivector; }; -template +template class Multivector final { public: static constexpr int dimension = 3; @@ -103,11 +103,11 @@ class Multivector final { private: R3Element coordinates_; - template + template friend class Multivector; }; -template +template class Multivector final { public: static constexpr int dimension = 1; @@ -137,11 +137,11 @@ class Multivector final { Scalar coordinates_; }; -template +template using Vector = Multivector; -template +template using Bivector = Multivector; -template +template using Trivector = Multivector; template diff --git a/geometry/grassmann_body.hpp b/geometry/grassmann_body.hpp index 4843c56c65..11ae64c1ce 100644 --- a/geometry/grassmann_body.hpp +++ b/geometry/grassmann_body.hpp @@ -17,149 +17,149 @@ using namespace principia::base::_not_constructible; using namespace principia::geometry::_sign; using namespace principia::quantities::_elementary_functions; -template +template Multivector::Multivector(R3Element const& coordinates) : coordinates_(coordinates) {} -template +template Multivector::Multivector(R3Element const& coordinates) : coordinates_(coordinates) {} -template +template Multivector::Multivector(Scalar const& coordinates) : coordinates_(coordinates) {} -template +template Multivector& Multivector::operator+=( Multivector const& right) { coordinates_ += right.coordinates_; return *this; } -template +template Multivector& Multivector::operator-=( Multivector const& right) { coordinates_ -= right.coordinates_; return *this; } -template +template Multivector& Multivector::operator*=( double const right) { coordinates_ *= right; return *this; } -template +template Multivector& Multivector::operator/=( double const right) { coordinates_ /= right; return *this; } -template +template Multivector& Multivector::operator+=( Multivector const& right) { coordinates_ += right.coordinates_; return *this; } -template +template Multivector& Multivector::operator-=( Multivector const& right) { coordinates_ -= right.coordinates_; return *this; } -template +template Multivector& Multivector::operator*=( double const right) { coordinates_ *= right; return *this; } -template +template Multivector& Multivector::operator/=( double const right) { coordinates_ /= right; return *this; } -template +template Multivector& Multivector::operator+=( Multivector const& right) { coordinates_ += right.coordinates_; return *this; } -template +template Multivector& Multivector::operator-=( Multivector const& right) { coordinates_ -= right.coordinates_; return *this; } -template +template Multivector& Multivector::operator*=( double const right) { coordinates_ *= right; return *this; } -template +template Multivector& Multivector::operator/=( double const right) { coordinates_ /= right; return *this; } -template +template R3Element const& Multivector::coordinates() const { return coordinates_; } -template +template R3Element const& Multivector::coordinates() const { return coordinates_; } -template +template Scalar const& Multivector::coordinates() const { return coordinates_; } -template +template Scalar Multivector::Norm() const { return coordinates_.Norm(); } -template +template Scalar Multivector::Norm() const { return coordinates_.Norm(); } -template +template Scalar Multivector::Norm() const { // When |Scalar| is double, ADL will not find |Abs|. return Abs(coordinates_); } -template +template Square Multivector::Norm²() const { return coordinates_.Norm²(); } -template +template Square Multivector::Norm²() const { return coordinates_.Norm²(); } -template +template Square Multivector::Norm²() const { return coordinates_ * coordinates_; } -template +template template Multivector Multivector::OrthogonalizationAgainst( @@ -168,7 +168,7 @@ Multivector::OrthogonalizationAgainst( coordinates_.OrthogonalizationAgainst(multivector.coordinates_)); } -template +template template Multivector Multivector::OrthogonalizationAgainst( @@ -177,28 +177,28 @@ Multivector::OrthogonalizationAgainst( coordinates_.OrthogonalizationAgainst(multivector.coordinates_)); } -template +template void Multivector::WriteToMessage( not_null const message) const { Frame::WriteToMessage(message->mutable_frame()); coordinates_.WriteToMessage(message->mutable_vector()); } -template +template void Multivector::WriteToMessage( not_null const message) const { Frame::WriteToMessage(message->mutable_frame()); coordinates_.WriteToMessage(message->mutable_bivector()); } -template +template void Multivector::WriteToMessage( not_null const message) const { Frame::WriteToMessage(message->mutable_frame()); coordinates_.WriteToMessage(message->mutable_trivector()); } -template +template Multivector Multivector::ReadFromMessage( serialization::Multivector const& message) requires serializable { @@ -207,7 +207,7 @@ Multivector Multivector::ReadFromMessage( return Multivector(R3Element::ReadFromMessage(message.vector())); } -template +template Multivector Multivector::ReadFromMessage( serialization::Multivector const& message) requires serializable { @@ -216,7 +216,7 @@ Multivector Multivector::ReadFromMessage( return Multivector(R3Element::ReadFromMessage(message.bivector())); } -template +template Multivector Multivector::ReadFromMessage( serialization::Multivector const& message) requires serializable { diff --git a/geometry/grassmann_test.cpp b/geometry/grassmann_test.cpp index a0016b8465..19453b4fe0 100644 --- a/geometry/grassmann_test.cpp +++ b/geometry/grassmann_test.cpp @@ -69,6 +69,7 @@ class GrassmannTest : public testing::Test { Inertial, Handedness::Right, serialization::Frame::TEST>; + Vector γ; R3Element const null_displacement_ = {0 * Metre, 0 * Metre, diff --git a/ksp_plugin_adapter_stub/ksp_plugin_adapter_stub.dll b/ksp_plugin_adapter_stub/ksp_plugin_adapter_stub.dll index f9798413cf..8449cc1854 100644 Binary files a/ksp_plugin_adapter_stub/ksp_plugin_adapter_stub.dll and b/ksp_plugin_adapter_stub/ksp_plugin_adapter_stub.dll differ diff --git a/ksp_plugin_adapter_stub/ksp_plugin_adapter_stub.pdb b/ksp_plugin_adapter_stub/ksp_plugin_adapter_stub.pdb index 706257f21b..707969b1cb 100644 Binary files a/ksp_plugin_adapter_stub/ksp_plugin_adapter_stub.pdb and b/ksp_plugin_adapter_stub/ksp_plugin_adapter_stub.pdb differ diff --git a/quantities/concepts.hpp b/quantities/concepts.hpp index 2b46b19bbf..d88785e2af 100644 --- a/quantities/concepts.hpp +++ b/quantities/concepts.hpp @@ -49,18 +49,21 @@ concept affine_space = requires(A x, A y) { template concept real_affine_space = affine_space; +template +concept quantity = instance_of || std::same_as; + template concept convertible_to_quantity = - std::convertible_to || - is_instance_of_v>; + std::convertible_to || quantity>; } // namespace internal using internal::additive_group; using internal::affine_space; +using internal::convertible_to_quantity; +using internal::quantity; using internal::real_affine_space; using internal::real_vector_space; -using internal::convertible_to_quantity; using internal::vector_space; } // namespace _concepts