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