+void Layout::remove(TrackChain &g)
+{
+ if(track_chains.erase(g))
+ signal_track_chain_removed.emit(g);
+}
+
+void Layout::remove(Sensor &s)
+{
+ sensors.erase(s);
+}
+
+void Layout::remove(BeamGate &g)
+{
+ remove(static_cast<Object &>(g));
+ remove(static_cast<Sensor &>(g));
+}
+
+unsigned Layout::allocate_turnout_address()
+{
+ set<unsigned> used_addrs;
+ const set<Track *> &tracks = objects.get<Track>();
+ for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
+ if((*i)->get_type().is_turnout())
+ used_addrs.insert((*i)->get_turnout_address());
+
+ unsigned result = next_turnout_addr;
+ while(used_addrs.count(result))
+ ++result;
+ next_turnout_addr = result+1;
+
+ return result;
+}
+