X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Flayout.cpp;h=f1bc3211bab00b5a8e6d4403f8d0ad3607694834;hb=2bb6ce8ada216c0b2caa48f4639d03f2c581098e;hp=d32781578243a1631634d23ecf78e7223387ec93;hpb=707a611dae600333f3a9bd6421176f242fe49907;p=r2c2.git diff --git a/source/libmarklin/layout.cpp b/source/libmarklin/layout.cpp index d327815..f1bc321 100644 --- a/source/libmarklin/layout.cpp +++ b/source/libmarklin/layout.cpp @@ -73,9 +73,12 @@ void Layout::remove_track(Track &t) } } -unsigned Layout::allocate_turnout_id() +unsigned Layout::allocate_turnout_id(bool dbl) { - return next_turnout_id++; + unsigned result = next_turnout_id++; + if(dbl) + ++next_turnout_id; + return result; } void Layout::add_block(Block &b) @@ -92,15 +95,6 @@ Block &Layout::get_block(unsigned id) const throw KeyError("Unknown block", lexical_cast(id)); } -Block &Layout::get_block_by_track(const Track &t) const -{ - for(set::const_iterator i=blocks.begin(); i!=blocks.end(); ++i) - if((*i)->get_tracks().count(const_cast(&t))) - return **i; - - throw InvalidParameterValue("No block found for track"); -} - void Layout::create_blocks() { set used_tracks; @@ -123,20 +117,21 @@ void Layout::create_blocks() (*i)->check_link(**j); } -void Layout::create_blocks(const Track &track) +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(const_cast(&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(); }