]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/trackoffsetiter.h
Make sure TrackOffsetIters make sense
[r2c2.git] / source / libr2c2 / trackoffsetiter.h
1 #ifndef LIBR2C2_TRACKOFFSETITER_H_
2 #define LIBR2C2_TRACKOFFSETITER_H_
3
4 #include <stdexcept>
5 #include "trackiter.h"
6
7 namespace R2C2 {
8
9 class incompatible_path: public std::logic_error
10 {
11 public:
12         incompatible_path(unsigned, unsigned);
13         virtual ~incompatible_path() throw() { }
14 };
15
16 class Route;
17
18 class TrackOffsetIter
19 {
20 private:
21         TrackIter _track;
22         float _offset;
23         int _path;
24
25 public:
26         TrackOffsetIter();
27         TrackOffsetIter(Track *, unsigned, float = 0);
28         TrackOffsetIter(Track *, unsigned, unsigned, float);
29         TrackOffsetIter(const TrackIter &, float = 0);
30         TrackOffsetIter(const TrackIter &, unsigned, float);
31
32 private:
33         void validate();
34
35 public:
36         Track *track() const { return _track.track(); }
37         unsigned entry() const { return _track.entry(); }
38         const TrackIter &track_iter() const { return _track; }
39         BlockIter block_iter() const;
40         float offset() const { return _offset; }
41
42         OrientedPoint point() const;
43
44         TrackOffsetIter next() const;
45         TrackOffsetIter next(unsigned) const;
46         TrackOffsetIter advance(float, const Route * = 0) const;
47         TrackOffsetIter reverse() const;
48
49         Track &operator*() const { return *_track; }
50         Track *operator->() const { return _track.operator->(); }
51         bool operator==(const TrackOffsetIter &) const;
52         bool operator!=(const TrackOffsetIter &other) const { return !(*this==other); }
53         operator bool() const { return _track; }
54 };
55
56 } // namespace R2C2
57
58 #endif