--- /dev/null
+#ifndef LIBR2C2_TRACKOFFSETITER_H_
+#define LIBR2C2_TRACKOFFSETITER_H_
+
+#include <stdexcept>
+#include "trackiter.h"
+
+namespace R2C2 {
+
+class incompatible_path: public std::logic_error
+{
+public:
+ incompatible_path(unsigned, unsigned);
+ virtual ~incompatible_path() throw() { }
+};
+
+class Route;
+
+class TrackOffsetIter
+{
+private:
+ TrackIter _track;
+ float _offset;
+ int _path;
+
+public:
+ TrackOffsetIter();
+ TrackOffsetIter(Track *, unsigned, float = 0);
+ TrackOffsetIter(Track *, unsigned, unsigned, float);
+ TrackOffsetIter(const TrackIter &, float = 0);
+ TrackOffsetIter(const TrackIter &, unsigned, float);
+
+ Track *track() const { return _track.track(); }
+ unsigned entry() const { return _track.entry(); }
+ const TrackIter &track_iter() const { return _track; }
+ BlockIter block_iter() const;
+ float offset() const { return _offset; }
+
+ TrackPoint point() const;
+
+ TrackOffsetIter next() const;
+ TrackOffsetIter next(unsigned) const;
+ TrackOffsetIter advance(float, const Route * = 0) const;
+ TrackOffsetIter reverse() const;
+
+ Track &operator*() const { return *_track; }
+ Track *operator->() const { return _track.operator->(); }
+ bool operator==(const TrackOffsetIter &) const;
+ bool operator!=(const TrackOffsetIter &other) const { return !(*this==other); }
+ operator bool() const { return _track; }
+};
+
+} // namespace R2C2
+
+#endif