1 #include <msp/strings/format.h>
6 #include "trackoffsetiter.h"
13 incompatible_path::incompatible_path(unsigned a, unsigned e):
14 logic_error(format("got %d, but %d already set", a, e))
18 TrackOffsetIter::TrackOffsetIter():
23 TrackOffsetIter::TrackOffsetIter(Track *t, unsigned e, float o):
25 _offset(_track ? o : 0),
26 _path((_track && _offset) ? _track->get_active_path() : -1)
29 TrackOffsetIter::TrackOffsetIter(Track *t, unsigned e, unsigned p, float o):
35 TrackOffsetIter::TrackOffsetIter(const TrackIter &t, float o):
37 _offset(_track ? o : 0),
38 _path((_track && _offset) ? _track->get_active_path() : -1)
41 TrackOffsetIter::TrackOffsetIter(const TrackIter &t, unsigned p, float o):
47 BlockIter TrackOffsetIter::block_iter() const
49 return _track.block_iter();
52 OrientedPoint TrackOffsetIter::point() const
55 return OrientedPoint();
58 return _track->get_point(_track.entry(), _path, _offset);
60 return _track->get_point(_track.entry(), _offset);
63 TrackOffsetIter TrackOffsetIter::next() const
66 return _track.next(_path);
71 TrackOffsetIter TrackOffsetIter::next(unsigned p) const
73 if(_path>=0 && static_cast<unsigned>(_path)!=p)
74 throw incompatible_path(_path, p);
76 return _track.next(p);
79 TrackOffsetIter TrackOffsetIter::advance(float d, const Route *r) const
82 return TrackOffsetIter();
85 return reverse().advance(-d, r).reverse();
94 p = (r ? r->get_path(*t) : t->get_active_path());
96 float length = t->get_type().get_path_length(p);
98 return TrackOffsetIter(t, p, o);
105 return TrackOffsetIter();
108 TrackOffsetIter TrackOffsetIter::reverse() const
111 return TrackOffsetIter();
113 int p = (_path>=0 ? _path : _track->get_active_path());
114 TrackIter t = _track.reverse(p);
116 return TrackOffsetIter();
118 float o = t->get_type().get_path_length(p)-_offset;
120 return TrackOffsetIter(t, p, o);
123 bool TrackOffsetIter::operator==(const TrackOffsetIter &other) const
125 return _track==other._track && _offset==other._offset && _path==other._path;