+ for(list<Variant>::const_iterator i=caches.begin(); i!=caches.end(); ++i)
+ if(i->check_type<set<T *> >())
+ return i->value<set<T *> >();
+
+ caches.push_back(set<T *>());
+ set<T *> &result = caches.back().value<set<T *> >();
+ for(typename set<B *>::const_iterator i=base.begin(); i!=base.end(); ++i)
+ if(T *t = dynamic_cast<T *>(*i))
+ result.insert(t);
+
+ return result;
+}
+
+template<typename B>
+template<typename T>
+void Layout::Storage<B>::del()
+{
+ set<T *> ts = get<T>();
+ for(typename set<T *>::iterator i=ts.begin(); i!=ts.end(); ++i)
+ if(base.count(*i))
+ delete *i;
+}
+
+
+Layout::Loader::Loader(Layout &l):
+ DataFile::ObjectLoader<Layout>(l),
+ new_tracks(false)
+{
+ add("base", &Layout::base);
+ add("route", &Loader::route);
+ add("signal", &Loader::signal);
+ add("track", &Loader::track);
+ add("train", &Loader::train);
+ add("turnout", &Loader::turnout);
+ add("zone", &Loader::zone);