X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Ftrackiter.cpp;h=64d223e21cc3ce6142061ab7efc670e3fbd715f5;hb=66c2c7ca5a4bd369293959bc211b040834343381;hp=c5663f29dfe23f26b50e865264921ce4073d7db7;hpb=d15ac13f2e170f155b4bbd124df48400c339b644;p=r2c2.git diff --git a/source/libr2c2/trackiter.cpp b/source/libr2c2/trackiter.cpp index c5663f2..64d223e 100644 --- a/source/libr2c2/trackiter.cpp +++ b/source/libr2c2/trackiter.cpp @@ -1,5 +1,5 @@ #include -#include +#include "blockiter.h" #include "track.h" #include "trackiter.h" #include "tracktype.h" @@ -19,13 +19,47 @@ TrackIter::TrackIter(Track *t, unsigned e): _entry(t ? e : 0) { if(_track && _entry>_track->get_type().get_endpoints().size()) - throw InvalidParameterValue("Endpoint index not valid for track"); + throw out_of_range("TrackIter::TrackIter"); +} + +BlockIter TrackIter::block_iter() const +{ + if(!_track) + return BlockIter(); + + Block &block = _track->get_block(); + const vector &beps = block.get_endpoints(); + + if(_track->get_type().is_turnout()) + { + /* A turnouts is the only track in its block. Go ahead and find the + matching endpoint in the block. */ + for(unsigned i=0; iget_block()==&block) + { + TrackIter fwd = rev.reverse(); + + for(unsigned i=0; iget_type().get_endpoint(_entry); } @@ -101,7 +135,7 @@ TrackIter TrackIter::flip() const Track &TrackIter::operator*() const { if(!_track) - throw InvalidState("TrackIter is null"); + throw logic_error("null track"); return *_track; }