]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trackoffsetiter.cpp
Make sure TrackOffsetIters make sense
[r2c2.git] / source / libr2c2 / trackoffsetiter.cpp
index f8e8a2d2a4c54a5270c85a41fd5955011c2f9641..9676985b5b971a659bb6918c95c40f3d1f4bc5e5 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
 {