]> git.tdb.fi Git - r2c2.git/blobdiff - source/libmarklin/layout.cpp
Support more complex article numbers
[r2c2.git] / source / libmarklin / layout.cpp
index f1bc3211bab00b5a8e6d4403f8d0ad3607694834..25568d6e6fb23d51e86ad003cf36d12c466314b9 100644 (file)
@@ -75,9 +75,16 @@ void Layout::remove_track(Track &t)
 
 unsigned Layout::allocate_turnout_id(bool dbl)
 {
-       unsigned result = next_turnout_id++;
-       if(dbl)
-               ++next_turnout_id;
+       set<unsigned> used_ids;
+       for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
+               if((*i)->get_turnout_id())
+                       used_ids.insert((*i)->get_turnout_id());
+
+       unsigned result = next_turnout_id;
+       while(used_ids.count(result) || (dbl && used_ids.count(result+1)))
+               ++result;
+       next_turnout_id = result+1+dbl;
+
        return result;
 }
 
@@ -289,8 +296,10 @@ Layout::Loader::Loader(Layout &l):
        add("base",  &Layout::base);
        add("route", static_cast<void (Loader::*)()>(&Loader::route));
        add("route", static_cast<void (Loader::*)(const string &)>(&Loader::route));
-       add("track", &Loader::track);
-       add("train", &Loader::train);
+       add("track", static_cast<void (Loader::*)(unsigned)>(&Loader::track));
+       add("track", static_cast<void (Loader::*)(ArticleNumber)>(&Loader::track));
+       add("train", static_cast<void (Loader::*)(unsigned, unsigned)>(&Loader::train));
+       add("train", static_cast<void (Loader::*)(ArticleNumber, unsigned)>(&Loader::train));
 }
 
 void Layout::Loader::finish()
@@ -313,6 +322,11 @@ void Layout::Loader::route(const string &n)
 }
 
 void Layout::Loader::track(unsigned art_nr)
+{
+       track(ArticleNumber(art_nr));
+}
+
+void Layout::Loader::track(ArticleNumber art_nr)
 {
        Track *trk = new Track(obj, obj.catalogue.get_track(art_nr));
        load_sub(*trk);
@@ -323,6 +337,11 @@ void Layout::Loader::track(unsigned art_nr)
 }
 
 void Layout::Loader::train(unsigned art_nr, unsigned addr)
+{
+       train(ArticleNumber(art_nr), addr);
+}
+
+void Layout::Loader::train(ArticleNumber art_nr, unsigned addr)
 {
        Train *trn = new Train(obj, obj.catalogue.get_vehicle(art_nr), addr);
        load_sub(*trn);