]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trackiter.cpp
Use path coercion in track iterators
[r2c2.git] / source / libr2c2 / trackiter.cpp
index 64d223e21cc3ce6142061ab7efc670e3fbd715f5..330e2f66c810bd9ee2c38cd0c6f2f1ebd14ae6d7 100644 (file)
@@ -30,27 +30,31 @@ BlockIter TrackIter::block_iter() const
        Block &block = _track->get_block();
        const vector<Block::Endpoint> &beps = block.get_endpoints();
 
-       if(_track->get_type().is_turnout())
-       {
-               /* A turnouts is the only track in its block.  Go ahead and find the
-               matching endpoint in the block. */
-               for(unsigned i=0; i<beps.size(); ++i)
-                       if(beps[i].track==_track && beps[i].track_ep==_entry)
-                               return BlockIter(&block, i);
-       }
-       else
+       // See if this track matches an endpoint in the block
+       for(unsigned i=0; i<beps.size(); ++i)
+               if(beps[i].track==_track && beps[i].track_ep==_entry)
+                       return BlockIter(&block, i);
+
+       if(!_track->get_type().is_turnout())
        {
-               TrackIter rev = reverse();
+               /* Since there was no endpoint match, the preceding track can't be in a
+               different block. */
+               TrackIter rev = flip();
+               TrackIter last;
                while(rev && &rev.track()->get_block()==&block)
                {
-                       TrackIter fwd = rev.reverse();
-
-                       for(unsigned i=0; i<beps.size(); ++i)
-                               if(beps[i].track==fwd.track() && beps[i].track_ep==fwd.entry())
-                                       return BlockIter(&block, i);
-
+                       last = rev;
                        rev = rev.next();
                }
+
+               // If we ran out of tracks, return an empty iterator
+               if(!rev)
+                       return BlockIter();
+
+               TrackIter fwd = last.reverse();
+               for(unsigned i=0; i<beps.size(); ++i)
+                       if(beps[i].track==fwd.track() && beps[i].track_ep==fwd.entry())
+                               return BlockIter(&block, i);
        }
 
        throw logic_error("internal error (didn't find block entry endpoint)");
@@ -66,11 +70,12 @@ const TrackType::Endpoint &TrackIter::endpoint() const
 
 int TrackIter::get_exit(unsigned path) const
 {
+       path = _track->get_type().coerce_path(_entry, path);
        const vector<TrackType::Endpoint> &eps = _track->get_type().get_endpoints();
        
        // Find an endpoint that's connected to the entry and has the requested path
        for(unsigned i=0; i<eps.size(); ++i)
-               if(i!=_entry && (eps[i].paths&(1<<path)) && (eps[i].paths&eps[_entry].paths))
+               if(i!=_entry && eps[i].has_path(path) && eps[i].has_common_paths(eps[_entry]))
                        return i;
 
        return -1;
@@ -95,7 +100,7 @@ TrackIter TrackIter::next(unsigned path) const
 
        TrackIter result;
        result._track = _track->get_link(exit);
-       result._entry = (result._track ? result._track->get_endpoint_by_link(*_track) : 0);
+       result._entry = (result._track ? result._track->get_link_slot(*_track) : 0);
 
        return result;
 }
@@ -127,7 +132,7 @@ TrackIter TrackIter::flip() const
 
        TrackIter result;
        result._track = _track->get_link(_entry);
-       result._entry = (result._track ? result._track->get_endpoint_by_link(*_track) : 0);
+       result._entry = (result._track ? result._track->get_link_slot(*_track) : 0);
 
        return result;
 }