X-Git-Url: http://git.tdb.fi/?p=r2c2.git;a=blobdiff_plain;f=source%2Flibr2c2%2Ftrainroutemetric.cpp;h=d3878d4aaec5d3b6dc875ee7b0453e0da82376f4;hp=1fc4fcea2389d917ecaa90627791801dc0ee46e2;hb=8c7fc0b79ce88e0295e0e6ea52cb7eb753158d8a;hpb=5b71cb905051d654c150cb0e098cade0cb502105 diff --git a/source/libr2c2/trainroutemetric.cpp b/source/libr2c2/trainroutemetric.cpp index 1fc4fce..d3878d4 100644 --- a/source/libr2c2/trainroutemetric.cpp +++ b/source/libr2c2/trainroutemetric.cpp @@ -9,22 +9,28 @@ namespace R2C2 { 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 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::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; jget_n_link_slots(); - for(unsigned j=0; jget_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); } list queue;