X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Ftrainrouteplanner.cpp;h=22ac5400ea4fb050437ccdff14de77dbafc483e9;hb=b42a312323d36775ab550630b3ee818c3b948bf6;hp=45e83e267fb2b37e8b260630442e4a055089f667;hpb=a1c3c054707fc65d497dd13da59b37a9ddb369cc;p=r2c2.git diff --git a/source/libr2c2/trainrouteplanner.cpp b/source/libr2c2/trainrouteplanner.cpp index 45e83e2..22ac540 100644 --- a/source/libr2c2/trainrouteplanner.cpp +++ b/source/libr2c2/trainrouteplanner.cpp @@ -21,36 +21,44 @@ TrainRoutePlanner::TrainRoutePlanner(Layout &layout) routed_trains.push_back(info); } - steps.push_back(RoutingStep()); - RoutingStep &start = steps.back(); + queue.push_back(RoutingStep()); + RoutingStep &start = queue.back(); for(vector::iterator i=routed_trains.begin(); i!=routed_trains.end(); ++i) start.trains.push_back(TrainRoutingState(*i)); + start.update_estimate(); } void TrainRoutePlanner::plan() { const RoutingStep *goal = 0; - for(list::iterator i=steps.begin(); i!=steps.end(); ++i) + while(!queue.empty()) { - if(i->is_goal()) + const RoutingStep &step = get_step(); + if(step.is_goal()) { - goal = &*i; + goal = &step; break; } - add_steps(*i); + add_steps(step); } if(goal) create_routes(*goal); } +const TrainRoutePlanner::RoutingStep &TrainRoutePlanner::get_step() +{ + steps.splice(steps.end(), queue, queue.begin()); + return steps.back(); +} + void TrainRoutePlanner::add_steps(const RoutingStep &step) { list new_steps; step.create_successors(new_steps); new_steps.sort(); - steps.merge(new_steps); + queue.merge(new_steps); } void TrainRoutePlanner::create_routes(const RoutingStep &goal) @@ -175,7 +183,7 @@ TrainRoutePlanner::TrainRoutingState::TrainRoutingState(const TrainRoutingState TrainRoutePlanner::TrainRoutingState::~TrainRoutingState() { - if(!--occupied_tracks->refcount) + if(occupied_tracks && !--occupied_tracks->refcount) delete occupied_tracks; } @@ -184,7 +192,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) @@ -336,17 +344,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 +370,7 @@ bool TrainRoutePlanner::RoutingStep::check_deadlocks() const int TrainRoutePlanner::RoutingStep::get_occupant(Track &track) const { for(unsigned i=0; i