From 9cecb8602f1fbfa5bcd5c9389f86f7bc64d5aa3c Mon Sep 17 00:00:00 2001 From: Riyyi Date: Thu, 9 Sep 2021 00:12:06 +0200 Subject: [PATCH] Util: Add more ArgParser argument types --- src/util/argparser.cpp | 132 +++++++++++++++++++++++++++++++++++++++++ src/util/argparser.h | 6 ++ 2 files changed, 138 insertions(+) diff --git a/src/util/argparser.cpp b/src/util/argparser.cpp index d43ae2f..0c489a1 100644 --- a/src/util/argparser.cpp +++ b/src/util/argparser.cpp @@ -456,6 +456,42 @@ void ArgParser::addArgument(Argument&& argument) m_arguments.push_back(argument); } +void ArgParser::addArgument(bool& value, const char* name, const char* usageString, const char* manString, Required required) +{ + size_t minValues = required == Required::Yes ? 1 : 0; + Argument argument { + name, + usageString, + manString, + minValues, + 1, + 0, + [&value](const char*) -> bool { + value = true; + return true; + } + }; + addArgument(std::move(argument)); +} + +void ArgParser::addArgument(const char*& value, const char* name, const char* usageString, const char* manString, Required required) +{ + size_t minValues = required == Required::Yes ? 1 : 0; + Argument argument { + name, + usageString, + manString, + minValues, + 1, + 0, + [&value](const char* a) -> bool { + value = a; + return true; + } + }; + addArgument(std::move(argument)); +} + void ArgParser::addArgument(std::string& value, const char* name, const char* usageString, const char* manString, Required required) { size_t minValues = required == Required::Yes ? 1 : 0; @@ -474,6 +510,102 @@ void ArgParser::addArgument(std::string& value, const char* name, const char* us addArgument(std::move(argument)); } +void ArgParser::addArgument(std::string_view& value, const char* name, const char* usageString, const char* manString, Required required) +{ + size_t minValues = required == Required::Yes ? 1 : 0; + Argument argument { + name, + usageString, + manString, + minValues, + 1, + 0, + [&value](const char* a) -> bool { + value = a; + return true; + } + }; + addArgument(std::move(argument)); +} + +void ArgParser::addArgument(int& value, const char* name, const char* usageString, const char* manString, Required required) +{ + size_t minValues = required == Required::Yes ? 1 : 0; + Argument argument { + name, + usageString, + manString, + minValues, + 1, + 0, + [&value](const char* a) -> bool { + try { + value = std::stoi(a); + return true; + } + catch (...) { + return false; + } + } + }; + addArgument(std::move(argument)); +} + + +void ArgParser::addArgument(unsigned int& value, const char* name, const char* usageString, const char* manString, Required required) +{ + size_t minValues = required == Required::Yes ? 1 : 0; + Argument argument { + name, + usageString, + manString, + minValues, + 1, + 0, + [&value](const char* a) -> bool { + unsigned long convert = 0; + try { + convert = std::stoul(a); + } + catch (...) { + return false; + } + + if (convert <= std::numeric_limits::max()) { + value = static_cast(convert); + return true; + } + + return false; + } + }; + addArgument(std::move(argument)); +} + + +void ArgParser::addArgument(double& value, const char* name, const char* usageString, const char* manString, Required required) +{ + size_t minValues = required == Required::Yes ? 1 : 0; + Argument argument { + name, + usageString, + manString, + minValues, + 1, + 0, + [&value](const char* a) -> bool { + try { + value = std::stod(a); + return true; + } + catch (...) { + return false; + } + } + }; + addArgument(std::move(argument)); +} + void ArgParser::addArgument(std::vector& values, const char* name, const char* usageString, const char* manString, Required required) { size_t minValues = required == Required::Yes ? 1 : 0; diff --git a/src/util/argparser.h b/src/util/argparser.h index b35e582..ff7cc2f 100644 --- a/src/util/argparser.h +++ b/src/util/argparser.h @@ -63,7 +63,13 @@ public: void addOption(std::vector& values, char shortName, const char* longName, const char* usageString, const char* manString, const char* argumentName = "", Required requiresArgument = Required::No); void addArgument(Argument&& argument); + void addArgument(bool& value, const char* name, const char* usageString, const char* manString, Required required = Required::No); + void addArgument(const char*& value, const char* name, const char* usageString, const char* manString, Required required = Required::No); void addArgument(std::string& value, const char* name, const char* usageString, const char* manString, Required required = Required::No); + void addArgument(std::string_view& value, const char* name, const char* usageString, const char* manString, Required required = Required::No); + void addArgument(int& value, const char* name, const char* usageString, const char* manString, Required required = Required::No); + void addArgument(unsigned int& value, const char* name, const char* usageString, const char* manString, Required required = Required::No); + void addArgument(double& value, const char* name, const char* usageString, const char* manString, Required required = Required::No); void addArgument(std::vector& values, const char* name, const char* usageString, const char* manString, Required required = Required::No); void setErrorReporting(bool state) { m_errorReporting = state; }