X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Flayout.cpp;h=f1bc3211bab00b5a8e6d4403f8d0ad3607694834;hb=2bb6ce8ada216c0b2caa48f4639d03f2c581098e;hp=f89b78335d30f0f720778ccbcd4b3822fc8defb8;hpb=f79b3fd58999a73a4a28663b46fdd96c58167a18;p=r2c2.git diff --git a/source/libmarklin/layout.cpp b/source/libmarklin/layout.cpp index f89b783..f1bc321 100644 --- a/source/libmarklin/layout.cpp +++ b/source/libmarklin/layout.cpp @@ -95,15 +95,6 @@ Block &Layout::get_block(unsigned id) const throw KeyError("Unknown block", lexical_cast(id)); } -Block &Layout::get_block_by_track(Track &t) const -{ - for(set::const_iterator i=blocks.begin(); i!=blocks.end(); ++i) - if((*i)->get_tracks().count(&t)) - return **i; - - throw InvalidParameterValue("No block found for track"); -} - void Layout::create_blocks() { set used_tracks; @@ -128,18 +119,19 @@ void Layout::create_blocks() void Layout::create_blocks(Track &track) { + /* Must collect the blocks in a set first while all tracks are still + guaranteed to have blocks and to avoid duplicate deletes */ + set del_blocks; + + del_blocks.insert(&track.get_block()); + const vector &links = track.get_links(); - for(set::iterator i=blocks.begin(); i!=blocks.end();) - { - bool del = (*i)->get_tracks().count(&track); - for(vector::const_iterator j=links.begin(); (!del && j!=links.end()); ++j) - del = (*i)->get_tracks().count(*j); - - if(del) - delete *i++; - else - ++i; - } + for(vector::const_iterator i=links.begin(); i!=links.end(); ++i) + if(*i) + del_blocks.insert(&(*i)->get_block()); + + for(set::iterator i=del_blocks.begin(); i!=del_blocks.end(); ++i) + delete *i; create_blocks(); }