diff --git a/alib2algo/src/automaton/transform/Reverse.cpp b/alib2algo/src/automaton/transform/Reverse.cpp index 289b453377c8b49c2bf917f9e1c3bafe1c08b8fe..ed567ffa4b87571472b11d036c91ac15dde22a87 100644 --- a/alib2algo/src/automaton/transform/Reverse.cpp +++ b/alib2algo/src/automaton/transform/Reverse.cpp @@ -7,11 +7,6 @@ #include "Reverse.h" -#include <automaton/FSM/MultiInitialStateNFA.h> - -#include <vector> -#include <algorithm> - namespace automaton { namespace transform { @@ -20,54 +15,8 @@ automaton::Automaton Reverse::convert(const Automaton& automaton) { return dispatch(automaton.getData()); } -automaton::MultiInitialStateNFA < > Reverse::convert(const automaton::DFA<>& automaton) { - automaton::MultiInitialStateNFA < > res; - - res.setStates(automaton.getStates()); - res.addFinalState(automaton.getInitialState()); - res.setInitialStates( automaton.getFinalStates() ); - res.setInputAlphabet(automaton.getInputAlphabet()); - - for(const auto& t : automaton.getTransitions()) - res.addTransition(t.second, t.first.second, t.first.first); - - return res; -} - auto ReverseDFA = Reverse::RegistratorWrapper<automaton::MultiInitialStateNFA < > , automaton::DFA<>>(Reverse::convert); - -automaton::MultiInitialStateNFA < > Reverse::convert(const automaton::NFA < > & automaton) { - automaton::MultiInitialStateNFA < > res; - - res.setStates(automaton.getStates()); - res.addFinalState(automaton.getInitialState()); - res.setInitialStates( automaton.getFinalStates() ); - res.setInputAlphabet(automaton.getInputAlphabet()); - - for(const auto& t : automaton.getTransitions()) - for(const auto& q : t.second) - res.addTransition(q, t.first.second, t.first.first); - - return res; -} - auto ReverseNFA = Reverse::RegistratorWrapper<automaton::MultiInitialStateNFA < > , automaton::NFA < > >(Reverse::convert); - -automaton::MultiInitialStateNFA < > Reverse::convert(const automaton::MultiInitialStateNFA < > & automaton) { - automaton::MultiInitialStateNFA < > res; - - res.setStates(automaton.getStates()); - res.setFinalStates(automaton.getInitialStates()); - res.setInitialStates( automaton.getFinalStates() ); - res.setInputAlphabet(automaton.getInputAlphabet()); - - for(const auto& t : automaton.getTransitions()) - for(const auto& q : t.second) - res.addTransition(q, t.first.second, t.first.first); - - return res; -} - auto ReverseMultiInitialStateNFA = Reverse::RegistratorWrapper<automaton::MultiInitialStateNFA < > , automaton::MultiInitialStateNFA < > >(Reverse::convert); } /* namespace transform */ diff --git a/alib2algo/src/automaton/transform/Reverse.h b/alib2algo/src/automaton/transform/Reverse.h index f0e412e7ac6e0483711d70157e2e743e2f5ccfc1..de97ad6d7a9d9f887c205b973d6f3a4b5a8f452a 100644 --- a/alib2algo/src/automaton/transform/Reverse.h +++ b/alib2algo/src/automaton/transform/Reverse.h @@ -8,9 +8,14 @@ #ifndef REVERSE_H_ #define REVERSE_H_ +#include <vector> +#include <algorithm> + #include <core/multipleDispatch.hpp> + #include <automaton/Automaton.h> #include <automaton/AutomatonFeatures.h> +#include <automaton/FSM/MultiInitialStateNFA.h> namespace automaton { @@ -18,9 +23,12 @@ namespace transform { class Reverse : public std::SingleDispatch<Reverse, automaton::Automaton, const automaton::AutomatonBase &> { public: - static automaton::MultiInitialStateNFA < > convert(const automaton::DFA<>& automaton); - static automaton::MultiInitialStateNFA < > convert(const automaton::NFA < > & automaton); - static automaton::MultiInitialStateNFA < > convert(const automaton::MultiInitialStateNFA < > & automaton); + template < class SymbolType, class StateType > + static automaton::MultiInitialStateNFA < SymbolType, StateType > convert(const automaton::DFA < SymbolType, StateType > & automaton); + template < class SymbolType, class StateType > + static automaton::MultiInitialStateNFA < SymbolType, StateType > convert(const automaton::NFA < SymbolType, StateType > & automaton); + template < class SymbolType, class StateType > + static automaton::MultiInitialStateNFA < SymbolType, StateType > convert(const automaton::MultiInitialStateNFA < SymbolType, StateType > & automaton); /** * Creates finite automaton accepting reverse language of given automaton @@ -30,6 +38,53 @@ public: static automaton::Automaton convert( const automaton::Automaton & automaton ); }; +template < class SymbolType, class StateType > +automaton::MultiInitialStateNFA < SymbolType, StateType > Reverse::convert(const automaton::DFA < SymbolType, StateType > & automaton) { + automaton::MultiInitialStateNFA < SymbolType, StateType > res; + + res.setStates(automaton.getStates()); + res.addFinalState(automaton.getInitialState()); + res.setInitialStates( automaton.getFinalStates() ); + res.setInputAlphabet(automaton.getInputAlphabet()); + + for(const auto& t : automaton.getTransitions()) + res.addTransition(t.second, t.first.second, t.first.first); + + return res; +} + +template < class SymbolType, class StateType > +automaton::MultiInitialStateNFA < SymbolType, StateType > Reverse::convert(const automaton::NFA < SymbolType, StateType > & automaton) { + automaton::MultiInitialStateNFA < SymbolType, StateType > res; + + res.setStates(automaton.getStates()); + res.addFinalState(automaton.getInitialState()); + res.setInitialStates( automaton.getFinalStates() ); + res.setInputAlphabet(automaton.getInputAlphabet()); + + for(const auto& t : automaton.getTransitions()) + for(const auto& q : t.second) + res.addTransition(q, t.first.second, t.first.first); + + return res; +} + +template < class SymbolType, class StateType > +automaton::MultiInitialStateNFA < SymbolType, StateType > Reverse::convert(const automaton::MultiInitialStateNFA < SymbolType, StateType > & automaton) { + automaton::MultiInitialStateNFA < SymbolType, StateType > res; + + res.setStates(automaton.getStates()); + res.setFinalStates(automaton.getInitialStates()); + res.setInitialStates( automaton.getFinalStates() ); + res.setInputAlphabet(automaton.getInputAlphabet()); + + for(const auto& t : automaton.getTransitions()) + for(const auto& q : t.second) + res.addTransition(q, t.first.second, t.first.first); + + return res; +} + } /* namespace transform */ } /* namespace automaton */