diff --git a/alib2algo/src/automaton/transform/Compaction.h b/alib2algo/src/automaton/transform/Compaction.h index a8b872686227e750ba01f774b736b47f28a23d9a..af619d8cfbf6a430b1c2161ede32f278c79ad19f 100644 --- a/alib2algo/src/automaton/transform/Compaction.h +++ b/alib2algo/src/automaton/transform/Compaction.h @@ -82,7 +82,7 @@ ext::require < isDFA < T > || isNFA < T >, Compaction::CompactAutomaton < T > > for(const auto& transition: automaton.getTransitionsFromState(automaton.getInitialState())) stack.push(ext::make_tuple(transition.second, automaton.getInitialState(), transition.first.second)); - if(automaton.getFinalStates().count(automaton.getInitialState()) > 0) + if(automaton.getFinalStates().count(automaton.getInitialState())) res.addFinalState(automaton.getInitialState()); while(!stack.empty()) { @@ -91,7 +91,7 @@ ext::require < isDFA < T > || isNFA < T >, Compaction::CompactAutomaton < T > > SymbolType symbol = std::move(std::get<2>(stack.top())); stack.pop(); - ext::vector < SymbolType > path { symbol }; + ext::vector < SymbolType > path { std::move ( symbol ) }; decltype ( automaton.getTransitionsFromState ( q ) ) transitions; // only 1 child and nonfinal @@ -101,17 +101,17 @@ ext::require < isDFA < T > || isNFA < T >, Compaction::CompactAutomaton < T > > q = transition.second; } + for(const std::pair<const ext::pair<StateType, SymbolType>, StateType>& transition : transitions ) + if(visited.insert(ext::make_tuple(transition.second, q, transition.first.second)).second) + stack.push(ext::make_tuple(transition.second, q, transition.first.second)); + // fork or final state res.addState(q); if(automaton.getFinalStates().count(q)) res.addFinalState(q); - res.addTransition(lastFork, path, q); - - for(const std::pair<const ext::pair<StateType, SymbolType>, StateType>& transition : transitions ) - if(visited.insert(ext::make_tuple(transition.second, q, transition.first.second)).second) - stack.push(ext::make_tuple(transition.second, q, transition.first.second)); + res.addTransition ( std::move ( lastFork ), std::move ( path ), std::move ( q ) ); }