summaryrefslogtreecommitdiff
path: root/src/linkgraph
diff options
context:
space:
mode:
authorPeterN <peter@fuzzle.org>2019-03-30 22:19:50 +0000
committerGitHub <noreply@github.com>2019-03-30 22:19:50 +0000
commit32fda83d3916197a46215c83ddd85b2e50128a02 (patch)
treee4e57057351d5dafa1b3e855f8bd2266fca19233 /src/linkgraph
parent423aea5c32c1cca5e59f5c994730aeb4ff09a56f (diff)
downloadopenttd-32fda83d3916197a46215c83ddd85b2e50128a02.tar.xz
Fix aa7ca7fe6: Linkgraph node index order must be maintained due to other references. (#7431)
Linkgraph nodes require a specific order that was maintained by swapping just the last element for the node to be removed. std::vector::erase() changed this to removing the node is then shuffling the remain items down, which upsets other references to this indices. This is fixed by switching back to the original swap & pop method.
Diffstat (limited to 'src/linkgraph')
-rw-r--r--src/linkgraph/linkgraph.cpp5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/linkgraph/linkgraph.cpp b/src/linkgraph/linkgraph.cpp
index d8cbf9b50..234b0be60 100644
--- a/src/linkgraph/linkgraph.cpp
+++ b/src/linkgraph/linkgraph.cpp
@@ -139,7 +139,10 @@ void LinkGraph::RemoveNode(NodeID id)
node_edges[id] = node_edges[last_node];
}
Station::Get(this->nodes[last_node].station)->goods[this->cargo].node = id;
- this->nodes.erase(this->nodes.begin() + id);
+ /* Erase node by swapping with the last element. Node index is referenced
+ * directly from station goods entries so the order and position must remain. */
+ this->nodes[id] = this->nodes.back();
+ this->nodes.pop_back();
this->edges.EraseColumn(id);
/* Not doing EraseRow here, as having the extra invalid row doesn't hurt
* and removing it would trigger a lot of memmove. The data has already