diff --git a/alib2algo/src/automaton/EpsilonClosure.cpp b/alib2algo/src/automaton/EpsilonClosure.cpp index 993dbf0256388b479d2853e8d742b1db4e43ecf5..318bcf5a399c0c9b5e475f3b65503ab5d256d068 100644 --- a/alib2algo/src/automaton/EpsilonClosure.cpp +++ b/alib2algo/src/automaton/EpsilonClosure.cpp @@ -124,7 +124,7 @@ std::set<automaton::State> EpsilonClosure::epsilonClosure( const automaton::Comp std::set<automaton::State> EpsilonClosure::epsilonClosure(const Automaton& automaton, const automaton::State& q) { std::pair<automaton::State, std::set<automaton::State>> out = std::make_pair(q, std::set<automaton::State> {}); automaton.getData().Accept((void*) &out, EpsilonClosure::EPSILON_CLOSURE); - return out.second; + return std::move(out.second); } void EpsilonClosure::Visit(void*, const UnknownAutomaton&) const { @@ -133,27 +133,27 @@ void EpsilonClosure::Visit(void*, const UnknownAutomaton&) const { void EpsilonClosure::Visit(void* data, const EpsilonNFA& automaton) const { std::pair<automaton::State, std::set<automaton::State>> & out = *((std::pair<automaton::State, std::set<automaton::State>>*) data); - out.second = this->epsilonClosure(automaton, out.first); + out.second = std::move(this->epsilonClosure(automaton, out.first)); } void EpsilonClosure::Visit(void* data, const NFA& automaton) const { std::pair<automaton::State, std::set<automaton::State>> & out = *((std::pair<automaton::State, std::set<automaton::State>>*) data); - out.second = this->epsilonClosure(automaton, out.first); + out.second = std::move(this->epsilonClosure(automaton, out.first)); } void EpsilonClosure::Visit(void* data, const DFA& automaton) const { std::pair<automaton::State, std::set<automaton::State>> & out = *((std::pair<automaton::State, std::set<automaton::State>>*) data); - out.second = this->epsilonClosure(automaton, out.first); + out.second = std::move(this->epsilonClosure(automaton, out.first)); } void EpsilonClosure::Visit(void* data, const ExtendedNFA& automaton) const { std::pair<automaton::State, std::set<automaton::State>> & out = *((std::pair<automaton::State, std::set<automaton::State>>*) data); - out.second = this->epsilonClosure(automaton, out.first); + out.second = std::move(this->epsilonClosure(automaton, out.first)); } void EpsilonClosure::Visit(void* data, const CompactNFA& automaton) const { std::pair<automaton::State, std::set<automaton::State>> & out = *((std::pair<automaton::State, std::set<automaton::State>>*) data); - out.second = this->epsilonClosure(automaton, out.first); + out.second = std::move(this->epsilonClosure(automaton, out.first)); } void EpsilonClosure::Visit(void*, const DPDA&) const { diff --git a/alib2algo/src/epsilon/fsm/FSMEpsilonRemover.cpp b/alib2algo/src/epsilon/fsm/FSMEpsilonRemover.cpp index 5935e37174e3176b5eef3049b9bb580d276b6855..158c7b2d7910ebd5195b5d3ace21fccec7ae97c9 100644 --- a/alib2algo/src/epsilon/fsm/FSMEpsilonRemover.cpp +++ b/alib2algo/src/epsilon/fsm/FSMEpsilonRemover.cpp @@ -38,9 +38,10 @@ automaton::NFA FSMEpsilonRemover::remove( const automaton::EpsilonNFA & origFSM */ for( const auto & from : origFSM.getStates( ) ) for( const auto & fromClosure : automaton::EpsilonClosure::epsilonClosure( origFSM, from ) ) - for( const auto & transition : origFSM.getSymbolTransitionsFromState( fromClosure ) ) - for( const auto & to : transition.second ) - fsm.addTransition( from, transition.first.second, to ); + for( const auto & transition : origFSM.getTransitions( ) ) + if (transition.first.first == fromClosure && transition.first.second.is<alphabet::Symbol>()) + for( const auto & to : transition.second ) + fsm.addTransition( from, transition.first.second.get<alphabet::Symbol>(), to ); /** * Step 2 from Melichar 2.41