Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: mockingbirdnest/Principia
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 3b0ba6cd95aa
Choose a base ref
...
head repository: mockingbirdnest/Principia
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 551ea145f798
Choose a head ref
  • 5 commits
  • 5 files changed
  • 1 contributor

Commits on Oct 27, 2021

  1. Copy the full SHA
    096d200 View commit details
  2. Iterating on empty segments.

    pleroy committed Oct 27, 2021
    Copy the full SHA
    ad30323 View commit details
  3. Copy the full SHA
    553e833 View commit details
  4. After egg's review.

    pleroy committed Oct 27, 2021
    Copy the full SHA
    bf1b999 View commit details
  5. Merge pull request #3172 from pleroy/EmptySegments

    Support for empty segments
    pleroy authored Oct 27, 2021
    Copy the full SHA
    551ea14 View commit details
5 changes: 5 additions & 0 deletions physics/discrete_traject0ry.hpp
Original file line number Diff line number Diff line change
@@ -88,8 +88,13 @@ class DiscreteTraject0ry : public Trajectory<Frame> {
SegmentIterator AttachSegments(DiscreteTraject0ry&& trajectory);
void DeleteSegments(SegmentIterator begin);

// Deletes the trajectory points with a time in [t, end[. Drops the segments
// that are empty as a result.
void ForgetAfter(Instant const& t);
void ForgetAfter(iterator it);

// Deletes the trajectory points with a time in [begin, t[. Preserves empty
// segments and doesn't invalidate any segment iterator.
void ForgetBefore(Instant const& t);
void ForgetBefore(iterator it);

4 changes: 3 additions & 1 deletion physics/discrete_traject0ry_body.hpp
Original file line number Diff line number Diff line change
@@ -242,7 +242,9 @@ template<typename Frame>
void DiscreteTraject0ry<Frame>::ForgetBefore(Instant const& t) {
auto const sit = FindSegment(t);
sit->ForgetBefore(t);
segments_->erase(segments_->begin(), sit);
for (auto s = segments_->begin(); s != sit; ++s) {
s->ForgetBefore(t);
}
}

template<typename Frame>
33 changes: 31 additions & 2 deletions physics/discrete_traject0ry_test.cpp
Original file line number Diff line number Diff line change
@@ -481,14 +481,43 @@ TEST_F(DiscreteTraject0ryTest, ForgetBefore) {
EXPECT_EQ(t0_ + 14 * Second, trajectory.rbegin()->time);

trajectory.ForgetBefore(t0_ + 6.1 * Second);
EXPECT_EQ(2, trajectory.segments().size());
EXPECT_EQ(3, trajectory.segments().size());
EXPECT_EQ(t0_ + 7 * Second, trajectory.begin()->time);
EXPECT_EQ(t0_ + 14 * Second, trajectory.rbegin()->time);

trajectory.ForgetBefore(t0_ + 9 * Second);
EXPECT_EQ(1, trajectory.segments().size());
EXPECT_EQ(3, trajectory.segments().size());
EXPECT_EQ(t0_ + 9 * Second, trajectory.begin()->time);
EXPECT_EQ(t0_ + 14 * Second, trajectory.rbegin()->time);

// The trajectory now has empty segments, so let's check that we can properly
// iterate over those.
{
std::vector<Instant> times;
for (auto const& [t, _] : trajectory) {
times.push_back(t);
}
EXPECT_THAT(times,
ElementsAre(t0_ + 9 * Second,
t0_ + 10 * Second,
t0_ + 11 * Second,
t0_ + 12 * Second,
t0_ + 13 * Second,
t0_ + 14 * Second));
}
{
std::vector<Instant> times;
for (auto it = trajectory.rbegin(); it != trajectory.rend(); ++it) {
times.push_back(it->time);
}
EXPECT_THAT(times,
ElementsAre(t0_ + 14 * Second,
t0_ + 13 * Second,
t0_ + 12 * Second,
t0_ + 11 * Second,
t0_ + 10 * Second,
t0_ + 9 * Second));
}
}

TEST_F(DiscreteTraject0ryTest, TMinTMaxEvaluate) {
16 changes: 13 additions & 3 deletions physics/discrete_trajectory_iterator_body.hpp
Original file line number Diff line number Diff line change
@@ -18,8 +18,11 @@ DiscreteTrajectoryIterator<Frame>::operator++() {
Instant const previous_time = point->time;
do {
if (point == --segment_->timeline_end()) {
++segment_;
if (segment_.is_end() || segment_->timeline_empty()) {
do {
++segment_;
} while (!segment_.is_end() && segment_->timeline_empty());

if (segment_.is_end()) {
point_.reset();
break;
} else {
@@ -111,8 +114,15 @@ DiscreteTrajectoryIterator<Frame>::DiscreteTrajectoryIterator(
OptionalTimelineConstIterator const point)
: segment_(segment),
point_(point) {
if (segment_.is_end() || segment_->timeline_empty()) {
bool incremented_segment = false;
while (!segment_.is_end() && segment_->timeline_empty()) {
++segment_;
incremented_segment = true;
}
if (segment_.is_end()) {
point_.reset();
} else if (incremented_segment) {
point_ = segment_->timeline_begin();
}
}

3 changes: 1 addition & 2 deletions physics/discrete_trajectory_segment_body.hpp
Original file line number Diff line number Diff line change
@@ -58,9 +58,8 @@ DiscreteTrajectorySegment<Frame>::begin() const {
template<typename Frame>
typename DiscreteTrajectorySegment<Frame>::iterator
DiscreteTrajectorySegment<Frame>::end() const {
// TODO(phl): We probably don't want empty segments.
if (timeline_.empty()) {
return iterator(self_, timeline_.begin());
return iterator(self_, timeline_.end());
} else {
// The decrement/increment ensures that we normalize the end iterator to the
// next segment or to the end of the trajectory.