From b88cf8a417c3c86a4994a057d002a1f36a4b692a Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Tue, 19 Feb 2019 11:14:44 +0100
Subject: [PATCH] templatize string generate

---
 .../string/generate/RandomStringFactory.cpp   | 42 ++++---------
 .../src/string/generate/RandomStringFactory.h | 61 ++++++++++++++++++-
 ...ckwardNondeterministicDAWGMatchingTest.cpp |  2 +-
 .../stringology/query/DAWGMatcherTest.cpp     |  2 +-
 .../stringology/query/OracleMatcherTest.cpp   |  2 +-
 .../query/CompactSuffixAutomatonQueryTest.cpp |  2 +-
 6 files changed, 73 insertions(+), 38 deletions(-)

diff --git a/alib2algo/src/string/generate/RandomStringFactory.cpp b/alib2algo/src/string/generate/RandomStringFactory.cpp
index 8f2c9826ce..c2ed626b7a 100644
--- a/alib2algo/src/string/generate/RandomStringFactory.cpp
+++ b/alib2algo/src/string/generate/RandomStringFactory.cpp
@@ -8,10 +8,6 @@
 #include "RandomStringFactory.h"
 
 #include <alib/algorithm>
-#include <alib/random>
-#include <alib/vector>
-
-#include <exception/CommonException.h>
 
 #include <registration/AlgoRegistration.hpp>
 
@@ -19,58 +15,42 @@ namespace string {
 
 namespace generate {
 
-string::LinearString < > RandomStringFactory::generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet, bool integerSymbols ) {
+string::LinearString < std::string > RandomStringFactory::generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet, bool integerSymbols ) {
 	if ( !integerSymbols ) return generateLinearString ( size, alphabetSize, randomizedAlphabet );
 
 	if ( alphabetSize <= 0 )
 		throw exception::CommonException ( "Alphabet size must be greater than 0." );
 
-	ext::vector < DefaultSymbolType > elems;
+	ext::vector < std::string > elems;
 
 	for ( size_t i = 0; i < size; i++ )
-		elems.push_back ( DefaultSymbolType ( static_cast < int > ( ext::random_devices::semirandom ( ) % alphabetSize ) ) );
+		elems.push_back ( ext::to_string ( static_cast < int > ( ext::random_devices::semirandom ( ) % alphabetSize ) ) );
 
-	return string::LinearString < > ( elems );
+	return string::LinearString < std::string > ( elems );
 }
 
-auto GenerateLinearString1 = registration::AbstractRegister < RandomStringFactory, string::LinearString < >, size_t, size_t, bool, bool > ( RandomStringFactory::generateLinearString, abstraction::AlgorithmCategories::AlgorithmCategory::DEFAULT, "size", "alphabetSize", "randomizedAlphabet", "integerSymbols" );
+auto GenerateLinearString1 = registration::AbstractRegister < RandomStringFactory, string::LinearString < std::string >, size_t, size_t, bool, bool > ( RandomStringFactory::generateLinearString, abstraction::AlgorithmCategories::AlgorithmCategory::DEFAULT, "size", "alphabetSize", "randomizedAlphabet", "integerSymbols" );
 
-string::LinearString < > RandomStringFactory::generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet ) {
+string::LinearString < std::string > RandomStringFactory::generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet ) {
 	if ( alphabetSize > 26 )
 		throw exception::CommonException ( "Too big alphabet." );
 
 	if ( alphabetSize <= 0 )
 		throw exception::CommonException ( "Alphabet size must be greater than 0." );
 
-	ext::vector < DefaultSymbolType > symbols;
+	ext::vector < std::string > symbols;
 
-	for ( int i = 0; i < 26; i++ ) symbols.push_back ( DefaultSymbolType ( ( char ) ( i + 'a' ) ) );
+	for(char i = 'a'; i <= 'z'; i++)
+		symbols.push_back ( std::string ( 1, i ) );
 
 	if ( randomizedAlphabet ) shuffle ( symbols.begin ( ), symbols.end ( ), ext::random_devices::semirandom );
 
-	ext::set < DefaultSymbolType > alphabet ( symbols.begin ( ), symbols.begin ( ) + alphabetSize );
+	ext::set < std::string > alphabet ( symbols.begin ( ), symbols.begin ( ) + alphabetSize );
 
 	return RandomStringFactory::generateLinearString ( size, alphabet );
 }
 
-auto GenerateLinearString2 = registration::AbstractRegister < RandomStringFactory, string::LinearString < >, size_t, size_t, bool > ( RandomStringFactory::generateLinearString, abstraction::AlgorithmCategories::AlgorithmCategory::DEFAULT, "size", "alphabetSize", "randomizedAlphabet" );
-
-string::LinearString < > RandomStringFactory::generateLinearString ( size_t size, ext::set < DefaultSymbolType > alphabet ) {
-
-	if ( alphabet.size ( ) > 26 )
-		throw exception::CommonException ( "Too big alphabet." );
-
-	if ( alphabet.size ( ) <= 0 )
-		throw exception::CommonException ( "Alphabet size must be greater than 0." );
-
-	ext::vector < DefaultSymbolType > alphabetList ( alphabet.begin ( ), alphabet.end ( ) );
-	ext::vector < DefaultSymbolType > elems;
-
-	for ( size_t i = 0; i < size; i++ )
-		elems.push_back ( alphabetList[ext::random_devices::semirandom ( ) % alphabetList.size ( )] );
-
-	return string::LinearString < > ( elems );
-}
+auto GenerateLinearString2 = registration::AbstractRegister < RandomStringFactory, string::LinearString < std::string >, size_t, size_t, bool > ( RandomStringFactory::generateLinearString, abstraction::AlgorithmCategories::AlgorithmCategory::DEFAULT, "size", "alphabetSize", "randomizedAlphabet" );
 
 auto GenerateLinearString3 = registration::AbstractRegister < RandomStringFactory, string::LinearString < >, size_t, ext::set < DefaultSymbolType > > ( RandomStringFactory::generateLinearString, abstraction::AlgorithmCategories::AlgorithmCategory::DEFAULT, "size", "alphabet" );
 
diff --git a/alib2algo/src/string/generate/RandomStringFactory.h b/alib2algo/src/string/generate/RandomStringFactory.h
index 6a4782e800..e9ad4110ea 100644
--- a/alib2algo/src/string/generate/RandomStringFactory.h
+++ b/alib2algo/src/string/generate/RandomStringFactory.h
@@ -9,19 +9,74 @@
 #define RANDOM_STRING_FACTORY_H_
 
 #include <alib/set>
+#include <alib/random>
+#include <alib/vector>
+
+#include <exception/CommonException.h>
+
 #include <string/LinearString.h>
 
 namespace string {
 
 namespace generate {
 
+/**
+ * Generator of random strings.
+ *
+ */
 class RandomStringFactory {
 public:
-	static string::LinearString < > generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet, bool integerSymbols );
-	static string::LinearString < > generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet );
-	static string::LinearString < > generateLinearString ( size_t size, ext::set < DefaultSymbolType > alphabet );
+	/**
+	 * Generates a random string of given size.
+	 *
+	 * \param size the length of the generated string
+	 * \param alphabetSize size of the alphabet (1-26 for characters and 0-INT_MAX for integers)
+	 * \param randomizedAlphabet selects random symbols from a-z range if true
+	 * \param integerSymbols use integers as symbols in the generated string is true, randomize alphabet is not used if integer alphabet is requested
+	 *
+	 * \return random string
+	 */
+	static string::LinearString < std::string > generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet, bool integerSymbols );
+
+	/**
+	 * Generates a random string of given size.
+	 *
+	 * \param size the length of the generated string
+	 * \param alphabetSize size of the alphabet (1-26 for characters)
+	 * \param randomizedAlphabet selects random symbols from a-z range if true
+	 *
+	 * \return random string
+	 */
+	static string::LinearString < std::string > generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet );
+
+	/**
+	 * Generates a random string of given size
+	 * \tparam SymbolType the type of symbols of the random string
+	 *
+	 * \param size the length of the generated string
+	 * \param alphabet alphabet of the generated string
+	 *
+	 * \return random string
+	 */
+	template < class SymbolType >
+	static string::LinearString < SymbolType > generateLinearString ( size_t size, ext::set < SymbolType > alphabet );
 };
 
+template < class SymbolType >
+string::LinearString < SymbolType > RandomStringFactory::generateLinearString ( size_t size, ext::set < SymbolType > alphabet ) {
+
+	if ( alphabet.size ( ) <= 0 )
+		throw exception::CommonException ( "Alphabet size must be greater than 0." );
+
+	ext::vector < SymbolType > alphabetList ( alphabet.begin ( ), alphabet.end ( ) );
+	ext::vector < SymbolType > elems;
+
+	for ( size_t i = 0; i < size; i++ )
+		elems.push_back ( alphabetList[ext::random_devices::semirandom ( ) % alphabetList.size ( )] );
+
+	return string::LinearString < SymbolType > ( elems );
+}
+
 } /* namespace generate */
 
 } /* namespace string */
diff --git a/alib2algo/test-src/stringology/matching/BackwardNondeterministicDAWGMatchingTest.cpp b/alib2algo/test-src/stringology/matching/BackwardNondeterministicDAWGMatchingTest.cpp
index e42ddcdf27..e85af2b1f0 100644
--- a/alib2algo/test-src/stringology/matching/BackwardNondeterministicDAWGMatchingTest.cpp
+++ b/alib2algo/test-src/stringology/matching/BackwardNondeterministicDAWGMatchingTest.cpp
@@ -48,7 +48,7 @@ void BackwardNondeterministicDAWGMatchingTest::testBNDM ( ) {
 
 	auto longSubject = string::generate::RandomStringFactory::generateLinearString (64 * 64 * 64, 512, false, true);
 	auto longPattern = string::generate::RandomSubstringFactory::generateSubstring(64 * 32 * 32, longSubject );
-	indexes::stringology::BitSetIndex < > pattern = stringology::matching::BNDMMatcherConstruction::construct ( longPattern );
+	indexes::stringology::BitSetIndex < std::string > pattern = stringology::matching::BNDMMatcherConstruction::construct ( longPattern );
 	ext::set < unsigned > res = stringology::query::BNDMOccurrences::query ( pattern, longSubject );
 	ext::set < unsigned > ref = stringology::exact::ExactFactorMatch::match ( longSubject, longPattern );
 	std::cout << "long: " << res << std::endl;
diff --git a/alib2algo/test-src/stringology/query/DAWGMatcherTest.cpp b/alib2algo/test-src/stringology/query/DAWGMatcherTest.cpp
index 0aafbfbb75..7d7e5c66e1 100644
--- a/alib2algo/test-src/stringology/query/DAWGMatcherTest.cpp
+++ b/alib2algo/test-src/stringology/query/DAWGMatcherTest.cpp
@@ -46,7 +46,7 @@ void DAWGMatcherTest::testBackwardDAWGMatching ( ) {
 
 	auto longSubject = string::generate::RandomStringFactory::generateLinearString (64 * 64, 512, false, true);
 	auto longPattern = string::generate::RandomSubstringFactory::generateSubstring(64 * 5, longSubject );
-	indexes::stringology::SuffixAutomaton < > suffixAutomaton = stringology::matching::DAWGMatcherConstruction::construct ( longPattern );
+	indexes::stringology::SuffixAutomaton < std::string > suffixAutomaton = stringology::matching::DAWGMatcherConstruction::construct ( longPattern );
 	ext::set < unsigned > res = stringology::query::BackwardDAWGMatching::match ( longSubject, suffixAutomaton );
 	ext::set < unsigned > resRef = stringology::exact::ExactFactorMatch::match ( longSubject, longPattern );
 	std::cout << "long: " << res << std::endl;
diff --git a/alib2algo/test-src/stringology/query/OracleMatcherTest.cpp b/alib2algo/test-src/stringology/query/OracleMatcherTest.cpp
index 39bd8d76aa..a7f3515c08 100644
--- a/alib2algo/test-src/stringology/query/OracleMatcherTest.cpp
+++ b/alib2algo/test-src/stringology/query/OracleMatcherTest.cpp
@@ -45,7 +45,7 @@ void OracleMatcherTest::testBackwardOracleMatching ( ) {
 
 	auto longSubject = string::generate::RandomStringFactory::generateLinearString (64 * 64, 512, false, true);
 	auto longPattern = string::generate::RandomSubstringFactory::generateSubstring(64 * 5, longSubject );
-	automaton::DFA < DefaultSymbolType, unsigned > oracleAutomaton = stringology::matching::OracleMatcherConstruction::construct ( longPattern );
+	automaton::DFA < std::string, unsigned > oracleAutomaton = stringology::matching::OracleMatcherConstruction::construct ( longPattern );
 	ext::set < unsigned > res = stringology::query::BackwardOracleMatching::match ( longSubject, oracleAutomaton );
 	ext::set < unsigned > resRef = stringology::exact::ExactFactorMatch::match ( longSubject, longPattern );
 	std::cout << "long: " << res << std::endl;
diff --git a/alib2algo_experimental/test-src/stringology/query/CompactSuffixAutomatonQueryTest.cpp b/alib2algo_experimental/test-src/stringology/query/CompactSuffixAutomatonQueryTest.cpp
index faeec4e292..c4378aa609 100644
--- a/alib2algo_experimental/test-src/stringology/query/CompactSuffixAutomatonQueryTest.cpp
+++ b/alib2algo_experimental/test-src/stringology/query/CompactSuffixAutomatonQueryTest.cpp
@@ -49,7 +49,7 @@ void CompactSuffixAutomatonQueryTest::testCDAWG ( ) {
 	auto longSubject = string::generate::RandomStringFactory::generateLinearString (4000, 26, false, true);
 	auto longPattern = string::generate::RandomSubstringFactory::generateSubstring(2, longSubject );
 
-	indexes::stringology::CompactSuffixAutomatonTerminatingSymbol < > index = stringology::indexing::ExperimentalCompactSuffixAutomatonConstruct::construct ( longSubject );
+	indexes::stringology::CompactSuffixAutomatonTerminatingSymbol < std::string > index = stringology::indexing::ExperimentalCompactSuffixAutomatonConstruct::construct ( longSubject );
 
 	ext::set < unsigned > res = stringology::query::CompactSuffixAutomatonFactors::query ( index, longPattern );
 	ext::set < unsigned > ref = stringology::exact::ExactFactorMatch::match ( longSubject, longPattern );
-- 
GitLab