Commit f48f8acb authored by Jan Trávníček's avatar Jan Trávníček
Browse files

algo: reduce copying in random string factory

parent cb0064be
Loading
Loading
Loading
Loading
Loading
+13 −5
Original line number Diff line number Diff line
@@ -31,16 +31,17 @@ string::LinearString < std::string > string::generate::RandomStringFactory::gene
	if ( alphabetSize <= 0 )
		throw exception::CommonException ( "Alphabet size must be greater than 0." );
	ext::vector < std::string > symbols;
	ext::vector < std::string > alphabet;
	alphabet.reserve ( 'z' - 'a' + 1 );
	for(char i = 'a'; i <= 'z'; i++)
		symbols.push_back ( std::string ( 1, i ) );
		alphabet.emplace_back ( 1, i );
	if ( randomizedAlphabet ) shuffle ( symbols.begin ( ), symbols.end ( ), ext::random_devices::semirandom );
	if ( randomizedAlphabet ) shuffle ( alphabet.begin ( ), alphabet.end ( ), ext::random_devices::semirandom );
	ext::set < std::string > alphabet ( symbols.begin ( ), symbols.begin ( ) + alphabetSize );
	alphabet.resize ( alphabetSize );
	return string::generate::RandomStringFactory::generateLinearString ( size, alphabet );
	return string::generate::RandomStringFactory::generateLinearString ( size, std::move ( alphabet ) );
}
} /* namespace string::generate */
@@ -71,4 +72,11 @@ auto GenerateLinearString3 = registration::AbstractRegister < string::generate::
@param alphabet alphabet of the generated string\n\
@return random string" );
auto GenerateLinearString4 = registration::AbstractRegister < string::generate::RandomStringFactory, string::LinearString < >, size_t, ext::vector < DefaultSymbolType > > ( string::generate::RandomStringFactory::generateLinearString, abstraction::AlgorithmCategories::AlgorithmCategory::DEFAULT, "size", "alphabet" ).setDocumentation (
"Generates a random string of given size\n\
\n\
@param size the length of the generated string\n\
@param alphabet alphabet of the generated string\n\
@return random string" );
} /* namespace */
+18 −2
Original line number Diff line number Diff line
@@ -53,19 +53,35 @@ public:
	 */
	template < class SymbolType >
	static string::LinearString < SymbolType > generateLinearString ( size_t size, ext::set < SymbolType > alphabet );
	/**
	 * 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::vector < SymbolType > alphabet );
};
template < class SymbolType >
string::LinearString < SymbolType > RandomStringFactory::generateLinearString ( size_t size, ext::set < SymbolType > alphabet ) {
	return generateLinearString ( size, ext::vector < SymbolType > ( alphabet.begin ( ), alphabet.end ( ) ) );
}
template < class SymbolType >
string::LinearString < SymbolType > RandomStringFactory::generateLinearString ( size_t size, ext::vector < SymbolType > alphabet ) {
	if ( alphabet.empty ( ) )
		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 ( )] );
		elems.push_back ( alphabet [ ext::random_devices::semirandom ( ) % alphabet.size ( ) ] );
	return string::LinearString < SymbolType > ( elems );
}