+ TrackIter iter = get_end(preferred_dir).reverse();
+ while(iter && tracks.count(iter.track()))
+ {
+ iter->set_preferred_exit(iter.entry());
+ iter = next_iter(iter);
+ }
+ }
+ else
+ {
+ for(TrackSet::iterator i=tracks.begin(); i!=tracks.end(); ++i)
+ (*i)->set_preferred_exit(-1);
+ }
+}
+
+void Zone::clear_direction()
+{
+ up_end = -1;
+ preferred_dir = UNSPECIFIED;
+}
+
+TrackIter Zone::iter_for(Track &track, Direction dir) const
+{
+ if(!tracks.count(&track))
+ return TrackIter();
+ else if(dir==UNSPECIFIED)
+ return TrackIter(&track, 0);
+ else if(up_end<0)
+ return TrackIter();