diff --git a/ArgsParser/argsparser.cpp b/ArgsParser/argsparser.cpp index 7fb3af6..0a1b8e6 100644 --- a/ArgsParser/argsparser.cpp +++ b/ArgsParser/argsparser.cpp @@ -34,7 +34,7 @@ bool __FloatArgvImpl::optional() const { } QString args_parse::FloatKeyValue::placeHolder() const { - if(optional()) + if (optional()) return QString("[--%1 <%2>]").arg(bindKey(), bindKey()); return QString("--%1 <%2>").arg(bindKey(), bindKey()); } @@ -76,7 +76,7 @@ FloatOption::FloatOption(const QString& key, const QString& means, bool opt) } QString args_parse::FloatOption::placeHolder() const { - if(optional()) + if (optional()) return QString("[--%1]").arg(bindKey()); return QString("--%1").arg(bindKey()); } @@ -91,74 +91,71 @@ bool FloatOption::parse(const QList args, int start) { return args_t == bindKey(); } -namespace args_parse { - class MatchMode { - private: - QList> args_mode; - int code_store; +MatchMode::MatchMode(const QList> mode, int mode_code) + :args_mode(mode), code_store(mode_code) { } - public: - explicit MatchMode(const QList> mode, int mode_code) - :args_mode(mode), code_store(mode_code) { } +/** +* @brief 获取模式代码 +* @return 模式代码 +*/ - /** - * @brief 获取模式代码 - * @return 模式代码 - */ - int modeCode()const { - return code_store; - } - /** - * @brief 获取模式匹配结果 - * @return 模式匹配结果 - */ - QList> result() const { - return args_mode; - } - /** - * @brief 解析匹配参数 - */ - bool parse(const QList& args, int argv_index, int parse_index) { - if (argv_index >= args.size()) - return true; - - // 获取模式匹配单元 - auto parse_unit = args_mode[parse_index]; - switch (parse_unit->paramType()) { - case ParamType::IndexParam:// 固定位置索引匹配 - { - parse_unit->parse(args, argv_index); - // 继续匹配下一个为止 - return parse(args, argv_index + parse_unit->matchLenth(), parse_index + 1); - }break; - case ParamType::FloatParam:// 浮动参数匹配 - { - QList> float_parsers; - - for (auto& unit : args_mode) { - if (unit->paramType() == ParamType::FloatParam) - float_parsers << dynamic_pointer_cast<__FloatArgvImpl>(unit); - } - - for (auto& unit : float_parsers) { - if (unit->matchLenth() + argv_index > args.size()) - continue; - - auto result = unit->parse(args, argv_index); - if (result) - if (parse(args, argv_index + unit->matchLenth(), parse_index + 1)) - return true; - else if (!result && unit->optional()) - if (parse(args, argv_index, parse_index + 1)) - return true; - } - }break; - } - - return false; - } - }; +int MatchMode::modeCode() const { + return code_store; } + +/** +* @brief 获取模式匹配结果 +* @return 模式匹配结果 +*/ + +QList> MatchMode::result() const { + return args_mode; +} + +/** +* @brief 解析匹配参数 +*/ + +bool MatchMode::parse(const QList& args, int argv_index, int parse_index) { + if (argv_index >= args.size()) + return true; + + // 获取模式匹配单元 + auto parse_unit = args_mode[parse_index]; + switch (parse_unit->paramType()) { + case ParamType::IndexParam:// 固定位置索引匹配 + { + parse_unit->parse(args, argv_index); + // 继续匹配下一个为止 + return parse(args, argv_index + parse_unit->matchLenth(), parse_index + 1); + }break; + case ParamType::FloatParam:// 浮动参数匹配 + { + QList> float_parsers; + + for (auto& unit : args_mode) { + if (unit->paramType() == ParamType::FloatParam) + float_parsers << dynamic_pointer_cast<__FloatArgvImpl>(unit); + } + + for (auto& unit : float_parsers) { + if (unit->matchLenth() + argv_index > args.size()) + continue; + + auto result = unit->parse(args, argv_index); + if (result) + if (parse(args, argv_index + unit->matchLenth(), parse_index + 1)) + return true; + else if (!result && unit->optional()) + if (parse(args, argv_index, parse_index + 1)) + return true; + } + }break; + } + + return false; +} + void ArgsParser::loadMode(int mode_code, const QList>& args_model) { this->match_modes.append(make_shared(args_model, mode_code)); } diff --git a/ArgsParser/argsparser.h b/ArgsParser/argsparser.h index d2a32eb..3b72ec6 100644 --- a/ArgsParser/argsparser.h +++ b/ArgsParser/argsparser.h @@ -87,6 +87,13 @@ namespace args_parse { */ class ARGSPARSER_EXPORT FloatKeyValue : public __FloatArgvImpl { public: + /** + * 浮动key-value解析单元. + * + * \param key 键名 + * \param means 参数解释 + * \param optional 是否可选 + */ explicit FloatKeyValue(const QString& key, const QString &means, bool optional = false); virtual ~FloatKeyValue() = default; @@ -101,6 +108,13 @@ namespace args_parse { */ class ARGSPARSER_EXPORT FloatOption : public __FloatArgvImpl { public: + /** + * 浮动option解析单元. + * + * \param key 键名 + * \param means 参数解释 + * \param optional 是否可选 + */ explicit FloatOption(const QString& key, const QString& means, bool optional = false); virtual ~FloatOption() = default; @@ -126,7 +140,30 @@ namespace args_parse { bool parse(const QList args, int start) override; }; - class MatchMode; + class ARGSPARSER_EXPORT MatchMode { + private: + QList> args_mode; + int code_store; + + public: + explicit MatchMode(const QList> mode, int mode_code); + + /** + * @brief 获取模式代码 + * @return 模式代码 + */ + int modeCode()const; + /** + * @brief 获取模式匹配结果 + * @return 模式匹配结果 + */ + QList> result() const; + /** + * @brief 解析匹配参数 + */ + bool parse(const QList& args, int argv_index, int parse_index); + }; + class ARGSPARSER_EXPORT ArgsParser { private: QList> match_modes;