X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Fblock.cpp;h=b9b65ad710dca9dd833177ee993b31562c3c4b5b;hb=e392d397f6b86a49a05e9738357ccbfc2a922f01;hp=02b6da5c7203dffaf346e4ad3690a0c77b1d2bee;hpb=45ec6f645ff2c303700711e96421c75acf33db1a;p=r2c2.git diff --git a/source/libmarklin/block.cpp b/source/libmarklin/block.cpp index 02b6da5..b9b65ad 100644 --- a/source/libmarklin/block.cpp +++ b/source/libmarklin/block.cpp @@ -56,8 +56,7 @@ Block::Block(Layout &l, Track &start): { unsigned path = 1< visited; - find_paths(*endpoints[i].track, endpoints[i].track_ep, path, visited); + find_paths(TrackIter(endpoints[i].track, endpoints[i].track_ep), path); } layout.add_block(*this); @@ -167,28 +166,25 @@ bool Block::reserve(Train *t) return false; } -void Block::find_paths(Track &track, unsigned track_ep, unsigned path, set &visited) +void Block::find_paths(TrackIter track, unsigned path) { - visited.insert(&track); - - const vector &eps = track.get_type().get_endpoints(); - for(unsigned i=0; iget_endpoint_by_link(track), path, visited); - else + unsigned mask = track->get_type().get_endpoints()[track.entry()].paths; + for(unsigned i=0; mask>>i; ++i) + if(mask&(1<::iterator j=endpoints.begin(); j!=endpoints.end(); ++j) - if(j->track==&track && j->track_ep==i) - j->paths |= path; + TrackIter next = track.next(i); + if(!next) + continue; + else if(has_track(*next)) + find_paths(track.next(i), path); + else + { + next = next.flip(); + for(vector::iterator j=endpoints.begin(); j!=endpoints.end(); ++j) + if(j->track==next.track() && j->track_ep==next.entry()) + j->paths |= path; + } } - } } void Block::determine_id()