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