+Train::BlockRef::BlockRef(Block *b, unsigned e):
+ block(b),
+ entry(e)
+{ }
+
+Train::BlockRef Train::BlockRef::next() const
+{
+ Block *blk = block->get_endpoints()[block->traverse(entry)].link;
+ if(!blk)
+ throw InvalidState("At end of line");
+
+ int ep = blk->get_endpoint_by_link(*block);
+ if(ep<0)
+ throw LogicError("Block links are inconsistent");
+
+ return BlockRef(blk, ep);
+}
+
+