X-Git-Url: http://git.tdb.fi/?p=r2c2.git;a=blobdiff_plain;f=source%2Flibr2c2%2Ftrainrouter.cpp;h=9befe4788c4b03114cfe4939f6ea7c02eee0fe06;hp=3d8b9d4b7b42a3c7ee3c69c84a81407232107107;hb=83c6923396fcfa42e6adf949b9476663f322748b;hpb=862d8bea6d31e6fe9a60747e0b9559f77e72bf44 diff --git a/source/libr2c2/trainrouter.cpp b/source/libr2c2/trainrouter.cpp index 3d8b9d4..9befe47 100644 --- a/source/libr2c2/trainrouter.cpp +++ b/source/libr2c2/trainrouter.cpp @@ -486,27 +486,25 @@ bool TrainRouter::create_lead_route() return true; } -bool TrainRouter::is_valid_for_track(const Route &route, const TrackIter &track) const -{ - if(!route.has_track(*track)) - return false; - if(track->get_type().is_turnout() && route.get_turnout(track->get_turnout_address())<0 && route.has_track(*track.flip())) - return false; - return true; -} - bool TrainRouter::advance_to_track(RouteList::iterator &route, const TrackIter &track) { - if(!is_valid_for_track(**route, track)) + Track &prev_track = *track.flip(); + unsigned taddr = (track->get_type().is_turnout() ? track->get_turnout_address() : 0); + for(unsigned i=0; route!=routes.end(); ++i) { - ++route; - if(route==routes.end()) - return false; - if(!is_valid_for_track(**route, track)) + bool in_route = (*route)->has_track(*track); + bool prev_in_route = (*route)->has_track(prev_track); + bool known_path = (!taddr || (*route)->get_turnout(taddr)>=0); + + if(in_route && (known_path || !prev_in_route)) + return true; + else if(i==0 || prev_in_route) + ++route; + else throw logic_error("internal error (routes are not continuous)"); } - return true; + return false; } void TrainRouter::get_routers(Layout &layout, vector &routers)