+ sort(result.begin(), result.end(), zone_order);
+
+ return result;
+}
+
+Zone &Layout::get_zone(const string &group, unsigned num) const
+{
+ for(ZoneSet::const_iterator i=zones.begin(); i!=zones.end(); ++i)
+ if((*i)->get_group()==group && (*i)->get_number()==num)
+ return **i;
+
+ throw key_error(format("%s %d", group, num));
+}
+
+void Layout::remove_zone(Zone &z)
+{
+ if(zones.erase(&z))
+ signal_zone_removed.emit(z);
+}
+
+void Layout::add_train(Train &t)
+{
+ insert_unique(trains, t.get_address(), &t);