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