Skip to content

Commit f2cf2c7

Browse files
authored
Merge pull request #3164 from pleroy/Back
Add back and front to the classes that have sequence semantics
2 parents 2b36c84 + 29871a3 commit f2cf2c7

17 files changed

+92
-30
lines changed

astronomy/geodesy_test.cpp

+9-9
Original file line numberDiff line numberDiff line change
@@ -108,17 +108,17 @@ TEST_F(GeodesyTest, DISABLED_LAGEOS2) {
108108
StandardProduct3::SatelliteIdentifier const lageos2_id{
109109
StandardProduct3::SatelliteGroup::General, 52};
110110

111-
CHECK_EQ(initial_ilrsa.orbit(lageos2_id).front()->begin()->first,
112-
initial_ilrsb.orbit(lageos2_id).front()->begin()->first);
111+
CHECK_EQ(initial_ilrsa.orbit(lageos2_id).front()->front().first,
112+
initial_ilrsb.orbit(lageos2_id).front()->front().first);
113113

114114
auto const& [initial_time, initial_dof_ilrsa] =
115-
*initial_ilrsa.orbit(lageos2_id).front()->begin();
115+
initial_ilrsa.orbit(lageos2_id).front()->front();
116116

117117
auto const& [_, initial_dof_ilrsb] =
118-
*initial_ilrsb.orbit(lageos2_id).front()->begin();
118+
initial_ilrsb.orbit(lageos2_id).front()->front();
119119

120120
auto const& [final_time, expected_final_dof] =
121-
*final_ilrsa.orbit(lageos2_id).front()->begin();
121+
final_ilrsa.orbit(lageos2_id).front()->front();
122122

123123
ephemeris_->Prolong(final_time);
124124

@@ -152,13 +152,13 @@ TEST_F(GeodesyTest, DISABLED_LAGEOS2) {
152152
return flow_lageos2(secondary_lageos2_trajectory);
153153
});
154154
bundle.Join();
155-
EXPECT_THAT(primary_lageos2_trajectory.rbegin()->first, Eq(final_time));
156-
EXPECT_THAT(secondary_lageos2_trajectory.rbegin()->first, Eq(final_time));
155+
EXPECT_THAT(primary_lageos2_trajectory.back().first, Eq(final_time));
156+
EXPECT_THAT(secondary_lageos2_trajectory.back().first, Eq(final_time));
157157

158158
auto const primary_actual_final_dof = itrs_.ToThisFrameAtTime(final_time)(
159-
primary_lageos2_trajectory.rbegin()->second);
159+
primary_lageos2_trajectory.back().second);
160160
auto const secondary_actual_final_dof = itrs_.ToThisFrameAtTime(final_time)(
161-
secondary_lageos2_trajectory.rbegin()->second);
161+
secondary_lageos2_trajectory.back().second);
162162

163163
// Absolute error in position.
164164
EXPECT_THAT(AbsoluteError(primary_actual_final_dof.position(),

astronomy/orbit_ground_track_body.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ absl::StatusOr<OrbitGroundTrack> OrbitGroundTrack::ForTrajectory(
149149
PlanetocentricLongitudes(descending_nodes, primary);
150150
ground_track.first_descending_pass_before_first_ascending_pass_ =
151151
!ascending_nodes.empty() && !descending_nodes.empty() &&
152-
descending_nodes.begin()->first < ascending_nodes.begin()->first;
152+
descending_nodes.front().first < ascending_nodes.front().first;
153153
return ground_track;
154154
}
155155

astronomy/orbital_elements_body.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ absl::StatusOr<OrbitalElements> OrbitalElements::ForTrajectory(
6565
"trajectory does not span one sidereal period: sidereal period is " +
6666
DebugString(orbital_elements.sidereal_period_) +
6767
", trajectory spans " +
68-
DebugString(trajectory.rbegin()->first -
69-
trajectory.begin()->first));
68+
DebugString(trajectory.back().first -
69+
trajectory.front().first));
7070
}
7171
auto mean_classical_elements =
7272
ToClassicalElements(orbital_elements.mean_equinoctial_elements_);

astronomy/standard_product_3_test.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ TEST_P(StandardProduct3DynamicsTest, PerturbedKeplerian) {
392392
/*speed_integration_tolerance=*/1 * Milli(Metre) / Second),
393393
/*max_ephemeris_steps=*/std::numeric_limits<std::int64_t>::max());
394394
DegreesOfFreedom<ICRS> const actual =
395-
integrated_arc.rbegin()->second;
395+
integrated_arc.back().second;
396396
DegreesOfFreedom<ICRS> const expected =
397397
itrs_.FromThisFrameAtTime(time)(degrees_of_freedom);
398398
EXPECT_THAT(AbsoluteError(expected.position(), actual.position()),

astronomy/лидов_古在_test.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ TEST_F(Лидов古在Test, MercuryOrbiter) {
101101
LOG(INFO) << "Flowing to " << t;
102102
auto const status = ephemeris_->FlowWithFixedStep(t, *instance);
103103
if (!status.ok()) {
104-
LOG(INFO) << status << " at " << icrs_trajectory.rbegin()->first;
104+
LOG(INFO) << status << " at " << icrs_trajectory.back().first;
105105
break;
106106
}
107107
}
@@ -116,7 +116,7 @@ TEST_F(Лидов古在Test, MercuryOrbiter) {
116116
mercury_frame_.ToThisFrameAtTime(t)(dof));
117117
logger.Append(
118118
"q",
119-
mercury_centred_trajectory.rbegin()->second.position(),
119+
mercury_centred_trajectory.back().second.position(),
120120
mathematica::ExpressIn(Metre));
121121
}
122122

mathematica/mathematica_test.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,8 @@ TEST_F(MathematicaTest, ToMathematica) {
213213
Velocity<F>({-1.0 * Metre / Second,
214214
-5.0 * Metre / Second,
215215
8.0 * Metre / Second})));
216-
EXPECT_EQ(ToMathematica(std::pair{trajectory.begin()->first,
217-
trajectory.begin()->second}),
216+
EXPECT_EQ(ToMathematica(std::pair{trajectory.front().first,
217+
trajectory.front().second}),
218218
ToMathematica(*trajectory.begin()));
219219
}
220220
{

physics/discrete_traject0ry.hpp

+4
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class DiscreteTraject0ry : public Trajectory<Frame> {
4545
typename internal_discrete_trajectory_types::Timeline<Frame>::value_type;
4646

4747
using iterator = DiscreteTrajectoryIterator<Frame>;
48+
using reference = value_type const&;
4849
using reverse_iterator = std::reverse_iterator<iterator>;
4950
using SegmentIterator = DiscreteTrajectorySegmentIterator<Frame>;
5051
using ReverseSegmentIterator = std::reverse_iterator<SegmentIterator>;
@@ -60,6 +61,9 @@ class DiscreteTraject0ry : public Trajectory<Frame> {
6061
DiscreteTraject0ry(const DiscreteTraject0ry&) = delete;
6162
DiscreteTraject0ry& operator=(const DiscreteTraject0ry&) = delete;
6263

64+
reference front() const;
65+
reference back() const;
66+
6367
iterator begin() const;
6468
iterator end() const;
6569

physics/discrete_traject0ry_body.hpp

+12
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,18 @@ DiscreteTraject0ry<Frame>::DiscreteTraject0ry()
2828
segment_by_left_endpoint_.emplace(InfinitePast, sit);
2929
}
3030

31+
template<typename Frame>
32+
typename DiscreteTraject0ry<Frame>::reference
33+
DiscreteTraject0ry<Frame>::front() const {
34+
return *begin();
35+
}
36+
37+
template<typename Frame>
38+
typename DiscreteTraject0ry<Frame>::reference
39+
DiscreteTraject0ry<Frame>::back() const {
40+
return *rbegin();
41+
}
42+
3143
template<typename Frame>
3244
typename DiscreteTraject0ry<Frame>::iterator
3345
DiscreteTraject0ry<Frame>::begin() const {

physics/discrete_traject0ry_test.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,12 @@ TEST_F(DiscreteTraject0ryTest, Make) {
130130
auto const trajectory = MakeTrajectory();
131131
}
132132

133+
TEST_F(DiscreteTraject0ryTest, BackFront) {
134+
auto const trajectory = MakeTrajectory();
135+
EXPECT_EQ(t0_, trajectory.front().first);
136+
EXPECT_EQ(t0_ + 14 * Second, trajectory.back().first);
137+
}
138+
133139
TEST_F(DiscreteTraject0ryTest, IterateForward) {
134140
auto const trajectory = MakeTrajectory();
135141
std::vector<Instant> times;

physics/discrete_trajectory_segment.hpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class DiscreteTrajectorySegment : public Trajectory<Frame> {
5353
using value_type = typename Timeline::value_type;
5454

5555
using iterator = DiscreteTrajectoryIterator<Frame>;
56+
using reference = value_type const&;
5657
using reverse_iterator = std::reverse_iterator<iterator>;
5758

5859
using DownsamplingParameters =
@@ -72,6 +73,9 @@ class DiscreteTrajectorySegment : public Trajectory<Frame> {
7273
DiscreteTrajectorySegment& operator=(const DiscreteTrajectorySegment&) =
7374
delete;
7475

76+
reference front() const;
77+
reference back() const;
78+
7579
iterator begin() const;
7680
iterator end() const;
7781

@@ -105,7 +109,8 @@ class DiscreteTrajectorySegment : public Trajectory<Frame> {
105109
void ClearDownsampling();
106110

107111
// The points denoted by |exact| are written and re-read exactly and are not
108-
// affected by any errors introduced by zfp compression.
112+
// affected by any errors introduced by zfp compression. The endpoints of a
113+
// segment are always exact.
109114
void WriteToMessage(
110115
not_null<serialization::DiscreteTrajectorySegment*> message,
111116
std::vector<iterator> const& exact) const;

physics/discrete_trajectory_segment_body.hpp

+12
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,18 @@ DiscreteTrajectorySegment<Frame>::DiscreteTrajectorySegment(
3737
DiscreteTrajectorySegmentIterator<Frame> const self)
3838
: self_(self) {}
3939

40+
template<typename Frame>
41+
typename DiscreteTrajectorySegment<Frame>::reference
42+
DiscreteTrajectorySegment<Frame>::front() const {
43+
return *begin();
44+
}
45+
46+
template<typename Frame>
47+
typename DiscreteTrajectorySegment<Frame>::reference
48+
DiscreteTrajectorySegment<Frame>::back() const {
49+
return *rbegin();
50+
}
51+
4052
template<typename Frame>
4153
typename DiscreteTrajectorySegment<Frame>::iterator
4254
DiscreteTrajectorySegment<Frame>::begin() const {

physics/discrete_trajectory_segment_range.hpp

+3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ class DiscreteTrajectorySegmentRange {
1616
DiscreteTrajectorySegmentRange() = default;
1717
DiscreteTrajectorySegmentRange(Iterator begin, Iterator end);
1818

19+
typename Iterator::reference front() const;
20+
typename Iterator::reference back() const;
21+
1922
Iterator begin() const;
2023
Iterator end() const;
2124

physics/discrete_trajectory_segment_range_body.hpp

+12
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,18 @@ DiscreteTrajectorySegmentRange<Iterator>::DiscreteTrajectorySegmentRange(
1414
Iterator const end)
1515
: begin_(begin), end_(end) {}
1616

17+
template<typename Iterator>
18+
typename Iterator::reference
19+
DiscreteTrajectorySegmentRange<Iterator>::front() const {
20+
return *begin();
21+
}
22+
23+
template<typename Iterator>
24+
typename Iterator::reference
25+
DiscreteTrajectorySegmentRange<Iterator>::back() const {
26+
return *(--end());
27+
}
28+
1729
template<typename Iterator>
1830
Iterator DiscreteTrajectorySegmentRange<Iterator>::begin() const {
1931
return begin_;

physics/discrete_trajectory_segment_range_test.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ TEST(DiscreteTrajectorySegmentRangeTest, Basic) {
1212
DiscreteTrajectorySegmentRange<std::vector<int>::const_iterator> range(
1313
primes.begin(), primes.end());
1414

15+
EXPECT_EQ(2, range.front());
16+
EXPECT_EQ(23, range.back());
17+
1518
int sum = 0;
1619
int product = 1;
1720
for (int const prime : range) {

physics/discrete_trajectory_segment_test.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@ class DiscreteTrajectorySegmentTest : public ::testing::Test {
105105
DegreesOfFreedom<World> unmoving_origin_{World::origin, World::unmoving};
106106
};
107107

108+
TEST_F(DiscreteTrajectorySegmentTest, BackFront) {
109+
EXPECT_EQ(t0_ + 2 * Second, segment_->front().first);
110+
EXPECT_EQ(t0_ + 11 * Second, segment_->back().first);
111+
}
112+
108113
TEST_F(DiscreteTrajectorySegmentTest, Extremities) {
109114
{
110115
auto const it = segment_->begin();

physics/ephemeris_body.hpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -468,10 +468,10 @@ Ephemeris<Frame>::StoppableNewInstance(
468468
};
469469

470470
CHECK(!trajectories.empty());
471-
auto const& [trajectory_last_time, _] = *(*trajectories.begin())->rbegin();
471+
auto const& [trajectory_last_time, _] = (*trajectories.begin())->back();
472472
problem.initial_state.time = DoublePrecision<Instant>(trajectory_last_time);
473473
for (auto const& trajectory : trajectories) {
474-
auto const& [last_time, last_degrees_of_freedom] = *trajectory->rbegin();
474+
auto const& [last_time, last_degrees_of_freedom] = trajectory->back();
475475
CHECK_EQ(last_time, trajectory_last_time);
476476
problem.initial_state.positions.emplace_back(
477477
last_degrees_of_freedom.position());
@@ -1347,7 +1347,7 @@ absl::Status Ephemeris<Frame>::FlowODEWithAdaptiveStep(
13471347
ODEAdaptiveStepParameters<ODE> const& parameters,
13481348
std::int64_t max_ephemeris_steps) {
13491349
auto const& [trajectory_last_time,
1350-
trajectory_last_degrees_of_freedom] = *trajectory->rbegin();
1350+
trajectory_last_degrees_of_freedom] = trajectory->back();
13511351
if (trajectory_last_time == t) {
13521352
return absl::OkStatus();
13531353
}

physics/ephemeris_test.cpp

+9-9
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ TEST_P(EphemerisTest, FlowWithAdaptiveStepSpecialCase) {
250250
EXPECT_OK(ephemeris.FlowWithAdaptiveStep(
251251
&trajectory,
252252
Ephemeris<ICRS>::NoIntrinsicAcceleration,
253-
trajectory.rbegin()->first,
253+
trajectory.back().first,
254254
Ephemeris<ICRS>::AdaptiveStepParameters(
255255
EmbeddedExplicitRungeKuttaNyströmIntegrator<
256256
DormandالمكاوىPrince1986RKN434FM,
@@ -447,10 +447,10 @@ TEST_P(EphemerisTest, EarthProbe) {
447447
AlmostEquals(1.00 * period * v_earth, 633, 635));
448448
EXPECT_THAT(earth_positions[100].coordinates().y, Eq(q_earth));
449449

450-
Length const q_probe = (trajectory.rbegin()->second.position() -
450+
Length const q_probe = (trajectory.back().second.position() -
451451
ICRS::origin).coordinates().y;
452452
Speed const v_probe =
453-
trajectory.rbegin()->second.velocity().coordinates().x;
453+
trajectory.back().second.velocity().coordinates().x;
454454
std::vector<Displacement<ICRS>> probe_positions;
455455
for (auto const& [time, degrees_of_freedom] : trajectory) {
456456
probe_positions.push_back(degrees_of_freedom.position() - ICRS::origin);
@@ -472,7 +472,7 @@ TEST_P(EphemerisTest, EarthProbe) {
472472
Eq(q_probe));
473473

474474
Instant const old_t_max = ephemeris.t_max();
475-
EXPECT_THAT(trajectory.rbegin()->first, Lt(old_t_max));
475+
EXPECT_THAT(trajectory.back().first, Lt(old_t_max));
476476
EXPECT_THAT(ephemeris.FlowWithAdaptiveStep(
477477
&trajectory,
478478
intrinsic_acceleration,
@@ -487,7 +487,7 @@ TEST_P(EphemerisTest, EarthProbe) {
487487
/*max_ephemeris_steps=*/0),
488488
StatusIs(absl::StatusCode::kDeadlineExceeded));
489489
EXPECT_THAT(ephemeris.t_max(), Eq(old_t_max));
490-
EXPECT_THAT(trajectory.rbegin()->first, Eq(old_t_max));
490+
EXPECT_THAT(trajectory.back().first, Eq(old_t_max));
491491
}
492492

493493
// The Earth and two massless probes, similar to the previous test but flowing
@@ -580,13 +580,13 @@ TEST_P(EphemerisTest, EarthTwoProbes) {
580580
EXPECT_THAT(earth_positions[100].coordinates().y, Eq(q_earth));
581581

582582
Length const q_probe1 =
583-
(trajectory1.rbegin()->second.position() - ICRS::origin).coordinates().y;
583+
(trajectory1.back().second.position() - ICRS::origin).coordinates().y;
584584
Length const q_probe2 =
585-
(trajectory2.rbegin()->second.position() - ICRS::origin).coordinates().y;
585+
(trajectory2.back().second.position() - ICRS::origin).coordinates().y;
586586
Speed const v_probe1 =
587-
trajectory1.rbegin()->second.velocity().coordinates().x;
587+
trajectory1.back().second.velocity().coordinates().x;
588588
Speed const v_probe2 =
589-
trajectory2.rbegin()->second.velocity().coordinates().x;
589+
trajectory2.back().second.velocity().coordinates().x;
590590
std::vector<Displacement<ICRS>> probe1_positions;
591591
std::vector<Displacement<ICRS>> probe2_positions;
592592
for (auto const& [time, degrees_of_freedom] : trajectory1) {

0 commit comments

Comments
 (0)