X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=include%2Foption.h;h=935914e86112dca86c6e8bf5fad935785773c843;hb=395cd2099ecba699dcad270fa1fb42c1d8603ece;hp=a77d8f446d19f179b9799ae5f7393d23c4240042;hpb=c85d60a873e21052a470c172df4ba56a1c0d59c6;p=command.git diff --git a/include/option.h b/include/option.h index a77d8f4..935914e 100644 --- a/include/option.h +++ b/include/option.h @@ -10,7 +10,7 @@ namespace command { /** * Class responsible for handling commandline options. - * Options are non-required, named parameters of program. + * Options are named parameters of program. * * Example: * ./myprog OptionName=OptionValue @@ -26,16 +26,13 @@ namespace command { /** * Current Option name */ - OptionName name; + const OptionName name; /** * Current Option value */ OptionType value; - /** Variable indicating if current Option was already used or not */ - bool used = false; - public: /** * Default constructor. @@ -44,7 +41,7 @@ namespace command { * @param description Description of current Option * @param function Function used to handle current Option. */ - Option(std::string name, const std::string & description, void (*function)(OptionType)) + Option(const std::string & name, const std::string & description, void (*function)(OptionType)) : Parameter(description), Callable(function), name(name) { } @@ -87,18 +84,21 @@ namespace command { * @throw std::invalid_argument when OptionValue part failed conversion * to OptionType */ - virtual bool understand(const std::string & argv) { - if ((!used) && - (argv.find(name) == 0)) { + virtual bool understand(const std::string & argv) + throw(std::invalid_argument) { + + if ((!isUsed()) && (argv.find(name) == 0)) { std::size_t pos = argv.find("="); + if (pos != name.size()) { throw std::invalid_argument("Option: " + name + " requires value but no one has been provided"); } std::stringstream ss; - ss << argv.substr(pos + 1); - ss >> value; + ss >> value;// memory leak? when uncommented and exception is + // thrown, valgrind shows e.g.: + // possibly lost: 380 bytes in 7 blocks if (ss.fail()) { throw std::invalid_argument("Value for option: " + name + " failed conversion to the required type"); @@ -132,11 +132,7 @@ namespace command { /** * Current Option name */ - OptionName name; - - /** Variable indicating if current Option was already used or not */ - bool used = false; - + const OptionName name; public: /** * Default constructor. @@ -145,15 +141,10 @@ namespace command { * @param description Description of current Option * @param function Function used to handle current Option. */ - Option(std::string name, const std::string & description, void (*function)(void)) + Option(const std::string & name, const std::string & description, void (*function)(void)) : Parameter(description), Callable(function), name(name) { } - /** - * - */ - virtual ~Option() { } - /** * */ @@ -177,7 +168,7 @@ namespace command { * used to check against next value. */ virtual bool understand(const std::string & argv) { - if ((!used) && + if ((!isUsed()) && (argv == name)) { used = true; return true;