Train *train;
float speed;
TrainRouter *router;
- Route *route;
- std::list<TrainRoutingState *> waits;
+ std::list<Route *> routes;
+ Track *track_history[3];
+ std::list<const TrainRoutingState *> waits;
TrainRoutingInfo(Train &);
};
TrainState state;
Msp::Time::TimeDelta delay;
int waypoint;
+ Msp::Time::TimeDelta remaining_estimate;
int blocked_by;
TrainRoutingState(TrainRoutingInfo &);
~TrainRoutingState();
Msp::Time::TimeDelta get_time_to_next_track() const;
- bool is_occupied(Track &) const;
+ bool is_occupying(Track &) const;
+ bool check_arrival();
void advance(float);
void advance_track(unsigned);
+ void update_estimate();
};
struct RoutingStep
{
Msp::Time::TimeDelta time;
+ Msp::Time::TimeDelta total_estimate;
std::vector<TrainRoutingState> trains;
- RoutingStep *prev;
+ const RoutingStep *prev;
RoutingStep();
- RoutingStep(RoutingStep *);
+ RoutingStep(const RoutingStep *);
+ void create_successors(std::list<RoutingStep> &) const;
bool update_states();
bool check_deadlocks() const;
int get_occupant(Track &) const;
int find_next_train() const;
void advance(const Msp::Time::TimeDelta &);
+ void update_estimate();
bool is_viable() const;
bool is_goal() const;
std::vector<TrainRoutingInfo> routed_trains;
std::list<RoutingStep> steps;
+ std::list<RoutingStep> queue;
public:
TrainRoutePlanner(Layout &);
void plan();
private:
- bool update_states(RoutingStep &);
- void add_steps(RoutingStep &, unsigned);
- void add_waiting_step(RoutingStep &, unsigned);
- void add_steps(RoutingStep &, TrainRoutingState &train);
- void create_routes(RoutingStep &);
+ const RoutingStep &get_step();
+ void add_steps(const RoutingStep &);
+ void create_routes(const RoutingStep &);
};
} // namespace R2C2