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 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::Append(
}
template
-void DiscreteTrajectorySegment::ForgetAfter(Instant const& t) {}
+void DiscreteTrajectorySegment::ForgetAfter(Instant const& t) {
+ ForgetAfter(timeline_.lower_bound(t));
+ // TODO(phl): Downsampling.
+}
template
void DiscreteTrajectorySegment::ForgetAfter(
- typename Timeline::const_iterator const begin) {}
+ typename Timeline::const_iterator const begin) {
+ timeline_.erase(begin, timeline_.end());
+ // TODO(phl): Downsampling.
+}
template
-void DiscreteTrajectorySegment::ForgetBefore(Instant const& t) {}
+void DiscreteTrajectorySegment::ForgetBefore(Instant const& t) {
+ ForgetBefore(timeline_.lower_bound(t));
+ // TODO(phl): Downsampling.
+}
template
void DiscreteTrajectorySegment::ForgetBefore(
- typename Timeline::const_iterator const end) {}
+ typename Timeline::const_iterator const end) {
+ timeline_.erase(timeline_.begin(), end);
+ // TODO(phl): Downsampling.
+}
template
typename DiscreteTrajectorySegment::Timeline::const_iterator
diff --git a/physics/discrete_trajectory_segment_test.cpp b/physics/discrete_trajectory_segment_test.cpp
index e997f04461..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* segment_;
internal_discrete_trajectory_types::Segments segments_;
Instant const t0_;
@@ -106,5 +114,35 @@ TEST_F(DiscreteTrajectorySegmentTest, EmptySize) {
EXPECT_EQ(5, segment_->size());
}
+TEST_F(DiscreteTrajectorySegmentTest, ForgetAfterExisting) {
+ ForgetAfter(t0_ + 5 * Second);
+ EXPECT_EQ(t0_ + 3 * Second, segment_->rbegin()->first);
+}
+
+TEST_F(DiscreteTrajectorySegmentTest, ForgetAfterNonexisting) {
+ ForgetAfter(t0_ + 6 * Second);
+ EXPECT_EQ(t0_ + 5 * Second, segment_->rbegin()->first);
+}
+
+TEST_F(DiscreteTrajectorySegmentTest, ForgetAfterPastTheEnd) {
+ ForgetAfter(t0_ + 29 * Second);
+ EXPECT_EQ(t0_ + 11 * Second, segment_->rbegin()->first);
+}
+
+TEST_F(DiscreteTrajectorySegmentTest, ForgetBeforeExisting) {
+ ForgetBefore(t0_ + 7 * Second);
+ EXPECT_EQ(t0_ + 7 * Second, segment_->begin()->first);
+}
+
+TEST_F(DiscreteTrajectorySegmentTest, ForgetBeforeNonexisting) {
+ ForgetBefore(t0_ + 6 * Second);
+ EXPECT_EQ(t0_ + 7 * Second, segment_->begin()->first);
+}
+
+TEST_F(DiscreteTrajectorySegmentTest, ForgetBeforeTheBeginning) {
+ ForgetBefore(t0_ + 1 * Second);
+ EXPECT_EQ(t0_ + 2 * Second, segment_->begin()->first);
+}
+
} // namespace physics
} // namespace principia