3 This file is part of the MSP Märklin suite
4 Copyright © 2010 Mikkosoft Productions, Mikko Rasa
5 Distributed under the GPL
8 #include <msp/core/except.h>
10 #include "blockiter.h"
12 #include "trackiter.h"
19 BlockIter::BlockIter():
24 BlockIter::BlockIter(Block *b, unsigned e):
28 if(_block && _entry>_block->get_endpoints().size())
29 throw InvalidParameterValue("Endpoint index not valid for block");
32 TrackIter BlockIter::track_iter() const
37 const Block::Endpoint &ep = _block->get_endpoints()[_entry];
38 return TrackIter(ep.track, ep.track_ep);
41 int BlockIter::get_exit(const Route *route) const
43 const vector<Block::Endpoint> &eps = _block->get_endpoints();
44 TrackIter t_iter = track_iter();
48 if(!_block->has_track(*t_iter))
49 throw LogicError("Block traversal strayed out of the block");
52 if(t_iter->get_turnout_id() && route)
53 path = route->get_turnout(t_iter->get_turnout_id());
55 path = t_iter->get_active_path();
57 TrackIter t_exit = t_iter.reverse(path);
59 for(unsigned i=0; i<eps.size(); ++i)
60 if(eps[i].track==t_exit.track() && eps[i].track_ep==t_exit.entry())
63 t_iter = t_iter.next(path);
69 BlockIter BlockIter::next(const Route *route) const
74 int exit = get_exit(route);
79 result._block = _block->get_link(exit);
80 result._entry = (result._block ? result._block->get_endpoint_by_link(*_block) : 0);
85 BlockIter BlockIter::reverse(const Route *route) const
90 int exit = get_exit(route);
94 return BlockIter(_block, exit);
97 BlockIter BlockIter::flip() const
103 result._block = _block->get_link(_entry);
104 result._entry = (result._block ? result._block->get_endpoint_by_link(*_block) : 0);
109 Block &BlockIter::operator*() const
112 throw InvalidState("BlockIter is null");
117 bool BlockIter::operator==(const BlockIter &other) const
119 return _block==other._block && _entry==other._entry;
122 } // namespace Marklin