]> git.tdb.fi Git - r2c2.git/blobdiff - source/libmarklin/track.cpp
Add TrackIter and BlockIter classes
[r2c2.git] / source / libmarklin / track.cpp
index c940e1cd93d15e517f1501506e228172362aba6c..6ec3c3bf7cefc78041f3ddb357acdfb1b3fa203a 100644 (file)
@@ -6,6 +6,7 @@ Distributed under the GPL
 */
 
 #include <cmath>
+#include "block.h"
 #include "driver.h"
 #include "layout.h"
 #include "track.h"
@@ -19,6 +20,7 @@ namespace Marklin {
 Track::Track(Layout &l, const TrackType &t):
        layout(l),
        type(t),
+       block(0),
        rot(0),
        slope(0),
        flex(false),
@@ -41,6 +43,24 @@ Track::~Track()
        layout.remove_track(*this);
 }
 
+void Track::set_block(Block *b)
+{
+       if(b && !b->has_track(*this))
+               throw InvalidParameterValue("Track is not in the Block");
+       if(!b && block && block->has_track(*this))
+               throw InvalidState("Track is still in a Block");
+
+       block = b;
+}
+
+Block &Track::get_block() const
+{
+       if(!block)
+               throw InvalidState("No Block");
+
+       return *block;
+}
+
 void Track::set_position(const Point &p)
 {
        pos = p;
@@ -137,7 +157,7 @@ void Track::set_active_path(unsigned p)
                active_path = (active_path&1) | (p&2);
 }
 
-int Track::get_endpoint_by_link(const Track &other) const
+int Track::get_endpoint_by_link(Track &other) const
 {
        for(unsigned i=0; i<links.size(); ++i)
                if(links[i]==&other)
@@ -273,37 +293,6 @@ Track *Track::get_link(unsigned i) const
        return links[i];
 }
 
-unsigned Track::traverse(unsigned i, unsigned path) const
-{
-       const vector<Endpoint> &eps = type.get_endpoints();
-       if(i>=eps.size())
-               throw InvalidParameterValue("Endpoint index out of range");
-
-       const Endpoint &ep = eps[i];
-       
-       if(ep.paths&(1<<path))
-       {
-               // Find the other endpoint for this path
-               for(unsigned j=0; j<eps.size(); ++j)
-                       if((eps[j].paths&(1<<path)) && j!=i)
-                               return j;
-       }
-       else
-       {
-               // Find an endpoint that's connected to this one and has the requested path
-               for(unsigned j=0; j<eps.size(); ++j)
-                       if((eps[j].paths&(1<<path)) && (eps[j].paths&ep.paths))
-                               return j;
-       }
-
-       throw Exception("Track endpoint did not have a counterpart");
-}
-
-unsigned Track::traverse(unsigned i) const
-{
-       return traverse(i, active_path);
-}
-
 TrackPoint Track::get_point(unsigned epi, unsigned path, float d) const
 {
        TrackPoint p = type.get_point(epi, path, d);