]> git.tdb.fi Git - r2c2.git/blobdiff - source/libmarklin/trackiter.h
Add some shortcut functions for getting endpoints
[r2c2.git] / source / libmarklin / trackiter.h
index c91a7689b1ffa4bdd29303da46036d2c4659eee2..e2f1d85dfde9e682cc0d3a7b2f555bdd0d0313d9 100644 (file)
@@ -10,6 +10,7 @@ Distributed under the GPL
 
 #include <set>
 #include <msp/core/refptr.h>
+#include "tracktype.h"
 
 namespace Marklin {
 
@@ -30,6 +31,7 @@ public:
 
        Track *track() const { return _track; }
        unsigned entry() const { return _entry; }
+       const TrackType::Endpoint &endpoint() const;
 
 private:
        int get_exit(unsigned) const;
@@ -43,9 +45,41 @@ public:
        Track &operator*() const;
        Track *operator->() const { return _track; }
        bool operator==(const TrackIter &) const;
+       bool operator!=(const TrackIter &other) const { return !(*this==other); }
        operator bool() const { return _track!=0; }
 };
 
+
+/**
+A track iterator that detects looping.
+
+A list of visited tracks is maintained internally to the iterator.  This list
+is shared between iterators as long as next() is only called once per iterator.
+Subsequent calls to next() cause the head of the list to be copied.
+*/
+class TrackLoopIter: public TrackIter
+{
+private:
+       typedef std::list<Track *> TrackList;
+
+       Msp::RefPtr<TrackList> _visited;
+       TrackList::iterator _last;
+       bool _looped;
+
+public:
+       TrackLoopIter();
+       TrackLoopIter(Track *, unsigned);
+       TrackLoopIter(const TrackIter &);
+private:
+       TrackLoopIter(const TrackIter &, Msp::RefPtr<TrackList>, const TrackList::iterator &);
+
+public:
+       bool looped() const { return _looped; }
+
+       TrackLoopIter next() const;
+       TrackLoopIter next(unsigned) const;
+};
+
 } // namespace Marklin
 
 #endif