From 34d20323d411a5e38571915ab27bbbe0a2836b73 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Thu, 16 Jun 2016 11:57:39 +0200
Subject: [PATCH] shared_ptr to simplify cleanup of NTPDA run algo

---
 alib2algo/src/automaton/run/Run.cpp | 27 ++++++++++-----------------
 1 file changed, 10 insertions(+), 17 deletions(-)

diff --git a/alib2algo/src/automaton/run/Run.cpp b/alib2algo/src/automaton/run/Run.cpp
index 6c025718f2..1be37c9d1b 100644
--- a/alib2algo/src/automaton/run/Run.cpp
+++ b/alib2algo/src/automaton/run/Run.cpp
@@ -472,8 +472,8 @@ std::tuple < bool, State, std::set < unsigned >, std::deque < alphabet::Symbol >
 // ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
 struct graphStructuredStack {
-	graphStructuredStack ( graphStructuredStack * parent, alphabet::Symbol data ) : parent(parent), data(data) {}
-	graphStructuredStack * parent;
+	graphStructuredStack ( std::shared_ptr < graphStructuredStack > parent, alphabet::Symbol data ) : parent(parent), data(data) {}
+	std::shared_ptr < graphStructuredStack > parent;
 	alphabet::Symbol data;
 };
 
@@ -483,15 +483,14 @@ std::tuple < bool, std::set < State >, std::set < std::vector < alphabet::Symbol
 	std::set < unsigned > occurrences;
 	automaton::State state = automaton . getInitialState ();
 	std::vector<alphabet::Symbol>::const_iterator symbolIter = string . getContent () . begin ();
-	graphStructuredStack * stackNode = new graphStructuredStack ( NULL, (* symbolIter) );
-	graphStructuredStack * outputNode = new graphStructuredStack ( NULL, (* symbolIter) );
-	std::set < graphStructuredStack* > allNodes { stackNode, outputNode };
+	std::shared_ptr < graphStructuredStack > stackNode = std::make_shared < graphStructuredStack > ( nullptr, * symbolIter );
+	std::shared_ptr < graphStructuredStack > outputNode = std::make_shared < graphStructuredStack > ( nullptr, * symbolIter );
 
 	if ( automaton . getFinalStates () . count ( state ) ) {
 		occurrences . insert ( i );
 	}
 
-	std::deque < std::tuple < automaton::State, std::vector<alphabet::Symbol>::const_iterator, graphStructuredStack*, graphStructuredStack* > > bftQueue;
+	std::deque < std::tuple < automaton::State, std::vector<alphabet::Symbol>::const_iterator, std::shared_ptr < graphStructuredStack >, std::shared_ptr < graphStructuredStack > > > bftQueue;
 	auto configuration = std::make_tuple ( state, symbolIter, stackNode, outputNode );
 	bftQueue . push_back ( configuration );
 
@@ -521,12 +520,12 @@ std::tuple < bool, std::set < State >, std::set < std::vector < alphabet::Symbol
 		}
 
 		for ( const auto & transition : automaton . getTransitionsFromState ( state ) ) {
-			if ( std::get<1>(transition . first) != (* symbolIter) && ! std::get<1>(transition . first) . is<string::Epsilon>() )
+			if ( std::get<1>(transition . first) != * symbolIter && ! std::get<1>(transition . first) . is<string::Epsilon>() )
 				continue;
 
 			const auto & pop = std::get<2>(transition . first);
-			graphStructuredStack * stackNodeCopy = stackNode;
-			graphStructuredStack * outputNodeCopy = outputNode;
+			std::shared_ptr < graphStructuredStack > stackNodeCopy = stackNode;
+			std::shared_ptr < graphStructuredStack > outputNodeCopy = outputNode;
 
 			unsigned j = 0;
 			for ( ; j < pop . size (); j ++ ) {
@@ -537,12 +536,10 @@ std::tuple < bool, std::set < State >, std::set < std::vector < alphabet::Symbol
 			}
 			if ( j == pop . size () ) {
 				for ( const auto & elem : std::make_reverse ( std::get<1>(transition . second ) ) ) {
-					stackNodeCopy = new graphStructuredStack ( stackNodeCopy, elem );
-					allNodes . insert ( stackNodeCopy );
+					stackNodeCopy = std::make_shared < graphStructuredStack > ( stackNodeCopy, elem );
 				}
 				for ( const auto & elem : std::get<2>(transition . second) ) {
-					outputNodeCopy = new graphStructuredStack ( outputNodeCopy, elem );
-					allNodes . insert ( outputNodeCopy );
+					outputNodeCopy = std::make_shared < graphStructuredStack > ( outputNodeCopy, elem );
 				}
 
 				if ( ! std::get<1>(transition . first) . is<string::Epsilon>() ) {
@@ -557,10 +554,6 @@ std::tuple < bool, std::set < State >, std::set < std::vector < alphabet::Symbol
 		}
 	}
 
-	for ( const auto & elem : allNodes ) {
-		delete elem;
-	}
-
 	return std::make_tuple ( res, states, allOutputs );
 }
 
-- 
GitLab