X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Froute.cpp;h=daa044f9b9b4054b774421df3e6ada5168f76c43;hb=e392d397f6b86a49a05e9738357ccbfc2a922f01;hp=d4fcf800d9c30d71af8f7318e70a98b9f58bb7be;hpb=2029c5e4220e0809a39744a28ca9e2ff22e8ad28;p=r2c2.git diff --git a/source/libmarklin/route.cpp b/source/libmarklin/route.cpp index d4fcf80..daa044f 100644 --- a/source/libmarklin/route.cpp +++ b/source/libmarklin/route.cpp @@ -10,6 +10,7 @@ Distributed under the GPL #include "layout.h" #include "route.h" #include "track.h" +#include "trackiter.h" #include "tracktype.h" using namespace std; @@ -88,7 +89,7 @@ list dijkstra(Track &from, unsigned ep, const Pred &goal) } const TrackType &type = lowest.track->get_type(); - const vector &eps = type.get_endpoints(); + const vector &eps = type.get_endpoints(); const vector &links = lowest.track->get_links(); for(unsigned i=0; i dijkstra(Track &from, unsigned ep, const Pred &goal) } } - if(!final) - throw InvalidParameterValue("Could not find a route"); - list result; for(Node *node=final; node; node=node->prev) result.push_front(node->track); @@ -124,6 +122,9 @@ Route *create_route(Track &from, unsigned ep, const Pred &goal) { list tracks = dijkstra(from, ep, goal); + if(tracks.empty()) + return 0; + Route *route = new Route(from.get_layout()); for(list::iterator i=tracks.begin(); i!=tracks.end(); ++i) route->add_track(**i); @@ -183,7 +184,7 @@ void Route::update_turnouts() { found.insert(tid); - const vector &endpoints = (*i)->get_type().get_endpoints(); + const vector &endpoints = (*i)->get_type().get_endpoints(); const vector &links = (*i)->get_links(); // Build a combined path mask from linked endpoints @@ -195,7 +196,7 @@ void Route::update_turnouts() if(unsigned tid2 = links[j]->get_turnout_id()) { - const Endpoint &ep = links[j]->get_type().get_endpoints()[links[j]->get_endpoint_by_link(**i)]; + const TrackType::Endpoint &ep = links[j]->get_type().get_endpoints()[links[j]->get_endpoint_by_link(**i)]; int p = get_turnout(tid2); if(p>=0 && !(ep.paths&(1< &trks) void Route::add_track_chain(Track &start, unsigned ep, const TurnoutMap &trnts) { - Track *track = &start; - while(1) + TrackIter iter(&start, ep); + while(iter) { - if(track->get_type().is_dead_end()) + if(iter->get_type().is_dead_end()) break; - if(tracks.count(track)) + if(has_track(*iter)) break; int path = 0; - if(track->get_turnout_id()) + if(iter->get_turnout_id()) { - TurnoutMap::const_iterator i = trnts.find(track->get_turnout_id()); + TurnoutMap::const_iterator i = trnts.find(iter->get_turnout_id()); if(i==trnts.end()) break; path = i->second; } - add_track(*track); + add_track(*iter); - unsigned out_ep = track->traverse(ep, path); - Track *next = track->get_links()[out_ep]; - if(!next) - break; - - ep = next->get_endpoint_by_link(*track); - track = next; + iter = iter.next(path); } } @@ -338,7 +333,7 @@ unsigned Route::check_validity(Track &trk) const { // Linked to an existing track - good result |= 1; - const vector &endpoints = (*i)->get_type().get_endpoints(); + const vector &endpoints = (*i)->get_type().get_endpoints(); if(unsigned tid=(*i)->get_turnout_id()) { int r = get_turnout(tid); @@ -422,7 +417,7 @@ void Route::Loader::finish() continue; unsigned path_mask = 1<second; - const vector &eps = (*i)->get_type().get_endpoints(); + const vector &eps = (*i)->get_type().get_endpoints(); for(unsigned k=0; k