(svn r26286) -Fix: Thoroughly erase dead flows.

pull/155/head
fonsinchen 11 years ago
parent 5b464bf9fe
commit b31a1119fb

@ -34,6 +34,17 @@ LinkGraphJob::LinkGraphJob(const LinkGraph &orig) :
{
}
/**
* Erase all flows originating at a specific node.
* @param from Node to erase flows for.
*/
void LinkGraphJob::EraseFlows(NodeID from)
{
for (NodeID node_id = 0; node_id < this->Size(); ++node_id) {
(*this)[node_id].Flows().erase(from);
}
}
/**
* Join the link graph job and destroy it.
*/
@ -52,14 +63,20 @@ LinkGraphJob::~LinkGraphJob()
for (NodeID node_id = 0; node_id < size; ++node_id) {
Node from = (*this)[node_id];
/* The station can have been deleted. */
/* The station can have been deleted. Remove all flows originating from it then. */
Station *st = Station::GetIfValid(from.Station());
if (st == NULL) continue;
if (st == NULL) {
this->EraseFlows(node_id);
continue;
}
/* Link graph merging and station deletion may change around IDs. Make
* sure that everything is still consistent or ignore it otherwise. */
GoodsEntry &ge = st->goods[this->Cargo()];
if (ge.link_graph != this->link_graph.index || ge.node != node_id) continue;
if (ge.link_graph != this->link_graph.index || ge.node != node_id) {
this->EraseFlows(node_id);
continue;
}
LinkGraph *lg = LinkGraph::Get(ge.link_graph);
FlowStatMap &flows = from.Flows();

@ -64,6 +64,8 @@ protected:
NodeAnnotationVector nodes; ///< Extra node data necessary for link graph calculation.
EdgeAnnotationMatrix edges; ///< Extra edge data necessary for link graph calculation.
void EraseFlows(NodeID from);
public:
/**

@ -99,8 +99,9 @@ Station::~Station()
if (lg == NULL) continue;
for (NodeID node = 0; node < lg->Size(); ++node) {
Station *st = Station::Get((*lg)[node].Station());
st->goods[c].flows.erase(this->index);
if ((*lg)[node][this->goods[c].node].LastUpdate() != INVALID_DATE) {
Station *st = Station::Get((*lg)[node].Station());
st->goods[c].flows.DeleteFlows(this->index);
RerouteCargo(st, c, this->index, st->index);
}

Loading…
Cancel
Save