X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Ftrackiter.cpp;h=b98022862dd903c25779c507f5f2dfc540199e5b;hb=9b05c573a38639827697fe393d55b7c76f5bde45;hp=e8b327b0a245fd20ef1565960228d5c45de36f0e;hpb=2bb6ce8ada216c0b2caa48f4639d03f2c581098e;p=r2c2.git diff --git a/source/libmarklin/trackiter.cpp b/source/libmarklin/trackiter.cpp index e8b327b..b980228 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" @@ -28,9 +29,17 @@ TrackIter::TrackIter(Track *t, unsigned e): throw InvalidParameterValue("Endpoint index not valid for track"); } +const TrackType::Endpoint &TrackIter::endpoint() const +{ + if(!_track) + throw InvalidState("TrackIter is null"); + + return _track->get_type().get_endpoint(_entry); +} + int TrackIter::get_exit(unsigned path) const { - const vector &eps = _track->get_type().get_endpoints(); + const vector &eps = _track->get_type().get_endpoints(); // Find an endpoint that's connected to the entry and has the requested path for(unsigned i=0; iinsert(_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