]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/blockiter.cpp
Clear the critical flag one track earlier
[r2c2.git] / source / libr2c2 / blockiter.cpp
index e662a92ad2020337088d1055d8850c5c0cc93620..9dcca6c68672a9392883ff4ccb4803358588a7f1 100644 (file)
@@ -26,8 +26,7 @@ TrackIter BlockIter::track_iter() const
        if(!_block)
                return TrackIter();
 
-       const Block::Endpoint &ep = _block->get_endpoint(_entry);
-       return TrackIter(ep.track, ep.track_ep);
+       return _block->get_endpoint(_entry).track_iter();
 }
 
 const Block::Endpoint &BlockIter::endpoint() const
@@ -41,24 +40,18 @@ const Block::Endpoint &BlockIter::endpoint() const
 int BlockIter::get_exit(const Route *route) const
 {
        const vector<Block::Endpoint> &eps = _block->get_endpoints();
-       TrackIter t_iter = track_iter();
-
-       while(t_iter)
+       if(_block->get_turnout_address())
        {
-               if(!_block->has_track(*t_iter))
-                       throw logic_error("internal error (block traversal escaped the block)");
-
+               /* The endpoints of a turnout block exactly correspond to the endpoints
+               of the track. */
+               TrackIter t_iter = track_iter();
                unsigned path = (route ? route->get_path(*t_iter) : t_iter->get_active_path());
-               TrackIter t_exit = t_iter.reverse(path);
-
-               for(unsigned i=0; i<eps.size(); ++i)
-                       if(eps[i].track==t_exit.track() && eps[i].track_ep==t_exit.entry())
-                               return i;
-
-               t_iter = t_exit.flip();
+               return t_iter.reverse(path).entry();
        }
-
-       return -1;
+       else if(eps.size()==2)
+               return 1-_entry;
+       else
+               return -1;
 }
 
 BlockIter BlockIter::next(const Route *route) const