2 #include <msp/core/except.h>
12 TrackIter::TrackIter():
17 TrackIter::TrackIter(Track *t, unsigned e):
21 if(_track && _entry>_track->get_type().get_endpoints().size())
22 throw InvalidParameterValue("Endpoint index not valid for track");
25 const TrackType::Endpoint &TrackIter::endpoint() const
28 throw InvalidState("TrackIter is null");
30 return _track->get_type().get_endpoint(_entry);
33 int TrackIter::get_exit(unsigned path) const
35 const vector<TrackType::Endpoint> &eps = _track->get_type().get_endpoints();
37 // Find an endpoint that's connected to the entry and has the requested path
38 for(unsigned i=0; i<eps.size(); ++i)
39 if(i!=_entry && (eps[i].paths&(1<<path)) && (eps[i].paths&eps[_entry].paths))
45 TrackIter TrackIter::next() const
50 return next(_track->get_active_path());
53 TrackIter TrackIter::next(unsigned path) const
58 int exit = get_exit(path);
63 result._track = _track->get_link(exit);
64 result._entry = (result._track ? result._track->get_endpoint_by_link(*_track) : 0);
69 TrackIter TrackIter::reverse() const
74 return reverse(_track->get_active_path());
77 TrackIter TrackIter::reverse(unsigned path) const
82 int exit = get_exit(path);
86 return TrackIter(_track, exit);
89 TrackIter TrackIter::flip() const
95 result._track = _track->get_link(_entry);
96 result._entry = (result._track ? result._track->get_endpoint_by_link(*_track) : 0);
101 Track &TrackIter::operator*() const
104 throw InvalidState("TrackIter is null");
109 bool TrackIter::operator==(const TrackIter &other) const
111 return _track==other._track && _entry==other._entry;
115 TrackLoopIter::TrackLoopIter():
119 TrackLoopIter::TrackLoopIter(Track *t, unsigned e):
121 _visited(new TrackList()),
122 _last(_visited->insert(_visited->end(), track())),
126 TrackLoopIter::TrackLoopIter(const TrackIter &i):
128 _visited(new TrackList()),
129 _last(_visited->insert(_visited->end(), track())),
133 TrackLoopIter::TrackLoopIter(const TrackIter &i, RefPtr<TrackList> v, const TrackList::iterator &l):
141 _looped = (_visited && find(_visited->begin(), _last, track())!=_last);
144 if(_last!=_visited->end())
146 _visited = new TrackList(_visited->begin(), _last);
147 _last = _visited->end();
149 _visited->push_back(track());
154 TrackLoopIter TrackLoopIter::next() const
156 return TrackLoopIter(TrackIter::next(), _visited, _last);
159 TrackLoopIter TrackLoopIter::next(unsigned path) const
161 return TrackLoopIter(TrackIter::next(path), _visited, _last);