From 02453a447bad0ecc2a71e00b9578c9afaee0eadb Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Thu, 10 Apr 2014 22:04:03 +0300 Subject: [PATCH] Use path coercion in track iterators This enforces common traversal rules in all places. It also fixes a bug in TrackOffsetIter where moving to a turnout from an endpoint not on the selected path would potentially cause an out-of-range iterator to be created. --- source/libr2c2/trackiter.cpp | 1 + source/libr2c2/trackoffsetiter.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/source/libr2c2/trackiter.cpp b/source/libr2c2/trackiter.cpp index da949e7..330e2f6 100644 --- a/source/libr2c2/trackiter.cpp +++ b/source/libr2c2/trackiter.cpp @@ -70,6 +70,7 @@ const TrackType::Endpoint &TrackIter::endpoint() const int TrackIter::get_exit(unsigned path) const { + path = _track->get_type().coerce_path(_entry, path); const vector &eps = _track->get_type().get_endpoints(); // Find an endpoint that's connected to the entry and has the requested path diff --git a/source/libr2c2/trackoffsetiter.cpp b/source/libr2c2/trackoffsetiter.cpp index 9676985..8f21e95 100644 --- a/source/libr2c2/trackoffsetiter.cpp +++ b/source/libr2c2/trackoffsetiter.cpp @@ -117,6 +117,7 @@ TrackOffsetIter TrackOffsetIter::advance(float d, const Route *r) const { if(p<0) p = (r ? r->get_path(*t) : t->get_active_path()); + p = t->get_type().coerce_path(t.entry(), p); float length = t->get_type().get_path_length(p); if(o