]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trackoffsetiter.cpp
Make sure TrackOffsetIters make sense
[r2c2.git] / source / libr2c2 / trackoffsetiter.cpp
index a6145690cb078c5277b6601cd1c25578dbf82491..9676985b5b971a659bb6918c95c40f3d1f4bc5e5 100644 (file)
@@ -24,35 +24,60 @@ 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
 {
        return _track.block_iter();
 }
 
-TrackPoint TrackOffsetIter::point() const
+OrientedPoint TrackOffsetIter::point() const
 {
        if(!_track)
-               return TrackPoint();
+               return OrientedPoint();
 
        if(_path>=0)
                return _track->get_point(_track.entry(), _path, _offset);
@@ -91,13 +116,7 @@ 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());
 
                float length = t->get_type().get_path_length(p);
                if(o<length)
@@ -118,6 +137,9 @@ TrackOffsetIter TrackOffsetIter::reverse() const
 
        int p = (_path>=0 ? _path : _track->get_active_path());
        TrackIter t = _track.reverse(p);
+       if(!t)
+               return TrackOffsetIter();
+
        float o = t->get_type().get_path_length(p)-_offset;
 
        return TrackOffsetIter(t, p, o);