From 6e5ddb3c80fdd346199040fda570cca8f00d3c8e Mon Sep 17 00:00:00 2001 From: karsten Date: Thu, 16 Dec 2021 12:21:10 +0100 Subject: [PATCH] Parsing command line args --- CMakeLists.txt | 2 +- Parameters.hpp | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++ main.cpp | 26 +++++++++++++------ 3 files changed, 88 insertions(+), 8 deletions(-) create mode 100644 Parameters.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 253f540..a2437d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,6 +6,6 @@ cmake_minimum_required (VERSION 3.8) project ("ParallelSearch") # Fügen Sie der ausführbaren Datei dieses Projekts eine Quelle hinzu. -add_executable (ParallelSearch "main.cpp" "TestRunner.hpp" "ParallelSearch.hpp") +add_executable (ParallelSearch "main.cpp" "TestRunner.hpp" "ParallelSearch.hpp" "Parameters.hpp") # TODO: Fügen Sie bei Bedarf Tests hinzu, und installieren Sie Ziele. diff --git a/Parameters.hpp b/Parameters.hpp new file mode 100644 index 0000000..3e0b42f --- /dev/null +++ b/Parameters.hpp @@ -0,0 +1,68 @@ +#ifndef PARAMETERS_HPP +#define PARAMETERS_HPP + +#include +#include +#include + +class Parameters +{ +public: + Parameters(): + workerCount_(std::thread::hardware_concurrency()), + testDataLength_(4), + searchPattern_("ABC") + {}; + + ~Parameters() {}; + + bool parseCmdLine(int argc, char** argv) + { + for (int i = 1; i < argc; i++) + { + std::string arg = argv[i]; + if (0 == arg.compare(0, 2, "-w")) + { + workerCount_ = std::stoi(arg.substr(2)); + } + else if (0 == arg.compare(0, 2, "-l")) + { + testDataLength_ = std::stoi(arg.substr(2)); + } + else if (0 == arg.compare(0, 1, "-")) + { + // invalid option + return false; + } + else + { + // no leading dash ... must be pattern + searchPattern_ = arg; + } + } + + return true; + } + + void show_usage(const char* cmd) + { + std::cerr << "Invalid command line args" << std::endl; + std::cerr + << "Usage: " << cmd << " [options] [search_pattern]" << std::endl + << "Options" << std::endl + << " -wX Number of parallel workers" << std::endl + << " -lY Length of test-data string" << std::endl + << std::endl; + }; + + unsigned WorkerCount() const { return workerCount_; }; + unsigned TestDataLength() const { return testDataLength_; }; + std::string SearchPattern() const { return searchPattern_; }; + +private: + unsigned workerCount_; + unsigned testDataLength_; + std::string searchPattern_; +}; + +#endif diff --git a/main.cpp b/main.cpp index 67ea0be..ee273eb 100644 --- a/main.cpp +++ b/main.cpp @@ -3,10 +3,11 @@ #include #include #include -#include + #include "ParallelSearch.hpp" #include "TestRunner.hpp" +#include "Parameters.hpp" // Type of our hay stack: a list of strings typedef std::vector WordList; @@ -39,31 +40,42 @@ void run_wordsearch(ParallelWordSearch& search) } -int main() +int main(int argc, char** argv) { + Parameters parameters; double time_span; - std::string pattern = "ABC"; - unsigned workerCount = std::thread::hardware_concurrency(); WordList test_data; + std::cout << "ParallelSearch Demo" << std::endl << std::endl; + + if (false == parameters.parseCmdLine(argc, argv)) + { + parameters.show_usage(argv[0]); + exit(1); + } + + std::cout << "Workercount: " << parameters.WorkerCount() << std::endl; + std::cout << "Testdata length: " << parameters.TestDataLength() << std::endl; + std::cout << "Search pattern: " << parameters.SearchPattern() << std::endl; + std::cout << std::endl; + time_span = TestRunner(create_testdata, test_data); std::cout << "created test_data (" << test_data.size() << " words) " << time_span << " seconds" << std::endl; time_span = TestRunner(shuffle_testdata, test_data); std::cout << "shuffled test_data " << time_span << " seconds" << std::endl; - ParallelWordSearch wordSearch(1, test_data.begin(), test_data.end(), pattern); + ParallelWordSearch wordSearch(1, test_data.begin(), test_data.end(), parameters.SearchPattern()); time_span = TestRunner(run_wordsearch, wordSearch); std::cout << "linear search found " << wordSearch.get_result().size() << " matches: " << time_span << " seconds" << std::endl; - ParallelWordSearch parallelWordSearch(workerCount, test_data.begin(), test_data.end(), pattern); + ParallelWordSearch parallelWordSearch(parameters.WorkerCount(), test_data.begin(), test_data.end(), parameters.SearchPattern()); time_span = TestRunner(run_wordsearch, parallelWordSearch); std::cout << "parallel search found " << parallelWordSearch.get_result().size() << " matches: " << time_span << " seconds" << std::endl; // TODO add validation of results // TODO brush up output - // TODO command line args for workerCount, test-pattern generation, search pattern ? std::cout << std::endl;