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: 0b6a2cd23fa0
Choose a base ref
...
head repository: mockingbirdnest/Principia
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 6422bbe02037
Choose a head ref
  • 3 commits
  • 5 files changed
  • 1 contributor

Commits on Oct 7, 2021

  1. Range.

    pleroy committed Oct 7, 2021
    Copy the full SHA
    42eb212 View commit details
  2. After egg's review.

    pleroy committed Oct 7, 2021
    Copy the full SHA
    5fb54be View commit details
  3. Merge pull request #3140 from pleroy/RangeIterator

    DiscreteTrajectorySegmentRange
    pleroy authored Oct 7, 2021
    Copy the full SHA
    6422bbe View commit details
38 changes: 38 additions & 0 deletions physics/discrete_trajectory_segment_range.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#pragma once

#include <cstdint>

namespace principia {
namespace physics {
namespace internal_discrete_trajectory_segment_range {

// 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<typename Iterator>
class DiscreteTrajectorySegmentRange {
public:
DiscreteTrajectorySegmentRange() = default;
DiscreteTrajectorySegmentRange(Iterator begin, Iterator end);

Iterator begin() const;
Iterator end() const;

bool empty() const;
std::int64_t size() const;

private:
Iterator begin_;
Iterator end_;
};

} // namespace internal_discrete_trajectory_segment_range

using internal_discrete_trajectory_segment_range::
DiscreteTrajectorySegmentRange;

} // namespace physics
} // namespace principia

#include "physics/discrete_trajectory_segment_range_body.hpp"
39 changes: 39 additions & 0 deletions physics/discrete_trajectory_segment_range_body.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#pragma once

#include "physics/discrete_trajectory_segment_range.hpp"

#include <iterator>

namespace principia {
namespace physics {
namespace internal_discrete_trajectory_segment_range {

template<typename Iterator>
DiscreteTrajectorySegmentRange<Iterator>::DiscreteTrajectorySegmentRange(
Iterator const begin,
Iterator const end)
: begin_(begin), end_(end) {}

template<typename Iterator>
Iterator DiscreteTrajectorySegmentRange<Iterator>::begin() const {
return begin_;
}

template<typename Iterator>
Iterator DiscreteTrajectorySegmentRange<Iterator>::end() const {
return end_;
}

template<typename Iterator>
inline bool DiscreteTrajectorySegmentRange<Iterator>::empty() const {
return begin_ == end_;
}

template<typename Iterator>
inline std::int64_t DiscreteTrajectorySegmentRange<Iterator>::size() const {
return std::distance(begin_, end_);
}

} // namespace internal_discrete_trajectory_segment_range
} // namespace physics
} // namespace principia
29 changes: 29 additions & 0 deletions physics/discrete_trajectory_segment_range_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#include "physics/discrete_trajectory_segment_range.hpp"

#include <vector>

#include "gtest/gtest.h"

namespace principia {
namespace physics {

TEST(DiscreteTrajectorySegmentRangeTest, Basic) {
std::vector<int> const primes{2, 3, 5, 7, 11, 13, 17, 19, 23};
DiscreteTrajectorySegmentRange<std::vector<int>::const_iterator> range(
primes.begin(), primes.end());

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
3 changes: 3 additions & 0 deletions physics/physics.vcxproj
Original file line number Diff line number Diff line change
@@ -31,6 +31,8 @@
<ClInclude Include="body_surface_frame_field_body.hpp" />
<ClInclude Include="checkpointer.hpp" />
<ClInclude Include="checkpointer_body.hpp" />
<ClInclude Include="discrete_trajectory_segment_range.hpp" />
<ClInclude Include="discrete_trajectory_segment_range_body.hpp" />
<ClInclude Include="mechanical_system.hpp" />
<ClInclude Include="mechanical_system_body.hpp" />
<ClInclude Include="continuous_trajectory_body.hpp" />
@@ -92,6 +94,7 @@
<ClCompile Include="body_surface_frame_field_test.cpp" />
<ClCompile Include="body_test.cpp" />
<ClCompile Include="checkpointer_test.cpp" />
<ClCompile Include="discrete_trajectory_segment_range_test.cpp" />
<ClCompile Include="mechanical_system_test.cpp" />
<ClCompile Include="continuous_trajectory_test.cpp" />
<ClCompile Include="degrees_of_freedom_test.cpp" />
9 changes: 9 additions & 0 deletions physics/physics.vcxproj.filters
Original file line number Diff line number Diff line change
@@ -191,6 +191,12 @@
<ClInclude Include="mechanical_system_body.hpp">
<Filter>Source Files</Filter>
</ClInclude>
<ClInclude Include="discrete_trajectory_segment_range.hpp">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="discrete_trajectory_segment_range_body.hpp">
<Filter>Source Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="degrees_of_freedom_test.cpp">
@@ -289,5 +295,8 @@
<ClCompile Include="..\geometry\instant_output.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="discrete_trajectory_segment_range_test.cpp">
<Filter>Test Files</Filter>
</ClCompile>
</ItemGroup>
</Project>