diff options
Diffstat (limited to 'src/cam/options.h')
-rw-r--r-- | src/cam/options.h | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/src/cam/options.h b/src/cam/options.h index b9b7bd25..8b611d37 100644 --- a/src/cam/options.h +++ b/src/cam/options.h @@ -17,8 +17,15 @@ enum OptionArgument { ArgumentOptional, }; +enum OptionType { + OptionNone, + OptionInteger, + OptionString, +}; + struct Option { int opt; + OptionType type; const char *name; OptionArgument argument; const char *argumentName; @@ -26,20 +33,45 @@ struct Option { bool hasShortOption() const { return isalnum(opt); } bool hasLongOption() const { return name != nullptr; } + const char *typeName() const; }; +class OptionValue; + template <typename T> class OptionsBase { public: bool valid() const; bool isSet(const T &opt) const; - const std::string &operator[](const T &opt) const; + const OptionValue &operator[](const T &opt) const; private: friend class OptionsParser; - std::map<T, std::string> values_; + + bool parseValue(const T &opt, const Option &option, const char *value); void clear(); + + std::map<T, OptionValue> values_; +}; + +class OptionValue +{ +public: + OptionValue(); + OptionValue(int value); + OptionValue(const char *value); + OptionValue(const std::string &value); + + OptionType type() const { return type_; } + + operator int() const; + operator std::string() const; + +private: + OptionType type_; + int integer_; + std::string string_; }; class OptionsParser @@ -49,7 +81,8 @@ public: { }; - bool addOption(int opt, const char *help, const char *name = nullptr, + bool addOption(int opt, OptionType type, const char *help, + const char *name = nullptr, OptionArgument argument = ArgumentNone, const char *argumentName = nullptr); @@ -57,6 +90,8 @@ public: void usage(); private: + void parseValueError(const Option &option); + std::list<Option> options_; std::map<unsigned int, Option *> optionsMap_; }; |