diff --git a/alib2algo/src/string/generate/RandomSubstringFactory.cpp b/alib2algo/src/string/generate/RandomSubstringFactory.cpp index 2e89b51746ec9ac40527f3a86f7a8bc5e78218af..69964684be1c23cc78529211f1425aeb119109dc 100644 --- a/alib2algo/src/string/generate/RandomSubstringFactory.cpp +++ b/alib2algo/src/string/generate/RandomSubstringFactory.cpp @@ -17,6 +17,10 @@ namespace string { namespace generate { +string::String RandomSubstringFactory::generateSubstring ( size_t size, const string::String & v ) { + return getInstance ( ).dispatch ( size, v.getData ( ) ); +} + string::LinearString RandomSubstringFactory::generateSubstring ( size_t size, const string::LinearString & string ) { if ( size > string.getContent ( ).size ( ) ) throw exception::AlibException ( "String not long enough" ); diff --git a/alib2algo/src/string/generate/RandomSubstringFactory.h b/alib2algo/src/string/generate/RandomSubstringFactory.h index 182d1da35b345f5e560198b1952f12ff013e0a66..9d3895fda27a86c1a19b1ecc82d60dae2e0e8b7f 100644 --- a/alib2algo/src/string/generate/RandomSubstringFactory.h +++ b/alib2algo/src/string/generate/RandomSubstringFactory.h @@ -16,8 +16,10 @@ namespace string { namespace generate { -class RandomSubstringFactory : public std::SingleDispatchFirstStaticParam < string::LinearString, size_t, string::StringBase > { +class RandomSubstringFactory : public std::SingleDispatchFirstStaticParam < string::String, size_t, string::StringBase > { public: + static string::String generateSubstring ( size_t size, const string::String & ); + static string::LinearString generateSubstring ( size_t size, const string::LinearString & ); static RandomSubstringFactory & getInstance ( ) { diff --git a/arand2/src/arand.cpp b/arand2/src/arand.cpp index 2972586cf2747c735d466b5b5217e3d20f27f980..0d796fd892943f5b6bab531b1633eb32007feeb3 100644 --- a/arand2/src/arand.cpp +++ b/arand2/src/arand.cpp @@ -8,12 +8,15 @@ #include <tclap/CmdLine.h> #include <global/GlobalData.h> #include <measure> +#include <sax/FromXMLParserHelper.h> +#include <string/String.h> #include <factory/XmlDataFactory.hpp> #include "automaton/generate/RandomAutomatonFactory.h" #include "grammar/generate/RandomGrammarFactory.h" #include "regexp/generate/RandomRegExpFactory.h" #include "string/generate/RandomStringFactory.h" +#include "string/generate/RandomSubstringFactory.h" #include "tree/generate/RandomTreeFactory.h" int main ( int argc, char * argv[] ) { @@ -25,6 +28,7 @@ int main ( int argc, char * argv[] ) { allowed.push_back ( "CFG" ); allowed.push_back ( "RE" ); allowed.push_back ( "ST" ); + allowed.push_back ( "SST" ); allowed.push_back ( "UT" ); allowed.push_back ( "UP" ); allowed.push_back ( "RT" ); @@ -64,6 +68,9 @@ int main ( int argc, char * argv[] ) { TCLAP::ValueArg < int > maxRank ( "", "rank", "Maximal rank of tree nodes", false, 5, "integer" ); cmd.add ( maxRank ); + TCLAP::ValueArg < std::string > input ( "i", "input", "Input to use in generation", false, "-", "file" ); + cmd.add ( input ); + TCLAP::SwitchArg measure ( "m", "measure", "Measure times", false ); cmd.add ( measure ); @@ -72,9 +79,10 @@ int main ( int argc, char * argv[] ) { cmd.parse ( argc, argv ); - if(verbose.isSet()) + if ( verbose.isSet ( ) ) common::GlobalData::verbose = true; - if(measure.isSet()) + + if ( measure.isSet ( ) ) common::GlobalData::measure = true; measurements::start ( "Overal", measurements::Type::OVERALL ); @@ -124,6 +132,17 @@ int main ( int argc, char * argv[] ) { measurements::end ( ); measurements::start ( "Output write", measurements::Type::AUXILIARY ); + alib::XmlDataFactory::toStdout ( res ); + } else if ( type.getValue ( ) == "SST" ) { + string::String baseString = alib::XmlDataFactory::fromTokens < string::String > ( sax::FromXMLParserHelper::parseInput ( input ) ); + + measurements::start ( "Algorithm", measurements::Type::MAIN ); + + string::String res = string::generate::RandomSubstringFactory::generateSubstring ( length.getValue ( ), baseString ); + + measurements::end ( ); + measurements::start ( "Output write", measurements::Type::AUXILIARY ); + alib::XmlDataFactory::toStdout ( res ); } else if ( type.getValue ( ) == "UT" ) { measurements::start ( "Algorithm", measurements::Type::MAIN );