#include <vector>
#include <msp/time/timedelta.h>
#include "trackiter.h"
+#include "trainrouter.h"
namespace R2C2 {
class Route;
class Track;
class Train;
-class TrainRouter;
class TrainRoutePlanner
{
+public:
+ enum Result
+ {
+ PENDING,
+ COMPLETE,
+ FAILED
+ };
+
private:
struct TrainRoutingState;
TrainRouter *router;
std::list<Route *> routes;
Track *track_history[3];
- std::list<const TrainRoutingState *> waits;
+ std::list<TrainRouter::SequencePoint> sequence;
TrainRoutingInfo(Train &);
};
TrainState state;
Msp::Time::TimeDelta delay;
int waypoint;
+ float distance_traveled;
float remaining_estimate;
+ Msp::Time::TimeDelta wait_time;
int blocked_by;
TrainRoutingState(TrainRoutingInfo &);
struct RoutingStep
{
Msp::Time::TimeDelta time;
- Msp::Time::TimeDelta total_estimate;
+ Msp::Time::TimeDelta cost_estimate;
std::vector<TrainRoutingState> trains;
const RoutingStep *prev;
std::vector<TrainRoutingInfo> routed_trains;
std::list<RoutingStep> steps;
std::list<RoutingStep> queue;
+ Result result;
public:
TrainRoutePlanner(Layout &);
void plan();
+ Result get_result() { return result; }
+ const std::list<Route *> &get_routes_for(const Train &) const;
+ const std::list<TrainRouter::SequencePoint> &get_sequence_for(const Train &) const;
private:
+ const TrainRoutingInfo &get_train_info(const Train &) const;
const RoutingStep &get_step();
void add_steps(const RoutingStep &);
void create_routes(const RoutingStep &);