]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trackiter.cpp
Add a function to get a BlockIter from a TrackIter
[r2c2.git] / source / libr2c2 / trackiter.cpp
index c636d27c84cef8a30d6c700bb6fd454c9d49c9e0..64d223e21cc3ce6142061ab7efc670e3fbd715f5 100644 (file)
@@ -1,4 +1,5 @@
 #include <algorithm>
+#include "blockiter.h"
 #include "track.h"
 #include "trackiter.h"
 #include "tracktype.h"
@@ -21,6 +22,40 @@ TrackIter::TrackIter(Track *t, unsigned e):
                throw out_of_range("TrackIter::TrackIter");
 }
 
+BlockIter TrackIter::block_iter() const
+{
+       if(!_track)
+               return BlockIter();
+
+       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
+       {
+               TrackIter rev = reverse();
+               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);
+
+                       rev = rev.next();
+               }
+       }
+
+       throw logic_error("internal error (didn't find block entry endpoint)");
+}
+
 const TrackType::Endpoint &TrackIter::endpoint() const
 {
        if(!_track)