diff --git a/alib2algo/src/stringology/indexing/NondeterministicExactSuffixAutomaton.cpp b/alib2algo/src/stringology/indexing/NondeterministicExactSuffixAutomaton.cpp index 51103a5951486f01ee32d0369bbb6d6c5dbfb873..c7523587655d9c085cf3233a7ce2a77322eb752e 100644 --- a/alib2algo/src/stringology/indexing/NondeterministicExactSuffixAutomaton.cpp +++ b/alib2algo/src/stringology/indexing/NondeterministicExactSuffixAutomaton.cpp @@ -9,23 +9,6 @@ namespace stringology { namespace indexing { -automaton::EpsilonNFA < DefaultSymbolType, DefaultEpsilonType, unsigned > NondeterministicExactSuffixAutomaton::construct ( const string::LinearString < > & pattern ) { - automaton::EpsilonNFA < DefaultSymbolType, DefaultEpsilonType, unsigned > nfaSuffixAutomaton ( 0 ); - - nfaSuffixAutomaton.setInputAlphabet ( pattern.getAlphabet ( ) ); - - unsigned i = 0; - for ( const DefaultSymbolType & symbol : pattern.getContent ( ) ) { - nfaSuffixAutomaton.addState ( i++ ); - nfaSuffixAutomaton.addTransition ( i - 1, symbol, i ); - nfaSuffixAutomaton.addTransition ( 0, i ); - } - - nfaSuffixAutomaton.addFinalState ( i ); - - return nfaSuffixAutomaton; -} - auto SuffixAutomatonNondeterministicLinearString = registration::AbstractRegister < NondeterministicExactSuffixAutomaton, automaton::EpsilonNFA < DefaultSymbolType, DefaultEpsilonType, unsigned >, const string::LinearString < > & > ( NondeterministicExactSuffixAutomaton::construct ); } /* namespace indexing */ diff --git a/alib2algo/src/stringology/indexing/NondeterministicExactSuffixAutomaton.h b/alib2algo/src/stringology/indexing/NondeterministicExactSuffixAutomaton.h index 1ea645c9732d4369db1cd5f6d0a225704e54a5cf..93c27283bf8707da1a818c01039a29c00210f2c4 100644 --- a/alib2algo/src/stringology/indexing/NondeterministicExactSuffixAutomaton.h +++ b/alib2algo/src/stringology/indexing/NondeterministicExactSuffixAutomaton.h @@ -18,10 +18,29 @@ public: * Nondeterministic construction of nondeterministic suffix automaton for given pattern. * @return nondeterministic suffix automaton for given pattern. */ - static automaton::EpsilonNFA < DefaultSymbolType, DefaultEpsilonType, unsigned > construct ( const string::LinearString < > & pattern ); + template < class SymbolType > + static automaton::EpsilonNFA < SymbolType, DefaultEpsilonType, unsigned > construct ( const string::LinearString < SymbolType > & pattern ); }; +template < class SymbolType > +automaton::EpsilonNFA < SymbolType, DefaultEpsilonType, unsigned > NondeterministicExactSuffixAutomaton::construct ( const string::LinearString < SymbolType > & pattern ) { + automaton::EpsilonNFA < SymbolType, DefaultEpsilonType, unsigned > nfaSuffixAutomaton ( 0 ); + + nfaSuffixAutomaton.setInputAlphabet ( pattern.getAlphabet ( ) ); + + unsigned i = 0; + for ( const SymbolType & symbol : pattern.getContent ( ) ) { + nfaSuffixAutomaton.addState ( i++ ); + nfaSuffixAutomaton.addTransition ( i - 1, symbol, i ); + nfaSuffixAutomaton.addTransition ( 0, i ); + } + + nfaSuffixAutomaton.addFinalState ( i ); + + return nfaSuffixAutomaton; +} + } /* namespace indexing */ } /* namespace stringology */