summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
5b71cb9)
The previous code incorrectly added all tracks as goals when a direction
was specified, instead of only the ends. This caused cost estimate creep
in the route planner, resulting in suboptimal performance.
bool has_track(Track &) const;
virtual TrackIter iter_for(Track &, Direction) const;
TrackIter get_end(unsigned) const;
bool has_track(Track &) const;
virtual TrackIter iter_for(Track &, Direction) const;
TrackIter get_end(unsigned) const;
+ virtual TrackIter get_end(Direction) const { return get_end(0); }
bool is_loop() const;
private:
bool is_loop() const;
private:
TrainRouteMetric::TrainRouteMetric(const TrackChain &tc, TrackChain::Direction dir)
{
TrainRouteMetric::TrainRouteMetric(const TrackChain &tc, TrackChain::Direction dir)
{
- /* Initialize goals for tracks in the target chain. We travel outwards from
- the target in the search phase so the iters appear to point the wrong way. */
- TrackChain::Direction reverse_dir = (dir==TrackChain::DOWN ? TrackChain::UP : TrackChain::DOWN);
- const TrackChain::TrackSet &ctracks = tc.get_tracks();
- for(TrackChain::TrackSet::const_iterator i=ctracks.begin(); i!=ctracks.end(); ++i)
+ vector<TrackIter> ends;
+ if(dir==TrackChain::UNSPECIFIED)
- if(dir==TrackChain::UNSPECIFIED)
+ for(unsigned i=0; i<2; ++i)
+ if(TrackIter end = tc.get_end(i))
+ ends.push_back(end);
+ }
+ else if(TrackIter end = tc.get_end(dir))
+ ends.push_back(end);
+
+ /* Initialize goals for the ends of the target chain. We travel away from
+ the goals in the search phase so the iters appear to point the wrong way. */
+ for(vector<TrackIter>::const_iterator i=ends.begin(); i!=ends.end(); ++i)
+ {
+ const TrackType::Endpoint &ep = i->endpoint();
+ unsigned nls = (*i)->get_n_link_slots();
+ for(unsigned j=0; j<nls; ++j)
- unsigned nls = (*i)->get_n_link_slots();
- for(unsigned j=0; j<nls; ++j)
- if(Track *link = (*i)->get_link(j))
- if(!ctracks.count(link))
- goals.push_back(TrackIter(*i, j));
+ TrackIter iter(i->track(), j);
+ if(ep.has_common_paths(iter.endpoint()))
+ goals.push_back(iter);
- else if(TrackIter iter = tc.iter_for(**i, reverse_dir))
- goals.push_back(iter);
private:
TrackIter next_iter(const TrackIter &) const;
public:
private:
TrackIter next_iter(const TrackIter &) const;
public:
- using TrackChain::get_end;
- TrackIter get_end(Direction) const;
+ virtual TrackIter get_end(Direction) const;
void save(std::list<Msp::DataFile::Statement> &) const;
virtual Msp::DataFile::Statement save_reference() const;
void save(std::list<Msp::DataFile::Statement> &) const;
virtual Msp::DataFile::Statement save_reference() const;