]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/trackoffsetiter.h
Create another track iterator class that holds an offset as well
[r2c2.git] / source / libr2c2 / trackoffsetiter.h
diff --git a/source/libr2c2/trackoffsetiter.h b/source/libr2c2/trackoffsetiter.h
new file mode 100644 (file)
index 0000000..27b424e
--- /dev/null
@@ -0,0 +1,54 @@
+#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