#include "args.hh" #include #include #include #include #include #include #include #include #include #include #include #include #include namespace { std::string kEmpty; class OptionImpl : public Args::OptionArgument { public: enum Type : uint8_t { NoArgument, RequiredArgument, OptionalArgument, }; OptionImpl(Type type, char shortname, std::string longname, std::string arg, std::string help) : type(type), shortname(shortname), longname(std::move(longname)), arg(std::move(arg)), help(std::move(help)) {} const Type type; const char shortname; const std::string longname; const std::string arg; const std::string help; [[nodiscard]] bool is_set() const override { return is_set_; } [[nodiscard]] bool has_argument() const override { return value_.has_value(); } [[nodiscard]] const std::string& argument() const override { if (value_.has_value()) return value_.value(); assert(false); return kEmpty; } void clear() { is_set_ = false; value_.reset(); } void set_argument(std::string value) { assert(type == Type::RequiredArgument || type == Type::OptionalArgument); is_set_ = true; value_ = std::move(value); } void set_no_argument() { assert(type == Type::NoArgument || type == Type::OptionalArgument); is_set_ = true; value_.reset(); } private: bool is_set_{false}; std::optional value_; }; class ArgsImpl : public Args { public: explicit ArgsImpl(std::string prgname) : prgname_(std::move(prgname)) {} std::shared_ptr