Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use concepts on BarycentreCalculator and drop the specializations #3919

Merged
merged 12 commits into from
Mar 28, 2024

Conversation

eggrobin
Copy link
Member

Keep an optimization for the subtraction of 0 conditioned on concepts.

Compilation error:

Before

BarycentreCalculator<Mass, Position<World>> b1;

1>barycentre_calculator_test.cpp
1>C:\Users\robin\Projects\mockingbirdnest\Principia\quantities\named_quantities.hpp(18,44): error C2679: binary '*': no operator found which takes a right-hand operand of type 'Scalar' (or there is no acceptable conversion)
1>C:\Users\robin\Projects\mockingbirdnest\Principia\quantities\named_quantities.hpp(18,44): error C2679:         with
1>C:\Users\robin\Projects\mockingbirdnest\Principia\quantities\named_quantities.hpp(18,44): error C2679:         [
1>C:\Users\robin\Projects\mockingbirdnest\Principia\quantities\named_quantities.hpp(18,44): error C2679:             Scalar=principia::geometry::_point::internal::Point<principia::geometry::_grassmann::internal::Multivector<principia::quantities::_quantities::internal::Length,principia::geometry::_frame::internal::Frame<principia::geometry::WorldTag,principia::geometry::_frame::internal::Arbitrary,principia::geometry::_frame::internal::Handedness::Right,nullptr>,1>>
1>C:\Users\robin\Projects\mockingbirdnest\Principia\quantities\named_quantities.hpp(18,44): error C2679:         ]
1>(compiling source file 'barycentre_calculator_test.cpp')
1>C:\Users\robin\Projects\mockingbirdnest\Principia\quantities\quantities.hpp(66,22):
1>could be 

[A long list of operator*s]

1>C:\Users\robin\Projects\mockingbirdnest\Principia\quantities\named_quantities.hpp(18,44):
1>while trying to match the argument list '(principia::quantities::_quantities::internal::Mass, Scalar)'
1>        with
1>        [
1>            Scalar=principia::geometry::_point::internal::Point<principia::geometry::_grassmann::internal::Multivector<principia::quantities::_quantities::internal::Length,principia::geometry::_frame::internal::Frame<principia::geometry::WorldTag,principia::geometry::_frame::internal::Arbitrary,principia::geometry::_frame::internal::Handedness::Right,nullptr>,1>>
1>        ]
1>C:\Users\robin\Projects\mockingbirdnest\Principia\quantities\named_quantities.hpp(18,44):
1>the template instantiation context (the oldest one first) is
1>	C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator_test.cpp(48,47):
1>	see reference to class template instantiation 'principia::geometry::_barycentre_calculator::internal::BarycentreCalculator<principia::quantities::_quantities::internal::Mass,principia::geometry::_point::internal::Point<principia::geometry::_grassmann::internal::Multivector<principia::quantities::_quantities::internal::Length,principia::geometry::_frame::internal::Frame<principia::geometry::WorldTag,principia::geometry::_frame::internal::Arbitrary,principia::geometry::_frame::internal::Handedness::Right,nullptr>,1>>>' being compiled
1>	C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator.hpp(29,3):
1>	see reference to alias template instantiation 'principia::quantities::_named_quantities::internal::Product<Vector,Scalar>' being compiled
1>        with
1>        [
1>            Vector=principia::quantities::_quantities::internal::Mass,
1>            Scalar=principia::geometry::_point::internal::Point<principia::geometry::_grassmann::internal::Multivector<principia::quantities::_quantities::internal::Length,principia::geometry::_frame::internal::Frame<principia::geometry::WorldTag,principia::geometry::_frame::internal::Arbitrary,principia::geometry::_frame::internal::Handedness::Right,nullptr>,1>>
1>        ]
1>Done building project "geometry.vcxproj" -- FAILED.

BarycentreCalculator<Mass, Velocity<World>> b2;

  b2.Add(1 * Kilogram, World::unmoving);
  b2.Get();

This one fails only in Get():

1>barycentre_calculator_test.cpp
1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator_body.hpp(31,31): error C2676: binary '/': 'const principia::geometry::_grassmann::internal::Multivector<principia::quantities::_quantities::internal::Quantity<principia::quantities::_dimensions::internal::Dimensions<1,1,-1,0,0,0,0,0>>,principia::geometry::_frame::internal::Frame<principia::geometry::WorldTag,principia::geometry::_frame::internal::Arbitrary,principia::geometry::_frame::internal::Handedness::Right,nullptr>,1>' does not define this operator or a conversion to a type acceptable to the predefined operator
1>(compiling source file 'barycentre_calculator_test.cpp')
1>C:\Users\robin\Projects\mockingbirdnest\Principia\quantities\quantities.hpp(112,1):
1>could be 

[A long list of operator/s]

1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator_body.hpp(31,31):
1>the template instantiation context (the oldest one first) is
1>	C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator_test.cpp(48,47):
1>	see reference to class template instantiation 'principia::geometry::_barycentre_calculator::internal::BarycentreCalculator<principia::quantities::_quantities::internal::Mass,principia::geometry::_grassmann::internal::Multivector<principia::quantities::_named_quantities::internal::Speed,principia::geometry::_frame::internal::Frame<principia::geometry::WorldTag,principia::geometry::_frame::internal::Arbitrary,principia::geometry::_frame::internal::Handedness::Right,nullptr>,1>>' being compiled
1>	C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator_body.hpp(29,58):
1>	while compiling class template member function 'Vector principia::geometry::_barycentre_calculator::internal::BarycentreCalculator<Vector,principia::geometry::_grassmann::internal::Multivector<principia::quantities::_named_quantities::internal::Speed,principia::geometry::_frame::internal::Frame<principia::geometry::WorldTag,principia::geometry::_frame::internal::Arbitrary,principia::geometry::_frame::internal::Handedness::Right,nullptr>,1>>::Get(void) const'
1>        with
1>        [
1>            Vector=principia::quantities::_quantities::internal::Mass
1>        ]
1>		C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator_test.cpp(50,9):
1>		see the first reference to 'principia::geometry::_barycentre_calculator::internal::BarycentreCalculator<principia::quantities::_quantities::internal::Mass,principia::geometry::_grassmann::internal::Multivector<principia::quantities::_named_quantities::internal::Speed,principia::geometry::_frame::internal::Frame<principia::geometry::WorldTag,principia::geometry::_frame::internal::Arbitrary,principia::geometry::_frame::internal::Handedness::Right,nullptr>,1>>::Get' in 'principia::geometry::BarycentreCalculatorDeathTest_Error_Test::TestBody'
1>Done building project "geometry.vcxproj" -- FAILED.

After

BarycentreCalculator<Mass, Position<World>> b1;

1>barycentre_calculator_test.cpp
1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator_test.cpp(48,3): error C7602: 'principia::geometry::_barycentre_calculator::internal::BarycentreCalculator': the associated constraints are not satisfied
1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator.hpp(20,1):
1>see declaration of 'principia::geometry::_barycentre_calculator::internal::BarycentreCalculator'
1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator.hpp(18,24):
1>the concept 'principia::quantities::_concepts::internal::homogeneous_field<principia::geometry::_point::internal::Point<principia::geometry::_grassmann::internal::Multivector<principia::quantities::_quantities::internal::Length,principia::geometry::_frame::internal::Frame<principia::geometry::WorldTag,principia::geometry::_frame::internal::Arbitrary,principia::geometry::_frame::internal::Handedness::Right,nullptr>,1>>>' evaluated to false
1>	C:\Users\robin\Projects\mockingbirdnest\Principia\quantities\concepts.hpp(87,29):
1>	the concept 'principia::quantities::_concepts::internal::homogeneous_ring<principia::geometry::_point::internal::Point<principia::geometry::_grassmann::internal::Multivector<principia::quantities::_quantities::internal::Length,principia::geometry::_frame::internal::Frame<principia::geometry::WorldTag,principia::geometry::_frame::internal::Arbitrary,principia::geometry::_frame::internal::Handedness::Right,nullptr>,1>>>' evaluated to false
1>		C:\Users\robin\Projects\mockingbirdnest\Principia\quantities\concepts.hpp(47,5):
1>		the concept 'principia::quantities::_concepts::internal::additive_group<principia::geometry::_point::internal::Point<principia::geometry::_grassmann::internal::Multivector<principia::quantities::_quantities::internal::Length,principia::geometry::_frame::internal::Frame<principia::geometry::WorldTag,principia::geometry::_frame::internal::Arbitrary,principia::geometry::_frame::internal::Handedness::Right,nullptr>,1>>>' evaluated to false
1>			C:\Users\robin\Projects\mockingbirdnest\Principia\quantities\concepts.hpp(21,5):
1>			unary '+': 'principia::geometry::_point::internal::Point<principia::geometry::_grassmann::internal::Multivector<principia::quantities::_quantities::internal::Length,principia::geometry::_frame::internal::Frame<principia::geometry::WorldTag,principia::geometry::_frame::internal::Arbitrary,principia::geometry::_frame::internal::Handedness::Right,nullptr>,1>>' does not define this operator or a conversion to a type acceptable to the predefined operator
1>			C:\Users\robin\Projects\mockingbirdnest\Principia\quantities\concepts.hpp(21,5):
1>			'+': illegal for class
1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator_test.cpp(48,47): error C2641: cannot deduce template arguments for 'principia::geometry::_barycentre_calculator::internal::BarycentreCalculator'
1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator_test.cpp(48,47): error C2783: 'principia::geometry::_barycentre_calculator::internal::BarycentreCalculator<Point,Weight> principia::geometry::_barycentre_calculator::internal::BarycentreCalculator(void)': could not deduce template argument for 'Point'
1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator.hpp(22,3):
1>see declaration of 'principia::geometry::_barycentre_calculator::internal::BarycentreCalculator'
1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator_test.cpp(48,47): error C2783: 'principia::geometry::_barycentre_calculator::internal::BarycentreCalculator<Point,Weight> principia::geometry::_barycentre_calculator::internal::BarycentreCalculator(void)': could not deduce template argument for 'Weight'
1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator.hpp(22,3):
1>see declaration of 'principia::geometry::_barycentre_calculator::internal::BarycentreCalculator'
1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator_test.cpp(48,47): error C2780: 'principia::geometry::_barycentre_calculator::internal::BarycentreCalculator<Point,Weight> principia::geometry::_barycentre_calculator::internal::BarycentreCalculator(principia::geometry::_barycentre_calculator::internal::BarycentreCalculator<Point,Weight>)': expects 1 arguments - 0 provided
1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator.hpp(20,1):
1>see declaration of 'principia::geometry::_barycentre_calculator::internal::BarycentreCalculator'
1>Done building project "geometry.vcxproj" -- FAILED.

BarycentreCalculator<Mass, Velocity<World>> b2;

1>barycentre_calculator_test.cpp
1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator_test.cpp(48,3): error C7602: 'principia::geometry::_barycentre_calculator::internal::BarycentreCalculator': the associated constraints are not satisfied
1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator.hpp(20,1):
1>see declaration of 'principia::geometry::_barycentre_calculator::internal::BarycentreCalculator'
1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator.hpp(18,24):
1>the concept 'principia::quantities::_concepts::internal::homogeneous_field<principia::geometry::_grassmann::internal::Multivector<principia::quantities::_named_quantities::internal::Speed,principia::geometry::_frame::internal::Frame<principia::geometry::WorldTag,principia::geometry::_frame::internal::Arbitrary,principia::geometry::_frame::internal::Handedness::Right,nullptr>,1>>' evaluated to false
1>	C:\Users\robin\Projects\mockingbirdnest\Principia\quantities\concepts.hpp(87,29):
1>	the concept 'principia::quantities::_concepts::internal::homogeneous_ring<principia::geometry::_grassmann::internal::Multivector<principia::quantities::_named_quantities::internal::Speed,principia::geometry::_frame::internal::Frame<principia::geometry::WorldTag,principia::geometry::_frame::internal::Arbitrary,principia::geometry::_frame::internal::Handedness::Right,nullptr>,1>>' evaluated to false
1>		C:\Users\robin\Projects\mockingbirdnest\Principia\quantities\concepts.hpp(49,11):
1>		binary '*': 'principia::geometry::_grassmann::internal::Multivector<principia::quantities::_named_quantities::internal::Speed,principia::geometry::_frame::internal::Frame<principia::geometry::WorldTag,principia::geometry::_frame::internal::Arbitrary,principia::geometry::_frame::internal::Handedness::Right,nullptr>,1>' does not define this operator or a conversion to a type acceptable to the predefined operator
1>			C:\Users\robin\Projects\mockingbirdnest\Principia\quantities\quantities.hpp(109,1):
1>			could be 

[A long list of operator*s]

1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator_test.cpp(48,47): error C2641: cannot deduce template arguments for 'principia::geometry::_barycentre_calculator::internal::BarycentreCalculator'
1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator_test.cpp(48,47): error C2783: 'principia::geometry::_barycentre_calculator::internal::BarycentreCalculator<Point,Weight> principia::geometry::_barycentre_calculator::internal::BarycentreCalculator(void)': could not deduce template argument for 'Point'
1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator.hpp(22,3):
1>see declaration of 'principia::geometry::_barycentre_calculator::internal::BarycentreCalculator'
1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator_test.cpp(48,47): error C2783: 'principia::geometry::_barycentre_calculator::internal::BarycentreCalculator<Point,Weight> principia::geometry::_barycentre_calculator::internal::BarycentreCalculator(void)': could not deduce template argument for 'Weight'
1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator.hpp(22,3):
1>see declaration of 'principia::geometry::_barycentre_calculator::internal::BarycentreCalculator'
1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator_test.cpp(48,47): error C2780: 'principia::geometry::_barycentre_calculator::internal::BarycentreCalculator<Point,Weight> principia::geometry::_barycentre_calculator::internal::BarycentreCalculator(principia::geometry::_barycentre_calculator::internal::BarycentreCalculator<Point,Weight>)': expects 1 arguments - 0 provided
1>C:\Users\robin\Projects\mockingbirdnest\Principia\geometry\barycentre_calculator.hpp(20,1):
1>see declaration of 'principia::geometry::_barycentre_calculator::internal::BarycentreCalculator'
1>Done building project "geometry.vcxproj" -- FAILED.

@@ -52,8 +71,7 @@ T Barycentre(Container<T> const& ts, Container<Scalar> const& weights) {
BarycentreCalculator<T, Scalar> calculator;
auto ts_it = ts.begin();
auto weights_it = weights.begin();
for (;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's keep the old formatting, one line for stanza of the loop header.

@@ -108,6 +108,9 @@ using enable_if_vector_t = typename enable_if_vector<T, U>::type;
template<typename T1, typename T2>
class Pair final {
public:
Pair()
requires std::default_initializable<T1> && std::default_initializable<T2> =
default;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would this fit at the end of the previous line?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No.

@pleroy pleroy added the LGTM label Mar 28, 2024
@eggrobin eggrobin merged commit ca43086 into mockingbirdnest:master Mar 28, 2024
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants