From: Mikko Rasa Date: Sat, 23 Feb 2013 10:44:29 +0000 (+0200) Subject: Add utility functions to make endpoint path mask operations clearer X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=e621dd4120cb253417167b4295e436cee095ccb0;p=r2c2.git Add utility functions to make endpoint path mask operations clearer --- diff --git a/source/libr2c2/route.cpp b/source/libr2c2/route.cpp index be2eefc..795ae32 100644 --- a/source/libr2c2/route.cpp +++ b/source/libr2c2/route.cpp @@ -198,7 +198,7 @@ void Route::update_turnouts() { const TrackType::Endpoint &ep = links[j]->get_type().get_endpoint(links[j]->get_endpoint_by_link(**i)); int p = get_turnout(tid2); - if(p>=0 && !(ep.paths&(1<=0 && !ep.has_path(p)) { // The linked track is a turnout and has a path which is incompatible with this endpoint mask &= ~endpoints[j].paths; @@ -350,7 +350,7 @@ RouteValidityMask Route::check_validity(Track &trk) const if(path>=0) { // Linking to a turnout with path set is only good if we're continuing that path - if(ep.paths&(1<get_type().get_endpoint(tlinks[j]->get_endpoint_by_link(**i)); path = get_turnout(tid2); // Ignore a linked turnout with some other path set - if(path>=0 && !(ep2.paths&(1<=0 && !ep2.has_path(path)) continue; } ++count; const TrackType::Endpoint &ep2 = (*i)->get_type().get_endpoint(j); - if(!(ep.paths&ep2.paths)) + if(!ep.has_common_paths(ep2)) // Impossible path through the turnout - not good result &= ~ROUTE_SMOOTH; } @@ -438,10 +438,9 @@ void Route::Loader::finish() if(j==turnouts.end()) continue; - unsigned path_mask = 1<second; const vector &eps = (*i)->get_type().get_endpoints(); for(unsigned k=0; ksecond)) { Track *link = (*i)->get_link(k); if(!obj.tracks.count(link)) diff --git a/source/libr2c2/trackiter.cpp b/source/libr2c2/trackiter.cpp index 64d223e..edb0d73 100644 --- a/source/libr2c2/trackiter.cpp +++ b/source/libr2c2/trackiter.cpp @@ -70,7 +70,7 @@ int TrackIter::get_exit(unsigned path) const // Find an endpoint that's connected to the entry and has the requested path for(unsigned i=0; i::const_iterator i=parts.begin(); i!=parts.end(); ++i) { - if((endpoints[epi].paths&(1<get_path()!=path) + if(endpoints[epi].has_path(path) && i->get_path()!=path) continue; unsigned n_part_eps = (i->is_dead_end() ? 1 : 2); diff --git a/source/libr2c2/tracktype.h b/source/libr2c2/tracktype.h index a292e55..dd2a7c4 100644 --- a/source/libr2c2/tracktype.h +++ b/source/libr2c2/tracktype.h @@ -18,6 +18,9 @@ public: unsigned paths; Endpoint(float, float, float, unsigned); + + bool has_path(unsigned p) const { return paths&(1< diff --git a/source/libr2c2/train.cpp b/source/libr2c2/train.cpp index a45675c..eb1133a 100644 --- a/source/libr2c2/train.cpp +++ b/source/libr2c2/train.cpp @@ -674,7 +674,7 @@ void Train::reserve_more() else if(&*start==pending_block) { TrackIter track = start.track_iter(); - if(!(track.endpoint().paths&(1<get_active_path()))) + if(!track.endpoint().has_path(track->get_active_path())) return; } @@ -736,11 +736,12 @@ void Train::reserve_more() { const TrackType::Endpoint &entry_ep = track.endpoint(); unsigned path = track->get_active_path(); - if(!(entry_ep.paths&(1<1; ++path, mask>>=1) ; track->set_active_path(path);