diff options
author | fonsinchen <fonsinchen@openttd.org> | 2014-01-29 19:55:29 +0000 |
---|---|---|
committer | fonsinchen <fonsinchen@openttd.org> | 2014-01-29 19:55:29 +0000 |
commit | 91407b924ea47efdfe3a17fad5513189d5605288 (patch) | |
tree | 26ab6e02883efd83b884c177e65a1e4eab94320b /src/linkgraph | |
parent | e4a4f2c1ddbc67aa9d5fa7380a8eb2a10b619958 (diff) | |
download | openttd-91407b924ea47efdfe3a17fad5513189d5605288.tar.xz |
(svn r26286) -Fix: Thoroughly erase dead flows.
Diffstat (limited to 'src/linkgraph')
-rw-r--r-- | src/linkgraph/linkgraphjob.cpp | 23 | ||||
-rw-r--r-- | src/linkgraph/linkgraphjob.h | 2 |
2 files changed, 22 insertions, 3 deletions
diff --git a/src/linkgraph/linkgraphjob.cpp b/src/linkgraph/linkgraphjob.cpp index 717a7305d..318186d3f 100644 --- a/src/linkgraph/linkgraphjob.cpp +++ b/src/linkgraph/linkgraphjob.cpp @@ -35,6 +35,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. */ LinkGraphJob::~LinkGraphJob() @@ -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(); diff --git a/src/linkgraph/linkgraphjob.h b/src/linkgraph/linkgraphjob.h index 66aff3672..f6979db74 100644 --- a/src/linkgraph/linkgraphjob.h +++ b/src/linkgraph/linkgraphjob.h @@ -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: /** |