]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trackoffsetiter.cpp
Use path coercion in track iterators
[r2c2.git] / source / libr2c2 / trackoffsetiter.cpp
index 01fd58042b0b5cf916551913994992671656e7d0..8f21e950a5e3de4dfa3cfa5b1462b455cf90c9bb 100644 (file)
@@ -24,25 +24,50 @@ TrackOffsetIter::TrackOffsetIter(Track *t, unsigned e, float o):
        _track(t, e),
        _offset(_track ? o : 0),
        _path((_track && _offset) ? _track->get_active_path() : -1)
-{ }
+{
+       validate();
+}
 
 TrackOffsetIter::TrackOffsetIter(Track *t, unsigned e, unsigned p, float o):
        _track(t, e),
        _offset(o),
        _path(p)
-{ }
+{
+       validate();
+}
 
 TrackOffsetIter::TrackOffsetIter(const TrackIter &t, float o):
        _track(t),
        _offset(_track ? o : 0),
        _path((_track && _offset) ? _track->get_active_path() : -1)
-{ }
+{
+       validate();
+}
 
 TrackOffsetIter::TrackOffsetIter(const TrackIter &t, unsigned p, float o):
        _track(t),
        _offset(o),
        _path(p)
-{ }
+{
+       validate();
+}
+
+void TrackOffsetIter::validate()
+{
+       if(!_track)
+               return;
+
+       if(_offset<0)
+               throw invalid_argument("TrackOffsetIter::TrackOffsetIter");
+
+       if(_path>=0)
+       {
+               if(!_track.endpoint().has_path(_path))
+                       throw invalid_argument("TrackOffsetIter::TrackOffsetIter");
+               if(_offset>_track->get_type().get_path_length(_path))
+                       throw invalid_argument("TrackOffsetIter::TrackOffsetIter");
+       }
+}
 
 BlockIter TrackOffsetIter::block_iter() const
 {
@@ -91,13 +116,8 @@ TrackOffsetIter TrackOffsetIter::advance(float d, const Route *r) const
        while(t)
        {
                if(p<0)
-               {
-                       if(r)
-                               if(unsigned tid = t->get_turnout_id())
-                                       p = r->get_turnout(tid);
-                       if(p<0)
-                               p = t->get_active_path();
-               }
+                       p = (r ? r->get_path(*t) : t->get_active_path());
+               p = t->get_type().coerce_path(t.entry(), p);
 
                float length = t->get_type().get_path_length(p);
                if(o<length)