X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Fblock.cpp;h=e8e367f7255715dc3c7ac2343763ae7da11021bf;hb=9b05c573a38639827697fe393d55b7c76f5bde45;hp=952fe50d56adc538ad6f4e8cab526cb815485a33;hpb=2bb6ce8ada216c0b2caa48f4639d03f2c581098e;p=r2c2.git diff --git a/source/libmarklin/block.cpp b/source/libmarklin/block.cpp index 952fe50..e8e367f 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); @@ -85,6 +84,14 @@ bool Block::has_track(Track &t) const return tracks.count(&t); } +const Block::Endpoint &Block::get_endpoint(unsigned i) const +{ + if(i>=endpoints.size()) + throw InvalidParameterValue("Endpoint index out of range"); + + return endpoints[i]; +} + int Block::get_endpoint_by_link(Block &other) const { for(unsigned i=0; iget_turnout_id() && route) - path = route->get_turnout(t_iter->get_turnout_id()); - if(path==-1) - path = t_iter->get_active_path(); - + unsigned path = (route ? route->get_path(*t_iter) : t_iter->get_active_path()); result += t_iter->get_type().get_path_length(path); t_iter = t_iter.next(path); @@ -167,28 +169,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.endpoint().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()