/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright (C) 2019, Google Inc. * * options.h - cam - Options parsing */ #ifndef __CAM_OPTIONS_H__ #define __CAM_OPTIONS_H__ #include #include #include #include #include class KeyValueParser; class OptionValue; struct Option; enum OptionArgument { ArgumentNone, ArgumentRequired, ArgumentOptional, }; enum OptionType { OptionNone, OptionInteger, OptionString, OptionKeyValue, }; template class OptionsBase { public: OptionsBase() : valid_(false) {} bool empty() const; bool valid() const; bool isSet(const T &opt) const; const OptionValue &operator[](const T &opt) const; void invalidate(); private: friend class KeyValueParser; friend class OptionsParser; bool parseValue(const T &opt, const Option &option, const char *value); std::map values_; bool valid_; }; class KeyValueParser { public: class Options : public OptionsBase { }; KeyValueParser(); virtual ~KeyValueParser(); bool addOption(const char *name, OptionType type, const char *help, OptionArgument argument = ArgumentNone); virtual Options parse(const char *arguments); private: KeyValueParser(const KeyValueParser &) = delete; KeyValueParser &operator=(const KeyValueParser &) = delete; friend class OptionsParser; unsigned int maxOptionLength() const; void usage(int indent); std::map optionsMap_; }; class OptionsParser { public: class Options : public OptionsBase { }; OptionsParser(); ~OptionsParser(); bool addOption(int opt, OptionType type, const char *help, const char *name = nullptr, OptionArgument argument = ArgumentNone, const char *argumentName = nullptr, bool array = false, int parent = 0); bool addOption(int opt, KeyValueParser *parser, const char *help, const char *name = nullptr, bool array = false, int parent = 0); Options parse(int argc, char *argv[]); void usage(); private: OptionsParser(const OptionsParser &) = delete; OptionsParser &operator=(const OptionsParser &) = delete; void usageOptions(const std::list