X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Ftrackiter.cpp;fp=source%2Flibmarklin%2Ftrackiter.cpp;h=5f633997cc26e3dcdf0ac0354946325928f77377;hb=0aa9573079f6dbde549602e9d73980123c981b72;hp=6ee7231f924ebc9ab953f22c6ca922db81d010e4;hpb=bf17b58ef9013147c616ee4efbd31a4973728e7f;p=r2c2.git diff --git a/source/libmarklin/trackiter.cpp b/source/libmarklin/trackiter.cpp index 6ee7231..5f63399 100644 --- a/source/libmarklin/trackiter.cpp +++ b/source/libmarklin/trackiter.cpp @@ -5,6 +5,7 @@ Copyright © 2010 Mikkosoft Productions, Mikko Rasa Distributed under the GPL */ +#include #include #include "track.h" #include "trackiter.h" @@ -109,4 +110,54 @@ bool TrackIter::operator==(const TrackIter &other) const return _track==other._track && _entry==other._entry; } + +TrackLoopIter::TrackLoopIter(): + _looped(false) +{ } + +TrackLoopIter::TrackLoopIter(Track *t, unsigned e): + TrackIter(t, e), + _visited(new TrackList()), + _last(_visited->insert(_visited->end(), track())), + _looped(false) +{ } + +TrackLoopIter::TrackLoopIter(const TrackIter &i): + TrackIter(i), + _visited(new TrackList()), + _last(_visited->insert(_visited->end(), track())), + _looped(false) +{ } + +TrackLoopIter::TrackLoopIter(const TrackIter &i, RefPtr v, const TrackList::iterator &l): + TrackIter(i), + _looped(false) +{ + if(track()) + { + _visited = v; + _last = l; + _looped = (_visited && find(_visited->begin(), _last, track())!=_last); + + ++_last; + if(_last!=_visited->end()) + { + _visited = new TrackList(_visited->begin(), _last); + _last = _visited->end(); + } + _visited->push_back(track()); + --_last; + } +} + +TrackLoopIter TrackLoopIter::next() const +{ + return TrackLoopIter(TrackIter::next(), _visited, _last); +} + +TrackLoopIter TrackLoopIter::next(unsigned path) const +{ + return TrackLoopIter(TrackIter::next(path), _visited, _last); +} + } // namespace Marklin