]> git.tdb.fi Git - r2c2.git/blobdiff - source/libr2c2/layout.cpp
Fix a logic error in arducontrol accessory control
[r2c2.git] / source / libr2c2 / layout.cpp
index b847637fab797481a34225ccf88dea9a2d29ceb4..c2de1c599a08712ec1893602e527d96972d2a246 100644 (file)
@@ -255,26 +255,31 @@ Block &Layout::get_block(unsigned id) const
 
 void Layout::create_blocks()
 {
-       set<Track *> used_tracks;
+       set<Track *> loose_tracks = objects.get<Track>();
        const set<Block *> *blocks = &track_chains.get<Block>();
        for(set<Block *>::const_iterator i=blocks->begin(); i!=blocks->end(); ++i)
        {
                const set<Track *> &btracks = (*i)->get_tracks();
-               used_tracks.insert(btracks.begin(), btracks.end());
+               for(set<Track *>::const_iterator j=btracks.begin(); j!=btracks.end(); ++j)
+                       loose_tracks.erase(*j);
        }
 
-       const set<Track *> &tracks = objects.get<Track>();
-       for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
-               if(used_tracks.count(*i)==0)
-               {
-                       Block *block = new Block(*this, **i);
-                       used_tracks.insert(block->get_tracks().begin(), block->get_tracks().end());
-               }
+       list<Block *> created_blocks;
+       while(!loose_tracks.empty())
+       {
+               Block *block = new Block(*this, **loose_tracks.begin());
+               created_blocks.push_back(block);
+
+               const set<Track *> &btracks = block->get_tracks();
+               for(set<Track *>::const_iterator i=btracks.begin(); i!=btracks.end(); ++i)
+                       loose_tracks.erase(*i);
+       }
 
+       // The previously obtained set has been invalidated by creating new blocks
        blocks = &track_chains.get<Block>();
-       for(set<Block *>::iterator i=blocks->begin(); i!=blocks->end(); ++i)
-               for(set<Block *>::iterator j=i; j!=blocks->end(); ++j)
-                       if(j!=i)
+       for(list<Block *>::iterator i=created_blocks.begin(); i!=created_blocks.end(); ++i)
+               for(set<Block *>::const_iterator j=blocks->begin(); j!=blocks->end(); ++j)
+                       if(*j!=*i)
                                (*i)->check_link(**j);
 }
 
@@ -523,8 +528,7 @@ void Layout::Storage<B>::del()
 
 
 Layout::Loader::Loader(Layout &l):
-       DataFile::ObjectLoader<Layout>(l),
-       new_tracks(false)
+       DataFile::ObjectLoader<Layout>(l)
 {
        add("base",  &Layout::base);
        add("beamgate", &Loader::beamgate);
@@ -550,15 +554,14 @@ void Layout::Loader::route()
 
 void Layout::Loader::signal(ArticleNumber art_nr)
 {
-       Signal *sig = new Signal(obj, obj.catalogue.get_signal(art_nr));
+       Signal *sig = new Signal(obj, obj.catalogue.get<SignalType>(art_nr));
        load_sub(*sig);
 }
 
 void Layout::Loader::track(ArticleNumber art_nr)
 {
-       Track *trk = new Track(obj, obj.catalogue.get_track(art_nr));
+       Track *trk = new Track(obj, obj.catalogue.get<TrackType>(art_nr));
        load_sub(*trk);
-       new_tracks = true;
        const set<Track *> &tracks = obj.objects.get<Track>();
        for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
                if(*i!=trk)
@@ -567,7 +570,7 @@ void Layout::Loader::track(ArticleNumber art_nr)
 
 void Layout::Loader::train(ArticleNumber art_nr, unsigned addr, const std::string &proto)
 {
-       Train *trn = new Train(obj, obj.catalogue.get_vehicle(art_nr), addr, proto);
+       Train *trn = new Train(obj, obj.catalogue.get<VehicleType>(art_nr), addr, proto);
        load_sub(*trn);
 }