X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Ftrainrouteplanner.cpp;h=e813b366fe88a4829d4cc155f9d731d41108d461;hb=4232c65cb556d278dee218866de77402ff888f1e;hp=c115d924bed8e0603436c0705a0a4bd46deab364;hpb=19274ec3b805af126e562c805e0c14baa14c5833;p=r2c2.git diff --git a/source/libr2c2/trainrouteplanner.cpp b/source/libr2c2/trainrouteplanner.cpp index c115d92..e813b36 100644 --- a/source/libr2c2/trainrouteplanner.cpp +++ b/source/libr2c2/trainrouteplanner.cpp @@ -29,7 +29,7 @@ TrainRoutePlanner::TrainRoutePlanner(Layout &layout) void TrainRoutePlanner::plan() { - RoutingStep *goal = 0; + const RoutingStep *goal = 0; for(list::iterator i=steps.begin(); i!=steps.end(); ++i) { if(i->is_goal()) @@ -45,7 +45,7 @@ void TrainRoutePlanner::plan() create_routes(*goal); } -void TrainRoutePlanner::add_steps(RoutingStep &step) +void TrainRoutePlanner::add_steps(const RoutingStep &step) { list new_steps; step.create_successors(new_steps); @@ -53,7 +53,7 @@ void TrainRoutePlanner::add_steps(RoutingStep &step) steps.merge(new_steps); } -void TrainRoutePlanner::create_routes(RoutingStep &goal) +void TrainRoutePlanner::create_routes(const RoutingStep &goal) { for(vector::iterator i=routed_trains.begin(); i!=routed_trains.end(); ++i) { @@ -62,9 +62,9 @@ void TrainRoutePlanner::create_routes(RoutingStep &goal) i->route->set_temporary(true); } - for(RoutingStep *i=&goal; i; i=i->prev) + for(const RoutingStep *i=&goal; i; i=i->prev) { - for(vector::iterator j=i->trains.begin(); j!=i->trains.end(); ++j) + for(vector::const_iterator j=i->trains.begin(); j!=i->trains.end(); ++j) { if(j->state==WAITING || j->state==BLOCKED) j->info->waits.push_front(&*j); @@ -75,8 +75,8 @@ void TrainRoutePlanner::create_routes(RoutingStep &goal) for(vector::iterator i=routed_trains.begin(); i!=routed_trains.end(); ++i) { i->router->set_route(i->route); - TrainRoutingState *current_wait = 0; - for(list::iterator j=i->waits.begin(); j!=i->waits.end(); ++j) + const TrainRoutingState *current_wait = 0; + for(list::const_iterator j=i->waits.begin(); j!=i->waits.end(); ++j) if(!current_wait || (*j)->track.track()!=current_wait->track.track()) { Block &block = (*j)->track.next()->get_block(); @@ -184,7 +184,7 @@ Time::TimeDelta TrainRoutePlanner::TrainRoutingState::get_time_to_next_track() c return ((track->get_type().get_path_length(path)-offset)/info->speed)*Time::sec+delay; } -bool TrainRoutePlanner::TrainRoutingState::is_occupied(Track &trk) const +bool TrainRoutePlanner::TrainRoutingState::is_occupying(Track &trk) const { OccupiedTrack *occ = occupied_tracks; for(unsigned n=occ->n_tracks; n>0; --n, occ=occ->next) @@ -250,13 +250,13 @@ TrainRoutePlanner::RoutingStep::RoutingStep(): prev(0) { } -TrainRoutePlanner::RoutingStep::RoutingStep(RoutingStep *p): +TrainRoutePlanner::RoutingStep::RoutingStep(const RoutingStep *p): time(p->time), trains(p->trains), prev(p) { } -void TrainRoutePlanner::RoutingStep::create_successors(list &new_steps) +void TrainRoutePlanner::RoutingStep::create_successors(list &new_steps) const { RoutingStep next(this); if(next.update_states()) @@ -336,17 +336,24 @@ bool TrainRoutePlanner::RoutingStep::update_states() bool TrainRoutePlanner::RoutingStep::check_deadlocks() const { - for(unsigned i=0; i::const_iterator i=trains.begin(); i!=trains.end(); ++i) { - const TrainRoutingState &train = trains[i]; - if(train.state!=BLOCKED) + if(i->state!=BLOCKED) continue; - if(train.blocked_by<0) + if(i->blocked_by<0) return true; - if(trains[train.blocked_by].blocked_by==static_cast(i)) - return true; + int slow = i->blocked_by; + int fast = trains[slow].blocked_by; + while(fast>=0 && trains[fast].blocked_by>=0) + { + if(fast==slow) + return true; + + slow = trains[slow].blocked_by; + fast = trains[trains[fast].blocked_by].blocked_by; + } } return false; @@ -355,7 +362,7 @@ bool TrainRoutePlanner::RoutingStep::check_deadlocks() const int TrainRoutePlanner::RoutingStep::get_occupant(Track &track) const { for(unsigned i=0; i