+void Zone::set_direction_towards(Track &track, Direction dir)
+{
+ if(dir==UNSPECIFIED)
+ throw invalid_argument("Zone::set_direction_towards");
+ if(tracks.empty())
+ throw logic_error("no tracks");
+ if(tracks.count(&track))
+ throw invalid_argument("Zone::set_direction_towards");
+
+ Validity valid = check_validity(track);
+ if(valid!=VALID)
+ throw_bad_chain(valid);
+
+ for(unsigned i=0; i<2; ++i)
+ if(ends[i] && ends[i]->get_link_slot(track)>=0)
+ {
+ up_end = (dir==UP ? i : 1-i);
+ return;
+ }
+
+ throw logic_error("internal error (valid track not linked to ends)");