@@ -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
129129joined_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
193195std::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(
362364std::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};
0 commit comments