X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fblock.cpp;h=33627f8a7cf354afd006ace1b18436090d979441;hb=cf38d0a8208fab7ba7aaafc5eed9a86dfc3722a5;hp=6103509f3647ce053d7c653f3eae28ab3a2b3ca9;hpb=59bae8acd679127602cf35d22bcd37e316a5a056;p=r2c2.git diff --git a/source/libr2c2/block.cpp b/source/libr2c2/block.cpp index 6103509..33627f8 100644 --- a/source/libr2c2/block.cpp +++ b/source/libr2c2/block.cpp @@ -14,50 +14,45 @@ using namespace Msp; namespace R2C2 { Block::Block(Layout &l, Track &start): - layout(l), + TrackChain(l), id(0), sensor_id(start.get_sensor_id()), turnout_id(start.get_turnout_id()), + conflict(false), + sensor(0), train(0) { - tracks.insert(&start); - start.set_block(this); + add_track(start); - list queue; - queue.push_back(&start); - - while(!queue.empty()) + if(start.get_type().is_turnout()) { - Track *track = queue.front(); - queue.erase(queue.begin()); - - const vector &links = track->get_links(); - for(unsigned i=0; iget_sensor_id()==sensor_id && links[i]->get_turnout_id()==turnout_id) - { - queue.push_back(links[i]); - tracks.insert(links[i]); - links[i]->set_block(this); - } - else - endpoints.push_back(Endpoint(track, i)); - } + unsigned nls = start.get_n_link_slots(); + for(unsigned i=0; i &blocks = layout.get_all(); + for(set::const_iterator i=blocks.begin(); (!conflict && i!=blocks.end()); ++i) + conflict = (id==(*i)->get_id()); - sensor = new TrackCircuit(layout, *this); + if(!conflict && sensor_id) + sensor = new TrackCircuit(layout, *this); - layout.add_block(*this); + layout.add(*this); } Block::~Block() @@ -74,14 +69,22 @@ Block::~Block() blk->break_link(*this); } - layout.remove_block(*this); + layout.remove(*this); delete sensor; } -bool Block::has_track(Track &t) const +void Block::on_track_added(Track &track) { - return tracks.count(&t); + track.set_block(this); +} + +TrackChain::Validity Block::check_validity(Track &track) const +{ + if(track.get_sensor_id()!=sensor_id || track.get_turnout_id()!=turnout_id) + return INCOMPATIBLE; + + return TrackChain::check_validity(track); } const Block::Endpoint &Block::get_endpoint(unsigned i) const @@ -169,27 +172,6 @@ bool Block::reserve(Train *t) return false; } -void Block::find_paths(const TrackIter &track, unsigned path) -{ - unsigned mask = track.endpoint().paths; - for(unsigned i=0; mask>>i; ++i) - if(mask&(1<::iterator j=endpoints.begin(); j!=endpoints.end(); ++j) - if(j->track==next.track() && j->track_ep==next.entry()) - j->paths |= path; - } - } -} - void Block::determine_id() { if(sensor_id) @@ -215,8 +197,7 @@ void Block::determine_id() Block::Endpoint::Endpoint(Track *t, unsigned e): track(t), track_ep(e), - link(0), - paths(0) + link(0) { } TrackIter Block::Endpoint::track_iter() const