11 BlockIter::BlockIter():
16 BlockIter::BlockIter(Block *b, unsigned e):
20 if(_block && _entry>_block->get_endpoints().size())
21 throw out_of_range("BlockIter::BlockIter");
24 TrackIter BlockIter::track_iter() const
29 return _block->get_endpoint(_entry).track_iter();
32 const Block::Endpoint &BlockIter::endpoint() const
35 throw logic_error("null block");
37 return _block->get_endpoint(_entry);
40 int BlockIter::get_exit(const Route *route) const
42 const vector<Block::Endpoint> &eps = _block->get_endpoints();
43 TrackIter t_iter = track_iter();
47 if(!_block->has_track(*t_iter))
48 throw logic_error("internal error (block traversal escaped the block)");
50 unsigned path = (route ? route->get_path(*t_iter) : t_iter->get_active_path());
51 TrackIter t_exit = t_iter.reverse(path);
53 for(unsigned i=0; i<eps.size(); ++i)
54 if(eps[i].track==t_exit.track() && eps[i].track_ep==t_exit.entry())
57 t_iter = t_exit.flip();
63 BlockIter BlockIter::next(const Route *route) const
68 int exit = get_exit(route);
73 result._block = _block->get_link(exit);
74 result._entry = (result._block ? result._block->get_endpoint_by_link(*_block) : 0);
79 BlockIter BlockIter::reverse(const Route *route) const
84 int exit = get_exit(route);
88 return BlockIter(_block, exit);
91 BlockIter BlockIter::flip() const
97 result._block = _block->get_link(_entry);
98 result._entry = (result._block ? result._block->get_endpoint_by_link(*_block) : 0);
103 Block &BlockIter::operator*() const
106 throw logic_error("null block");
111 bool BlockIter::operator==(const BlockIter &other) const
113 return _block==other._block && _entry==other._entry;