From 6a86e5c44733154781e972826ad52e4a035a8d13 Mon Sep 17 00:00:00 2001 From: Pascal Leroy <pascal.h.leroy@gmail.com> Date: Sat, 18 Dec 2021 19:15:05 +0100 Subject: [PATCH 1/2] Fix t_min to correctly handle empty segments. --- physics/discrete_trajectory_body.hpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/physics/discrete_trajectory_body.hpp b/physics/discrete_trajectory_body.hpp index 190cd7a757..bcdf3fecd3 100644 --- a/physics/discrete_trajectory_body.hpp +++ b/physics/discrete_trajectory_body.hpp @@ -429,11 +429,17 @@ void DiscreteTrajectory<Frame>::Merge(DiscreteTrajectory<Frame> trajectory) { template<typename Frame> Instant DiscreteTrajectory<Frame>::t_min() const { - return segments_->front().t_min(); + CHECK(!empty()); + for (auto sit = segments_->begin();; ++sit) { + if (!sit->empty()) { + return sit->t_min(); + } + } } template<typename Frame> Instant DiscreteTrajectory<Frame>::t_max() const { + CHECK(!empty()); return segments_->back().t_max(); } From fe5e392d3ebc62291d16b79e16279268baa25300 Mon Sep 17 00:00:00 2001 From: Pascal Leroy <pascal.h.leroy@gmail.com> Date: Mon, 20 Dec 2021 22:48:02 +0100 Subject: [PATCH 2/2] Fix t_min for a trajectory starting with empty segments. --- physics/discrete_trajectory_body.hpp | 8 ++++++-- physics/discrete_trajectory_test.cpp | 6 ++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/physics/discrete_trajectory_body.hpp b/physics/discrete_trajectory_body.hpp index bcdf3fecd3..fb387aac9d 100644 --- a/physics/discrete_trajectory_body.hpp +++ b/physics/discrete_trajectory_body.hpp @@ -429,7 +429,9 @@ void DiscreteTrajectory<Frame>::Merge(DiscreteTrajectory<Frame> trajectory) { template<typename Frame> Instant DiscreteTrajectory<Frame>::t_min() const { - CHECK(!empty()); + if (empty()) { + return InfiniteFuture; + } for (auto sit = segments_->begin();; ++sit) { if (!sit->empty()) { return sit->t_min(); @@ -439,7 +441,9 @@ Instant DiscreteTrajectory<Frame>::t_min() const { template<typename Frame> Instant DiscreteTrajectory<Frame>::t_max() const { - CHECK(!empty()); + if (empty()) { + return InfinitePast; + } return segments_->back().t_max(); } diff --git a/physics/discrete_trajectory_test.cpp b/physics/discrete_trajectory_test.cpp index 0b99ba2bb6..05c92639d6 100644 --- a/physics/discrete_trajectory_test.cpp +++ b/physics/discrete_trajectory_test.cpp @@ -32,6 +32,7 @@ using geometry::Displacement; using geometry::Frame; using geometry::Handedness; using geometry::Inertial; +using geometry::InfiniteFuture; using geometry::Instant; using geometry::Velocity; using quantities::AngularFrequency; @@ -523,16 +524,19 @@ TEST_F(DiscreteTrajectoryTest, ForgetBefore) { EXPECT_EQ(3, trajectory.segments().size()); EXPECT_EQ(t0_ + 3 * Second, trajectory.begin()->time); EXPECT_EQ(t0_ + 14 * Second, trajectory.rbegin()->time); + EXPECT_EQ(t0_ + 3 * Second, trajectory.t_min()); trajectory.ForgetBefore(t0_ + 6.1 * Second); EXPECT_EQ(3, trajectory.segments().size()); EXPECT_EQ(t0_ + 7 * Second, trajectory.begin()->time); EXPECT_EQ(t0_ + 14 * Second, trajectory.rbegin()->time); + EXPECT_EQ(t0_ + 7 * Second, trajectory.t_min()); trajectory.ForgetBefore(t0_ + 9 * Second); EXPECT_EQ(3, trajectory.segments().size()); EXPECT_EQ(t0_ + 9 * Second, trajectory.begin()->time); EXPECT_EQ(t0_ + 14 * Second, trajectory.rbegin()->time); + EXPECT_EQ(t0_ + 9 * Second, trajectory.t_min()); // The trajectory now has empty segments, so let's check that we can properly // iterate over those. @@ -565,9 +569,11 @@ TEST_F(DiscreteTrajectoryTest, ForgetBefore) { trajectory.ForgetBefore(t0_ + 99 * Second); EXPECT_TRUE(trajectory.empty()); + EXPECT_EQ(InfiniteFuture, trajectory.t_min()); trajectory.ForgetBefore(trajectory.end()); EXPECT_TRUE(trajectory.empty()); + EXPECT_EQ(InfiniteFuture, trajectory.t_min()); } TEST_F(DiscreteTrajectoryTest, Merge) {