From de3e0e6cb80c3b1319b2f598e1c9fbae058d33aa Mon Sep 17 00:00:00 2001 From: pleroy <pascal.h.leroy@gmail.com> Date: Sun, 10 Oct 2021 11:59:44 +0200 Subject: [PATCH 1/2] Implementation and tests. --- physics/discrete_trajectory_segment.hpp | 4 +++ physics/discrete_trajectory_segment_body.hpp | 20 ++++++++++--- physics/discrete_trajectory_segment_test.cpp | 30 ++++++++++++++++++++ 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/physics/discrete_trajectory_segment.hpp b/physics/discrete_trajectory_segment.hpp index 9bd0c46633..9e04548d99 100644 --- a/physics/discrete_trajectory_segment.hpp +++ b/physics/discrete_trajectory_segment.hpp @@ -67,9 +67,13 @@ class DiscreteTrajectorySegment { absl::Status Append(Instant const& t, DegreesOfFreedom<Frame> const& degrees_of_freedom); + // Removes all points with a time greater than or equal to |t| (1st overload) + // or starting at |begin| (2nd overload). void ForgetAfter(Instant const& t); void ForgetAfter(typename Timeline::const_iterator begin); + // Removes all points with a time strictly less than |t| (1st overload) or + // ending at |end| (2nd overload). void ForgetBefore(Instant const& t); void ForgetBefore(typename Timeline::const_iterator end); diff --git a/physics/discrete_trajectory_segment_body.hpp b/physics/discrete_trajectory_segment_body.hpp index 849f6ad37c..32d970365d 100644 --- a/physics/discrete_trajectory_segment_body.hpp +++ b/physics/discrete_trajectory_segment_body.hpp @@ -111,18 +111,30 @@ absl::Status DiscreteTrajectorySegment<Frame>::Append( } template<typename Frame> -void DiscreteTrajectorySegment<Frame>::ForgetAfter(Instant const& t) {} +void DiscreteTrajectorySegment<Frame>::ForgetAfter(Instant const& t) { + ForgetAfter(timeline_.lower_bound(t)); + // TODO(phl): Downsampling. +} template<typename Frame> void DiscreteTrajectorySegment<Frame>::ForgetAfter( - typename Timeline::const_iterator const begin) {} + typename Timeline::const_iterator const begin) { + timeline_.erase(begin, timeline_.end()); + // TODO(phl): Downsampling. +} template<typename Frame> -void DiscreteTrajectorySegment<Frame>::ForgetBefore(Instant const& t) {} +void DiscreteTrajectorySegment<Frame>::ForgetBefore(Instant const& t) { + ForgetBefore(timeline_.lower_bound(t)); + // TODO(phl): Downsampling. +} template<typename Frame> void DiscreteTrajectorySegment<Frame>::ForgetBefore( - typename Timeline::const_iterator const end) {} + typename Timeline::const_iterator const end) { + timeline_.erase(timeline_.begin(), end); + // TODO(phl): Downsampling. +} template<typename Frame> typename DiscreteTrajectorySegment<Frame>::Timeline::const_iterator diff --git a/physics/discrete_trajectory_segment_test.cpp b/physics/discrete_trajectory_segment_test.cpp index e997f04461..500ade8532 100644 --- a/physics/discrete_trajectory_segment_test.cpp +++ b/physics/discrete_trajectory_segment_test.cpp @@ -106,5 +106,35 @@ TEST_F(DiscreteTrajectorySegmentTest, EmptySize) { EXPECT_EQ(5, segment_->size()); } +TEST_F(DiscreteTrajectorySegmentTest, ForgetAfterExisting) { + segment_.ForgetAfter(t0_ + 5 * Second); + EXPECT_EQ(t0_ + 3 * Second, segment_.rend()->first); +} + +TEST_F(DiscreteTrajectorySegmentTest, ForgetAfterNonexisting) { + segment_.ForgetAfter(t0_ + 6 * Second); + EXPECT_EQ(t0_ + 5 * Second, segment_.rend()->first); +} + +TEST_F(DiscreteTrajectorySegmentTest, ForgetAfterPastTheEnd) { + segment_.ForgetAfter(t0_ + 29 * Second); + EXPECT_EQ(t0_ + 11 * Second, segment_.rend()->first); +} + +TEST_F(DiscreteTrajectorySegmentTest, ForgetBeforeExisting) { + segment_.ForgetBefore(t0_ + 7 * Second); + EXPECT_EQ(t0_ + 7 * Second, segment_.begin()->first); +} + +TEST_F(DiscreteTrajectorySegmentTest, ForgetBeforeNonexisting) { + segment_.ForgetBefore(t0_ + 6 * Second); + EXPECT_EQ(t0_ + 7 * Second, segment_.begin()->first); +} + +TEST_F(DiscreteTrajectorySegmentTest, ForgetBeforeTheBeginning) { + segment_.ForgetBefore(t0_ + 1 * Second); + EXPECT_EQ(t0_ + 2 * Second, segment_.begin()->first); +} + } // namespace physics } // namespace principia From 25f4121e49de63ee591797b32e0a7f76fbec8334 Mon Sep 17 00:00:00 2001 From: pleroy <pascal.h.leroy@gmail.com> Date: Sun, 10 Oct 2021 12:10:41 +0200 Subject: [PATCH 2/2] Tests passing. --- physics/discrete_trajectory_segment_test.cpp | 32 ++++++++++++-------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/physics/discrete_trajectory_segment_test.cpp b/physics/discrete_trajectory_segment_test.cpp index 500ade8532..9c70435125 100644 --- a/physics/discrete_trajectory_segment_test.cpp +++ b/physics/discrete_trajectory_segment_test.cpp @@ -36,6 +36,14 @@ class DiscreteTrajectorySegmentTest : public ::testing::Test { segment_->Append(t0_ + 11 * Second, unmoving_origin_); } + void ForgetAfter(Instant const& t) { + segment_->ForgetAfter(t); + } + + void ForgetBefore(Instant const& t) { + segment_->ForgetBefore(t); + } + DiscreteTrajectorySegment<World>* segment_; internal_discrete_trajectory_types::Segments<World> segments_; Instant const t0_; @@ -107,33 +115,33 @@ TEST_F(DiscreteTrajectorySegmentTest, EmptySize) { } TEST_F(DiscreteTrajectorySegmentTest, ForgetAfterExisting) { - segment_.ForgetAfter(t0_ + 5 * Second); - EXPECT_EQ(t0_ + 3 * Second, segment_.rend()->first); + ForgetAfter(t0_ + 5 * Second); + EXPECT_EQ(t0_ + 3 * Second, segment_->rbegin()->first); } TEST_F(DiscreteTrajectorySegmentTest, ForgetAfterNonexisting) { - segment_.ForgetAfter(t0_ + 6 * Second); - EXPECT_EQ(t0_ + 5 * Second, segment_.rend()->first); + ForgetAfter(t0_ + 6 * Second); + EXPECT_EQ(t0_ + 5 * Second, segment_->rbegin()->first); } TEST_F(DiscreteTrajectorySegmentTest, ForgetAfterPastTheEnd) { - segment_.ForgetAfter(t0_ + 29 * Second); - EXPECT_EQ(t0_ + 11 * Second, segment_.rend()->first); + ForgetAfter(t0_ + 29 * Second); + EXPECT_EQ(t0_ + 11 * Second, segment_->rbegin()->first); } TEST_F(DiscreteTrajectorySegmentTest, ForgetBeforeExisting) { - segment_.ForgetBefore(t0_ + 7 * Second); - EXPECT_EQ(t0_ + 7 * Second, segment_.begin()->first); + ForgetBefore(t0_ + 7 * Second); + EXPECT_EQ(t0_ + 7 * Second, segment_->begin()->first); } TEST_F(DiscreteTrajectorySegmentTest, ForgetBeforeNonexisting) { - segment_.ForgetBefore(t0_ + 6 * Second); - EXPECT_EQ(t0_ + 7 * Second, segment_.begin()->first); + ForgetBefore(t0_ + 6 * Second); + EXPECT_EQ(t0_ + 7 * Second, segment_->begin()->first); } TEST_F(DiscreteTrajectorySegmentTest, ForgetBeforeTheBeginning) { - segment_.ForgetBefore(t0_ + 1 * Second); - EXPECT_EQ(t0_ + 2 * Second, segment_.begin()->first); + ForgetBefore(t0_ + 1 * Second); + EXPECT_EQ(t0_ + 2 * Second, segment_->begin()->first); } } // namespace physics