From f9d7562d2e89a18c3e59eb91ecd2175d9dfb993d Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Thu, 12 Jan 2017 22:05:55 +0100 Subject: [PATCH] template remaining algorithms from stringology --- ...ctNondeterministicSubsequenceAutomaton.cpp | 23 +------------- ...xactNondeterministicSubsequenceAutomaton.h | 21 ++++++++++++- .../exact/ExactSubsequenceAutomaton.cpp | 30 +----------------- .../exact/ExactSubsequenceAutomaton.h | 31 +++++++++++++++++-- 4 files changed, 51 insertions(+), 54 deletions(-) diff --git a/alib2algo/src/stringology/exact/ExactNondeterministicSubsequenceAutomaton.cpp b/alib2algo/src/stringology/exact/ExactNondeterministicSubsequenceAutomaton.cpp index 255b022a57..d479520957 100644 --- a/alib2algo/src/stringology/exact/ExactNondeterministicSubsequenceAutomaton.cpp +++ b/alib2algo/src/stringology/exact/ExactNondeterministicSubsequenceAutomaton.cpp @@ -6,10 +6,6 @@ */ #include "ExactNondeterministicSubsequenceAutomaton.h" -#include <string/LinearString.h> -#include <string/Epsilon.h> - -#include <deque> namespace stringology { @@ -19,24 +15,7 @@ automaton::Automaton ExactNondeterministicSubsequenceAutomaton::construct(const return dispatch(text.getData()); } -automaton::EpsilonNFA < > ExactNondeterministicSubsequenceAutomaton::construct(const string::LinearString < >& text) { - automaton::EpsilonNFA < > res(DefaultStateType(0)); - res.addFinalState(DefaultStateType(0)); - res.setInputAlphabet(text.getAlphabet()); - - int i = 1; - for(const DefaultSymbolType& symbol : text.getContent()) { - res.addState(DefaultStateType(i)); - res.addFinalState(DefaultStateType(i)); - - res.addTransition(DefaultStateType(i-1), symbol, DefaultStateType(i)); - res.addTransition(DefaultStateType(i-1), DefaultStateType(i)); - i++; - } - return res; -} - -auto ExactNondeterministicSubsequenceAutomatonLinearString = ExactNondeterministicSubsequenceAutomaton::RegistratorWrapper<automaton::EpsilonNFA < >, string::LinearString < >>( ExactNondeterministicSubsequenceAutomaton::construct ); +auto ExactNondeterministicSubsequenceAutomatonLinearString = ExactNondeterministicSubsequenceAutomaton::RegistratorWrapper < automaton::EpsilonNFA < DefaultSymbolType, DefaultEpsilonType, unsigned >, string::LinearString < > > ( ExactNondeterministicSubsequenceAutomaton::construct ); } /* namespace exact */ diff --git a/alib2algo/src/stringology/exact/ExactNondeterministicSubsequenceAutomaton.h b/alib2algo/src/stringology/exact/ExactNondeterministicSubsequenceAutomaton.h index 7751087522..952da5cae8 100644 --- a/alib2algo/src/stringology/exact/ExactNondeterministicSubsequenceAutomaton.h +++ b/alib2algo/src/stringology/exact/ExactNondeterministicSubsequenceAutomaton.h @@ -26,9 +26,28 @@ public: */ static automaton::Automaton construct(const string::String& text); - static automaton::EpsilonNFA < > construct(const string::LinearString < >& text); + template < class SymbolType > + static automaton::EpsilonNFA < SymbolType, DefaultEpsilonType, unsigned > construct ( const string::LinearString < SymbolType > & text ); }; +template < class SymbolType > +automaton::EpsilonNFA < SymbolType, DefaultEpsilonType, unsigned > ExactNondeterministicSubsequenceAutomaton::construct ( const string::LinearString < SymbolType > & text ) { + automaton::EpsilonNFA < SymbolType, DefaultEpsilonType, unsigned > res ( 0 ); + res.addFinalState ( 0 ); + res.setInputAlphabet ( text.getAlphabet ( ) ); + + unsigned i = 1; + for ( const SymbolType & symbol : text.getContent ( ) ) { + res.addState ( i ); + res.addFinalState( i ); + + res.addTransition ( i - 1, symbol, i ); + res.addTransition ( i - 1, i ); + i++; + } + return res; +} + } /* namespace exact */ } /* namespace stringology */ diff --git a/alib2algo/src/stringology/exact/ExactSubsequenceAutomaton.cpp b/alib2algo/src/stringology/exact/ExactSubsequenceAutomaton.cpp index bb92c67a80..46cb28c63c 100644 --- a/alib2algo/src/stringology/exact/ExactSubsequenceAutomaton.cpp +++ b/alib2algo/src/stringology/exact/ExactSubsequenceAutomaton.cpp @@ -6,10 +6,6 @@ */ #include "ExactSubsequenceAutomaton.h" -#include <string/LinearString.h> -#include <string/Epsilon.h> - -#include <deque> namespace stringology { @@ -19,31 +15,7 @@ automaton::Automaton ExactSubsequenceAutomaton::construct(const string::String& return dispatch(text.getData()); } -automaton::DFA<> ExactSubsequenceAutomaton::construct(const string::LinearString < >& text) { - std::map<DefaultSymbolType, int> f; - for(const DefaultSymbolType& symbol : text.getAlphabet()) { - f[symbol] = 0; - } - - automaton::DFA<> res(DefaultStateType(0)); - res.addFinalState(DefaultStateType(0)); - res.setInputAlphabet(text.getAlphabet()); - - int i = 1; - for(const DefaultSymbolType& symbol : text.getContent()) { - res.addState(DefaultStateType(i)); - res.addFinalState(DefaultStateType(i)); - - for(int j = f[symbol]; j < i; j++) { - res.addTransition(DefaultStateType(j), symbol, DefaultStateType(i)); - } - f[symbol] = i; - i++; - } - return res; -} - -auto ExactSubsequenceAutomatonLinearString = ExactSubsequenceAutomaton::RegistratorWrapper<automaton::DFA<>, string::LinearString < >>(ExactSubsequenceAutomaton::construct); +auto ExactSubsequenceAutomatonLinearString = ExactSubsequenceAutomaton::RegistratorWrapper < automaton::DFA < DefaultSymbolType, unsigned >, string::LinearString < > > ( ExactSubsequenceAutomaton::construct ); } /* namespace exact */ diff --git a/alib2algo/src/stringology/exact/ExactSubsequenceAutomaton.h b/alib2algo/src/stringology/exact/ExactSubsequenceAutomaton.h index 2e5aca809c..c7cd07cb05 100644 --- a/alib2algo/src/stringology/exact/ExactSubsequenceAutomaton.h +++ b/alib2algo/src/stringology/exact/ExactSubsequenceAutomaton.h @@ -24,11 +24,38 @@ public: * Performs conversion. * @return left regular grammar equivalent to source automaton. */ - static automaton::Automaton construct(const string::String& text); + static automaton::Automaton construct ( const string::String & text ); - static automaton::DFA<> construct(const string::LinearString < >& text); + template < class SymbolType > + static automaton::DFA < SymbolType, unsigned > construct ( const string::LinearString < SymbolType > & text ); }; +template < class SymbolType > +automaton::DFA < SymbolType, unsigned > ExactSubsequenceAutomaton::construct ( const string::LinearString < SymbolType > & text ) { + std::map < SymbolType, unsigned > f; + for(const SymbolType & symbol : text.getAlphabet ( ) ) { + f[symbol] = 0; + } + + automaton::DFA < SymbolType, unsigned > res ( 0 ); + res.addFinalState ( 0 ); + res.setInputAlphabet ( text.getAlphabet ( ) ); + + unsigned i = 1; + for ( const SymbolType & symbol : text.getContent ( ) ) { + res.addState ( i ); + res.addFinalState ( i ); + + for ( unsigned j = f [ symbol ]; j < i; j++ ) { + res.addTransition ( j, symbol, i ); + } + f[symbol] = i; + i++; + } + + return res; +} + } /* namespace exact */ } /* namespace stringology */ -- GitLab