Changeset - r23569:b43bf680313b
[Not reviewed]
master
0 1 0
PeterN - 5 years ago 2019-03-30 22:19:50
peter@fuzzle.org
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.
1 file changed with 4 insertions and 1 deletions:
0 comments (0 inline, 0 general)
src/linkgraph/linkgraph.cpp
Show inline comments
 
@@ -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
0 comments (0 inline, 0 general)