diff --git a/physics/discrete_trajectory.hpp b/physics/discrete_trajectory.hpp index 3b20f611e1..9db660393e 100644 --- a/physics/discrete_trajectory.hpp +++ b/physics/discrete_trajectory.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include "absl/container/btree_map.h" @@ -15,7 +16,6 @@ #include "physics/degrees_of_freedom.hpp" #include "physics/discrete_trajectory_iterator.hpp" #include "physics/discrete_trajectory_segment_iterator.hpp" -#include "physics/discrete_trajectory_segment_range.hpp" #include "physics/discrete_trajectory_types.hpp" #include "physics/trajectory.hpp" #include "serialization/physics.pb.h" @@ -33,7 +33,6 @@ using namespace principia::geometry::_space; using namespace principia::physics::_degrees_of_freedom; using namespace principia::physics::_discrete_trajectory_iterator; using namespace principia::physics::_discrete_trajectory_segment_iterator; -using namespace principia::physics::_discrete_trajectory_segment_range; using namespace principia::physics::_discrete_trajectory_types; using namespace principia::physics::_trajectory; @@ -48,9 +47,9 @@ class DiscreteTrajectory : public Trajectory { using reverse_iterator = std::reverse_iterator; using SegmentIterator = DiscreteTrajectorySegmentIterator; using ReverseSegmentIterator = std::reverse_iterator; - using SegmentRange = DiscreteTrajectorySegmentRange; - using ReverseSegmentRange = - DiscreteTrajectorySegmentRange; + using SegmentRange = std::ranges::subrange; DiscreteTrajectory(); @@ -81,8 +80,7 @@ class DiscreteTrajectory : public Trajectory { iterator upper_bound(Instant const& t) const; SegmentRange segments() const; - // TODO(phl): In C++20 this should be a reverse_view on segments. - ReverseSegmentRange rsegments() const; + std::ranges::reverse_view rsegments() const; SegmentIterator NewSegment(); diff --git a/physics/discrete_trajectory_body.hpp b/physics/discrete_trajectory_body.hpp index e06c5c146d..e97be13fd5 100644 --- a/physics/discrete_trajectory_body.hpp +++ b/physics/discrete_trajectory_body.hpp @@ -142,19 +142,15 @@ DiscreteTrajectory::upper_bound(Instant const& t) const { template typename DiscreteTrajectory::SegmentRange DiscreteTrajectory::segments() const { - return SegmentRange(SegmentIterator( - segments_.get(), segments_->begin()), - SegmentIterator( - segments_.get(), segments_->end())); + return SegmentRange(SegmentIterator(segments_.get(), segments_->begin()), + SegmentIterator(segments_.get(), segments_->end()), + segments_->size()); } template -typename DiscreteTrajectory::ReverseSegmentRange +std::ranges::reverse_view::SegmentRange> DiscreteTrajectory::rsegments() const { - return ReverseSegmentRange(std::reverse_iterator(SegmentIterator( - segments_.get(), segments_->end())), - std::reverse_iterator(SegmentIterator( - segments_.get(), segments_->begin()))); + return std::ranges::reverse_view(segments()); } template diff --git a/physics/discrete_trajectory_iterator_body.hpp b/physics/discrete_trajectory_iterator_body.hpp index 22d5366582..8b34bdf4d2 100644 --- a/physics/discrete_trajectory_iterator_body.hpp +++ b/physics/discrete_trajectory_iterator_body.hpp @@ -41,7 +41,7 @@ DiscreteTrajectoryIterator::operator--() { bool const point_is_at_end = is_at_end(point_); if (point_is_at_end) { // Move the iterator to the end of the last segment. - segment_ = std::prev(segment_.segments().end()); + segment_ = std::prev(segment_.EndSegment()); point_ = segment_->timeline_end(); // Now proceed with the decrement. } diff --git a/physics/discrete_trajectory_iterator_test.cpp b/physics/discrete_trajectory_iterator_test.cpp index 195feeebb9..de57e2379f 100644 --- a/physics/discrete_trajectory_iterator_test.cpp +++ b/physics/discrete_trajectory_iterator_test.cpp @@ -1,5 +1,6 @@ #include "physics/discrete_trajectory_iterator.hpp" +#include #include #include "base/not_null.hpp" @@ -33,6 +34,8 @@ class DiscreteTrajectoryIteratorTest : public ::testing::Test { protected: using World = Frame; using Segments = _discrete_trajectory_types::Segments; + static_assert( + std::bidirectional_iterator>); DiscreteTrajectoryIteratorTest() : segments_(MakeSegments(3)) { diff --git a/physics/discrete_trajectory_segment_iterator.hpp b/physics/discrete_trajectory_segment_iterator.hpp index 414fb7a9ab..fdd21eba71 100644 --- a/physics/discrete_trajectory_segment_iterator.hpp +++ b/physics/discrete_trajectory_segment_iterator.hpp @@ -5,7 +5,6 @@ #include "absl/container/btree_map.h" #include "base/macros.hpp" // 🧙 For forward declarations. #include "base/not_null.hpp" -#include "physics/discrete_trajectory_segment_range.hpp" #include "physics/discrete_trajectory_types.hpp" namespace principia { @@ -39,7 +38,6 @@ namespace _discrete_trajectory_segment_iterator { namespace internal { using namespace principia::base::_not_null; -using namespace principia::physics::_discrete_trajectory_segment_range; using namespace principia::physics::_discrete_trajectory_types; template @@ -72,8 +70,7 @@ class DiscreteTrajectorySegmentIterator { bool is_begin() const; bool is_end() const; - DiscreteTrajectorySegmentRange - segments() const; + DiscreteTrajectorySegmentIterator EndSegment() const; typename Segments::iterator iterator() const; diff --git a/physics/discrete_trajectory_segment_iterator_body.hpp b/physics/discrete_trajectory_segment_iterator_body.hpp index d6958d1270..a1c744c24b 100644 --- a/physics/discrete_trajectory_segment_iterator_body.hpp +++ b/physics/discrete_trajectory_segment_iterator_body.hpp @@ -87,11 +87,10 @@ bool DiscreteTrajectorySegmentIterator::is_end() const { } template -DiscreteTrajectorySegmentRange> -DiscreteTrajectorySegmentIterator::segments() const { +DiscreteTrajectorySegmentIterator +DiscreteTrajectorySegmentIterator::EndSegment() const { DCHECK(segments_ != nullptr); - return {DiscreteTrajectorySegmentIterator(segments_, segments_->begin()), - DiscreteTrajectorySegmentIterator(segments_, segments_->end())}; + return DiscreteTrajectorySegmentIterator(segments_, segments_->end()); } template diff --git a/physics/discrete_trajectory_segment_iterator_test.cpp b/physics/discrete_trajectory_segment_iterator_test.cpp index 70a106d3ea..4d56e4b649 100644 --- a/physics/discrete_trajectory_segment_iterator_test.cpp +++ b/physics/discrete_trajectory_segment_iterator_test.cpp @@ -1,5 +1,6 @@ #include "physics/discrete_trajectory_segment_iterator.hpp" +#include #include #include "base/not_null.hpp" @@ -27,6 +28,8 @@ class DiscreteTrajectorySegmentIteratorTest : public ::testing::Test { protected: using World = Frame; using Segments = _discrete_trajectory_types::Segments; + static_assert( + std::bidirectional_iterator>); DiscreteTrajectorySegmentIteratorTest() : segments_(MakeSegments(3)) { diff --git a/physics/discrete_trajectory_segment_range.hpp b/physics/discrete_trajectory_segment_range.hpp deleted file mode 100644 index 277c1b8676..0000000000 --- a/physics/discrete_trajectory_segment_range.hpp +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include - -namespace principia { -namespace physics { -namespace _discrete_trajectory_segment_range { -namespace internal { - -// A range of segments in a DiscreteTrajectory, iterator upon using `Iterator`. -// Convenient for range-based loops. -// TODO(phl): Move to base or use the Ranges library if it turns out that this -// class doesn't need to know more about trajectories. -template -class DiscreteTrajectorySegmentRange { - public: - DiscreteTrajectorySegmentRange() = default; - DiscreteTrajectorySegmentRange(Iterator begin, Iterator end); - - typename Iterator::reference front() const; - typename Iterator::reference back() const; - - Iterator begin() const; - Iterator end() const; - - bool empty() const; - std::int64_t size() const; - - private: - Iterator begin_; - Iterator end_; -}; - -} // namespace internal - -using internal::DiscreteTrajectorySegmentRange; - -} // namespace _discrete_trajectory_segment_range -} // namespace physics -} // namespace principia - -#include "physics/discrete_trajectory_segment_range_body.hpp" diff --git a/physics/discrete_trajectory_segment_range_body.hpp b/physics/discrete_trajectory_segment_range_body.hpp deleted file mode 100644 index 81bf55c89d..0000000000 --- a/physics/discrete_trajectory_segment_range_body.hpp +++ /dev/null @@ -1,53 +0,0 @@ -#pragma once - -#include "physics/discrete_trajectory_segment_range.hpp" - -#include - -namespace principia { -namespace physics { -namespace _discrete_trajectory_segment_range { -namespace internal { - -template -DiscreteTrajectorySegmentRange::DiscreteTrajectorySegmentRange( - Iterator const begin, - Iterator const end) - : begin_(begin), end_(end) {} - -template -typename Iterator::reference -DiscreteTrajectorySegmentRange::front() const { - return *begin(); -} - -template -typename Iterator::reference -DiscreteTrajectorySegmentRange::back() const { - return *(--end()); -} - -template -Iterator DiscreteTrajectorySegmentRange::begin() const { - return begin_; -} - -template -Iterator DiscreteTrajectorySegmentRange::end() const { - return end_; -} - -template -inline bool DiscreteTrajectorySegmentRange::empty() const { - return begin_ == end_; -} - -template -inline std::int64_t DiscreteTrajectorySegmentRange::size() const { - return std::distance(begin_, end_); -} - -} // namespace internal -} // namespace _discrete_trajectory_segment_range -} // namespace physics -} // namespace principia diff --git a/physics/discrete_trajectory_segment_range_test.cpp b/physics/discrete_trajectory_segment_range_test.cpp deleted file mode 100644 index 319baf08e0..0000000000 --- a/physics/discrete_trajectory_segment_range_test.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include "physics/discrete_trajectory_segment_range.hpp" - -#include - -#include "gtest/gtest.h" - -namespace principia { -namespace physics { - -using namespace principia::physics::_discrete_trajectory_segment_range; - -TEST(DiscreteTrajectorySegmentRangeTest, Basic) { - std::vector const primes{2, 3, 5, 7, 11, 13, 17, 19, 23}; - DiscreteTrajectorySegmentRange::const_iterator> range( - primes.begin(), primes.end()); - - EXPECT_EQ(2, range.front()); - EXPECT_EQ(23, range.back()); - - int sum = 0; - int product = 1; - for (int const prime : range) { - sum += prime; - product *= prime; - } - EXPECT_EQ(100, sum); - EXPECT_EQ(223'092'870, product); - - EXPECT_EQ(9, primes.size()); - EXPECT_FALSE(primes.empty()); -} - -} // namespace physics -} // namespace principia diff --git a/physics/physics.vcxproj b/physics/physics.vcxproj index 70e0dfc6ab..efa5554df8 100644 --- a/physics/physics.vcxproj +++ b/physics/physics.vcxproj @@ -34,8 +34,6 @@ - - @@ -106,7 +104,6 @@ - diff --git a/physics/physics.vcxproj.filters b/physics/physics.vcxproj.filters index 793fa6a3d8..11e7077565 100644 --- a/physics/physics.vcxproj.filters +++ b/physics/physics.vcxproj.filters @@ -155,12 +155,6 @@ Header Files - - Header Files - - - Source Files - Source Files @@ -319,9 +313,6 @@ Test Files - - Test Files - Test Files