X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Ftrackoffsetiter.cpp;h=8f21e950a5e3de4dfa3cfa5b1462b455cf90c9bb;hb=d6516b0d9faa26fe6c64000c34f8d820f91ac479;hp=a6145690cb078c5277b6601cd1c25578dbf82491;hpb=0443ca05cbd306487131f5f5bd3b91181ae4a733;p=r2c2.git diff --git a/source/libr2c2/trackoffsetiter.cpp b/source/libr2c2/trackoffsetiter.cpp index a614569..8f21e95 100644 --- a/source/libr2c2/trackoffsetiter.cpp +++ b/source/libr2c2/trackoffsetiter.cpp @@ -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,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=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);