mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-07 06:39:08 +00:00
(svn r26286) -Fix: Thoroughly erase dead flows.
This commit is contained in:
parent
e4a4f2c1dd
commit
91407b924e
@ -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…
Reference in New Issue
Block a user