]> git.tdb.fi Git - r2c2.git/commitdiff
Consider failed track or block traversal a fatal error
authorMikko Rasa <tdb@tdb.fi>
Sun, 20 Dec 2009 00:30:50 +0000 (00:30 +0000)
committerMikko Rasa <tdb@tdb.fi>
Sun, 20 Dec 2009 00:30:50 +0000 (00:30 +0000)
source/libmarklin/block.cpp
source/libmarklin/block.h
source/libmarklin/track.cpp
source/libmarklin/track.h

index 9a9164ea292770380548aea3a2c517ac4fbe327d..e9c170c1ccb7140911666f3ca3704892a440af90 100644 (file)
@@ -68,7 +68,7 @@ int Block::get_endpoint_by_link(const Block &other) const
        return -1;
 }
 
-int Block::traverse(unsigned epi, float *len) const
+unsigned Block::traverse(unsigned epi, float *len) const
 {
        if(epi>=endpoints.size())
                throw InvalidParameterValue("Endpoint index out of range");
@@ -93,17 +93,14 @@ int Block::traverse(unsigned epi, float *len) const
                if(len)
                        *len += track->get_type().get_path_length(cur_path);
 
-               int other_ep = track->traverse(track_ep, cur_path);
-               if(other_ep<0)
-                       return -1;
-
+               unsigned other_ep = track->traverse(track_ep, cur_path);
                for(unsigned i=0; i<endpoints.size(); ++i)
                        if(endpoints[i].track==track && endpoints[i].track_ep==static_cast<unsigned>(other_ep))
                                return i;
 
                Track *next = track->get_link(other_ep);
-               if(tracks.count(next)==0)
-                       return -1;
+               if(!tracks.count(next))
+                       throw LogicError("Block traversal strayed out of the block");
                track_ep = next->get_endpoint_by_link(*track);
                track = next;
        }
index 64f02e50b7babe2242de6dd9d023b0e1075862f9..7c0f8ac2aff063f1c4bee3558df8119a3cb4cb49 100644 (file)
@@ -47,7 +47,7 @@ public:
        const std::set<Track *> &get_tracks() const { return tracks; }
        const std::vector<Endpoint> &get_endpoints() const { return endpoints; }
        int get_endpoint_by_link(const Block &) const;
-       int traverse(unsigned, float * =0) const;
+       unsigned traverse(unsigned, float * =0) const;
        void check_link(Block &);
        Block *get_link(unsigned) const;
        bool reserve(const Train *);
index 6c72c469a7540972f540e029d68bece473963c09..3c2a410fa9d55bf2ab131985a76f7ea4266d4f1c 100644 (file)
@@ -223,7 +223,7 @@ Track *Track::get_link(unsigned i) const
        return links[i];
 }
 
-int Track::traverse(unsigned i, unsigned path) const
+unsigned Track::traverse(unsigned i, unsigned path) const
 {
        const vector<Endpoint> &eps = type.get_endpoints();
        if(i>=eps.size())
@@ -246,7 +246,7 @@ int Track::traverse(unsigned i, unsigned path) const
                                return j;
        }
 
-       return -1;
+       throw Exception("Track endpoint did not have a counterpart");
 }
 
 Point Track::get_point(unsigned epi, unsigned path, float d) const
index b000e346bf0b4943fc96b5f66733c9c24f109a51..21c505fb9ae12c180ed955e632aab989d0684b03 100644 (file)
@@ -71,7 +71,7 @@ public:
        void break_links();
        const std::vector<Track *> &get_links() const { return links; }
        Track *get_link(unsigned) const;
-       int traverse(unsigned, unsigned) const;
+       unsigned traverse(unsigned, unsigned) const;
        Point get_point(unsigned, unsigned, float) const;
 
        /**