Skip to content

Commit 2443157

Browse files
fares: use leg pointers instead of copies
1 parent 078e5b8 commit 2443157

3 files changed

Lines changed: 22 additions & 18 deletions

File tree

include/nigiri/fares.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,18 +120,20 @@ inline std::ostream& operator<<(
120120
std::ostream& out, fares::fare_transfer_rule::fare_transfer_type const t) {
121121
using fare_transfer_type = fares::fare_transfer_rule::fare_transfer_type;
122122
switch (t) {
123-
case fare_transfer_type::kAPlusAB: return out << "APlusAB";
124-
case fare_transfer_type::kAPlusABPlusB: return out << "APlusABPlusB";
123+
case fare_transfer_type::kAPlusAB: return out << "A+AB";
124+
case fare_transfer_type::kAPlusABPlusB: return out << "A+AB+B";
125125
case fare_transfer_type::kAB: return out << "AB";
126126
}
127127
std::unreachable();
128128
}
129129

130130
struct timetable;
131131

132+
using effective_fare_leg_t = std::vector<routing::journey::leg const*>;
133+
132134
struct fare_leg {
133135
source_idx_t src_;
134-
std::vector<routing::journey::leg> joined_leg_;
136+
effective_fare_leg_t joined_leg_;
135137
std::vector<fares::fare_leg_rule> rule_;
136138
};
137139

src/fares.cc

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,12 @@ std::vector<journey::leg> get_transit_legs(journey const& j) {
124124
return transit_legs;
125125
}
126126

127-
using joined_legs_t = std::vector<std::vector<journey::leg>>;
127+
using joined_legs_t = std::vector<std::vector<journey::leg const*>>;
128128

129129
joined_legs_t join_legs(timetable const& tt,
130130
std::vector<journey::leg> const& transit_legs) {
131+
auto const to_ptr = [](auto const& x) { return &x; };
132+
131133
auto const has_equal_src = [&](journey::leg const& a_l,
132134
journey::leg const& b_l) {
133135
auto const a =
@@ -141,7 +143,7 @@ joined_legs_t join_legs(timetable const& tt,
141143
return tt.trip_id_src_[a_id_idx] == tt.trip_id_src_[b_id_idx];
142144
};
143145

144-
auto joined_legs = std::vector<std::vector<journey::leg>>{};
146+
auto joined_legs = joined_legs_t{};
145147
utl::equal_ranges_linear(
146148
transit_legs, has_equal_src,
147149
[&](std::vector<journey::leg>::const_iterator const from_it,
@@ -155,10 +157,10 @@ joined_legs_t join_legs(timetable const& tt,
155157
if (join(tt, *pred, *it)) {
156158
continue;
157159
}
158-
joined_legs.emplace_back(join_from, it);
160+
joined_legs.push_back(utl::to_vec(it_range{join_from, it}, to_ptr));
159161
join_from = it;
160162
}
161-
joined_legs.emplace_back(join_from, to_it);
163+
joined_legs.push_back(utl::to_vec(it_range{join_from, to_it}, to_ptr));
162164
});
163165
return joined_legs;
164166
}
@@ -191,14 +193,14 @@ timeframe_group_idx_t match_timeframe(timetable const& tt,
191193
}
192194

193195
std::pair<source_idx_t, std::vector<fares::fare_leg_rule>> match_leg_rule(
194-
timetable const& tt, std::vector<journey::leg> const& joined_legs) {
196+
timetable const& tt, effective_fare_leg_t const& joined_legs) {
195197
auto const& first = joined_legs.front();
196198
auto const& last = joined_legs.back();
197199

198-
auto const first_r = std::get<journey::run_enter_exit>(first.uses_).r_;
200+
auto const first_r = std::get<journey::run_enter_exit>(first->uses_).r_;
199201
auto const first_trip = rt::frun{tt, nullptr, first_r};
200202

201-
auto const last_r = std::get<journey::run_enter_exit>(last.uses_).r_;
203+
auto const last_r = std::get<journey::run_enter_exit>(last->uses_).r_;
202204
auto const last_trip = rt::frun{tt, nullptr, last_r};
203205

204206
auto const from = first_trip[first_r.stop_range_.from_];
@@ -266,11 +268,11 @@ bool matches(fares::fare_transfer_rule const& r,
266268
switch (r.duration_limit_type_) {
267269
case duration_limit_type::kCurrDepNextDep:
268270
case duration_limit_type::kCurrDepNextArr:
269-
return from.joined_leg_.front().dep_time_;
271+
return from.joined_leg_.front()->dep_time_;
270272

271273
case duration_limit_type::kCurrArrNextArr:
272274
case duration_limit_type::kCurrArrNextDep:
273-
return from.joined_leg_.back().arr_time_;
275+
return from.joined_leg_.back()->arr_time_;
274276
}
275277
std::unreachable();
276278
};
@@ -279,11 +281,11 @@ bool matches(fares::fare_transfer_rule const& r,
279281
switch (r.duration_limit_type_) {
280282
case duration_limit_type::kCurrDepNextDep:
281283
case duration_limit_type::kCurrArrNextDep:
282-
return b.joined_leg_.front().dep_time_;
284+
return b.joined_leg_.front()->dep_time_;
283285

284286
case duration_limit_type::kCurrArrNextArr:
285287
case duration_limit_type::kCurrDepNextArr:
286-
return b.joined_leg_.back().arr_time_;
288+
return b.joined_leg_.back()->arr_time_;
287289
}
288290
std::unreachable();
289291
};
@@ -362,7 +364,7 @@ std::vector<fare_transfer> join_transfers(
362364
std::vector<fare_transfer> get_fares(timetable const& tt, journey const& j) {
363365
return join_transfers(
364366
tt, utl::to_vec(join_legs(tt, get_transit_legs(j)),
365-
[&](std::vector<journey::leg> const& joined_leg) {
367+
[&](effective_fare_leg_t const& joined_leg) {
366368
auto const [src, rules] =
367369
match_leg_rule(tt, joined_leg);
368370
return fare_leg{src, joined_leg, rules};

test/loader/gtfs/fares_test.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ std::string to_string(timetable const& tt,
204204
} else {
205205
ss << "** JOINED WITH\n";
206206
}
207-
jl.print(ss, tt);
207+
jl->print(ss, tt);
208208
}
209209
ss << "PRODUCTS\n";
210210
for (auto const& r : l.rule_) {
@@ -236,7 +236,7 @@ TEST(fares, simple_fares) {
236236
auto const fare_legs = get_fares(tt, *results.begin());
237237
constexpr auto const kExpected = R"(FARE TRANSFER START
238238
TRANSFER PRODUCT: Full Airport Extension Card
239-
RULE: APlusAB
239+
RULE: A+AB
240240
FARE LEG:
241241
0: A A............................................... d: 30.03 00:00 [30.03 02:00] [{name=Line 1, day=2022-03-30, id=T1, src=0}]
242242
1: B B............................................... a: 30.03 00:30 [30.03 02:30]
@@ -272,7 +272,7 @@ FARE TRANSFER END
272272
auto const fare_legs = get_fares(tt, *results.begin());
273273
constexpr auto const kExpected = R"(FARE TRANSFER START
274274
TRANSFER PRODUCT: Full Airport Extension Card
275-
RULE: APlusAB
275+
RULE: A+AB
276276
FARE LEG:
277277
0: A A............................................... d: 30.03 06:00 [30.03 08:00] [{name=Line 1, day=2022-03-30, id=T1, src=0}]
278278
1: B B............................................... a: 30.03 06:30 [30.03 08:30]

0 commit comments

Comments
 (0)