From 289fa725c02fcb2e524119a79236315b9d33b389 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Fri, 23 Jun 2017 21:33:26 +0200
Subject: [PATCH] fix illegal work with std container in graphs

---
 .../directed/AdjacencyListDirectedGraph.cpp      | 16 +++++++++-------
 .../directed/AdjacencyMatrixDirectedGraph.cpp    | 14 ++++++++------
 .../undirected/AdjacencyListUndirectedGraph.cpp  | 16 +++++++++-------
 .../AdjacencyMatrixUndirectedGraph.cpp           | 16 +++++++++-------
 4 files changed, 35 insertions(+), 27 deletions(-)

diff --git a/alib2data_experimental/src/graph/directed/AdjacencyListDirectedGraph.cpp b/alib2data_experimental/src/graph/directed/AdjacencyListDirectedGraph.cpp
index 34e481dcfc..9c386470ee 100644
--- a/alib2data_experimental/src/graph/directed/AdjacencyListDirectedGraph.cpp
+++ b/alib2data_experimental/src/graph/directed/AdjacencyListDirectedGraph.cpp
@@ -235,13 +235,15 @@ bool AdjacencyListDirectedGraph::removeNode( const Node & node )
 
 	DirectedGraph::removeNode(node);
 
-	for (auto& i : edges) {
-		if (node == i.getFromNode()) {
-			listRemoveOne(pred[i.getToNode()], node);
-			edges.erase(i);
-		} else if (node == i.getToNode()) {
-			listRemoveOne(succ[i.getFromNode()], node);
-			edges.erase(i);
+	for ( auto iter = edges.begin ( ); iter != edges.end ( ); ) {
+		if (node == iter->getFromNode()) {
+			listRemoveOne(pred[iter->getToNode()], node);
+			iter = edges.erase ( iter );
+		} else if (node == iter->getToNode()) {
+			listRemoveOne(succ[iter->getFromNode()], node);
+			iter = edges.erase ( iter );
+		} else {
+			++iter;
 		}
 	}
 
diff --git a/alib2data_experimental/src/graph/directed/AdjacencyMatrixDirectedGraph.cpp b/alib2data_experimental/src/graph/directed/AdjacencyMatrixDirectedGraph.cpp
index 4edc624765..6caf427762 100644
--- a/alib2data_experimental/src/graph/directed/AdjacencyMatrixDirectedGraph.cpp
+++ b/alib2data_experimental/src/graph/directed/AdjacencyMatrixDirectedGraph.cpp
@@ -234,12 +234,14 @@ bool AdjacencyMatrixDirectedGraph::removeNode( const Node & node )
 
 	adj.erase(search);
 
-	for (auto& i : edges) {
-		if (i.getFromNode() == node) {
-			edges.erase(i);
-		} else if (i.getToNode() == node) {
-			adj[i.getFromNode()].erase(node);
-			edges.erase(i);
+	for ( auto iter = edges.begin ( ); iter != edges.end ( ); ) {
+		if (iter->getFromNode() == node) {
+			iter = edges.erase(iter);
+		} else if (iter->getToNode() == node) {
+			adj[iter->getFromNode()].erase(node);
+			iter = edges.erase(iter);
+		} else {
+			++iter;
 		}
 	}
 
diff --git a/alib2data_experimental/src/graph/undirected/AdjacencyListUndirectedGraph.cpp b/alib2data_experimental/src/graph/undirected/AdjacencyListUndirectedGraph.cpp
index 47544fdbe3..a135a4c31e 100644
--- a/alib2data_experimental/src/graph/undirected/AdjacencyListUndirectedGraph.cpp
+++ b/alib2data_experimental/src/graph/undirected/AdjacencyListUndirectedGraph.cpp
@@ -164,13 +164,15 @@ bool AdjacencyListUndirectedGraph::removeNode( const Node & node )
 	adj.erase(search);
 	UndirectedGraph::removeNode(node);
 
-	for (auto& i : edges) {
-		if (i.getFirstNode() == node) {
-			listRemoveOne(adj[i.getSecondNode()], node);
-			edges.erase(i);
-		} else if (i.getSecondNode() == node) {
-			listRemoveOne(adj[i.getFirstNode()], node);
-			edges.erase(i);
+	for ( auto iter = edges.begin ( ); iter != edges.end ( ); ) {
+		if (iter->getFirstNode() == node) {
+			listRemoveOne(adj[iter->getSecondNode()], node);
+			iter = edges.erase(iter);
+		} else if (iter->getSecondNode() == node) {
+			listRemoveOne(adj[iter->getFirstNode()], node);
+			iter = edges.erase(iter);
+		} else {
+			++ iter;
 		}
 	}
 
diff --git a/alib2data_experimental/src/graph/undirected/AdjacencyMatrixUndirectedGraph.cpp b/alib2data_experimental/src/graph/undirected/AdjacencyMatrixUndirectedGraph.cpp
index 859b0d7c2e..9a491f9588 100644
--- a/alib2data_experimental/src/graph/undirected/AdjacencyMatrixUndirectedGraph.cpp
+++ b/alib2data_experimental/src/graph/undirected/AdjacencyMatrixUndirectedGraph.cpp
@@ -169,13 +169,15 @@ bool AdjacencyMatrixUndirectedGraph::removeNode( const Node & node )
 	adj.erase(search);
 	UndirectedGraph::removeNode(node);
 
-	for (auto& i : edges) {
-		if (i.getFirstNode() == node) {
-			adj[i.getSecondNode()].erase(node);
-			edges.erase(i);
-		} else if (i.getSecondNode() == node) {
-			adj[i.getFirstNode()].erase(node);
-			edges.erase(i);
+	for ( auto iter = edges.begin ( ); iter != edges.end ( ); ) {
+		if (iter->getFirstNode() == node) {
+			adj[iter->getSecondNode()].erase(node);
+			iter = edges.erase(iter);
+		} else if (iter->getSecondNode() == node) {
+			adj[iter->getFirstNode()].erase(node);
+			iter = edges.erase(iter);
+		} else {
+			++iter;
 		}
 	}
 
-- 
GitLab