From 10cf89043c3473781985e6c9f42f688a8e4bd54a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Radovan=20=C4=8Cerven=C3=BD?= <radovan.cerveny@gmail.com>
Date: Sat, 12 Mar 2016 09:37:08 +0100
Subject: [PATCH] changed RandomStringGenerator to allow bigger alphabets with
 integer symbols

---
 .../src/string/generate/RandomStringFactory.cpp    | 14 ++++++++++++++
 .../src/string/generate/RandomStringFactory.h      |  1 +
 arand2/src/arand.cpp                               |  5 ++++-
 3 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/alib2algo/src/string/generate/RandomStringFactory.cpp b/alib2algo/src/string/generate/RandomStringFactory.cpp
index b09850e974..91a6d35daa 100644
--- a/alib2algo/src/string/generate/RandomStringFactory.cpp
+++ b/alib2algo/src/string/generate/RandomStringFactory.cpp
@@ -17,6 +17,20 @@ namespace string {
 
 namespace generate {
 
+string::LinearString RandomStringFactory::generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet, bool integerSymbols ) {
+	if ( !integerSymbols ) return generateLinearString ( size, alphabetSize, randomizedAlphabet );
+
+	if ( alphabetSize <= 0 )
+		throw exception::AlibException ( "Alphabet size must be greater than 0." );
+
+	std::vector < alphabet::Symbol > elems;
+
+	for ( size_t i = 0; i < size; i++ )
+		elems.push_back ( alphabet::symbolFrom ( static_cast < int > ( std::random_devices::semirandom ( ) % alphabetSize ) ) );
+
+	return string::LinearString ( elems );
+}
+
 string::LinearString RandomStringFactory::generateLinearString ( size_t size, size_t alphabetSize, bool randomizedAlphabet ) {
 	if ( alphabetSize > 26 )
 		throw exception::AlibException ( "Too big alphabet." );
diff --git a/alib2algo/src/string/generate/RandomStringFactory.h b/alib2algo/src/string/generate/RandomStringFactory.h
index 7b5e784efb..39f1a8e394 100644
--- a/alib2algo/src/string/generate/RandomStringFactory.h
+++ b/alib2algo/src/string/generate/RandomStringFactory.h
@@ -17,6 +17,7 @@ namespace generate {
 
 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, std::set < alphabet::Symbol > alphabet );
 };
diff --git a/arand2/src/arand.cpp b/arand2/src/arand.cpp
index 0d796fd892..19a66ba102 100644
--- a/arand2/src/arand.cpp
+++ b/arand2/src/arand.cpp
@@ -41,6 +41,9 @@ int main ( int argc, char * argv[] ) {
 		TCLAP::ValueArg < int > alphabetSize ( "", "terminals", "Number of terminals/alphabet size", false, 3, "integer" );
 		cmd.add ( alphabetSize );
 
+		TCLAP::SwitchArg integerSymbols ( "", "integerSymbols", "Use integer symbols instead of char symbols", false );
+		cmd.add ( integerSymbols );
+
 		TCLAP::SwitchArg randomizedAlphabet ( "", "randomizedTerminals", "Number of terminals/alphabet size", false );
 		cmd.add ( randomizedAlphabet );
 
@@ -127,7 +130,7 @@ int main ( int argc, char * argv[] ) {
 		} else if ( type.getValue ( ) == "ST" ) {
 			measurements::start ( "Algorithm", measurements::Type::MAIN );
 
-			string::LinearString res = string::generate::RandomStringFactory::generateLinearString ( length.getValue ( ), alphabetSize.getValue ( ), randomizedAlphabet.getValue ( ) );
+			string::LinearString res = string::generate::RandomStringFactory::generateLinearString ( length.getValue ( ), alphabetSize.getValue ( ), randomizedAlphabet.getValue ( ), integerSymbols.getValue ( ) );
 
 			measurements::end ( );
 			measurements::start ( "Output write", measurements::Type::AUXILIARY );
-- 
GitLab