diff options
Diffstat (limited to 'src/lib/netlist/plib/poptions.h')
-rw-r--r-- | src/lib/netlist/plib/poptions.h | 398 |
1 files changed, 204 insertions, 194 deletions
diff --git a/src/lib/netlist/plib/poptions.h b/src/lib/netlist/plib/poptions.h index aa2608c2c91..a758c446ff9 100644 --- a/src/lib/netlist/plib/poptions.h +++ b/src/lib/netlist/plib/poptions.h @@ -1,264 +1,274 @@ -// license:GPL-2.0+ +// license:BSD-3-Clause // copyright-holders:Couriersud -/* - * poptions.h - * - */ - -#pragma once #ifndef POPTIONS_H_ #define POPTIONS_H_ -#include "plists.h" +/// +/// \file poptions.h +/// + +#include "pfmtlog.h" +#include "pstonum.h" #include "pstring.h" #include "putil.h" namespace plib { -/*************************************************************************** - Options -***************************************************************************/ -class options; + /// \brief options base class + /// + class options; -class option_base -{ -public: - option_base(options &parent, const pstring &help); - virtual ~option_base() = default; + class option_base + { + public: + option_base(options &parent, const pstring &help); + virtual ~option_base() = default; - COPYASSIGNMOVE(option_base, delete) + PCOPYASSIGNMOVE(option_base, delete) - pstring help() const { return m_help; } -private: - pstring m_help; -}; + virtual pstring help() const { return m_help; } + private: + pstring m_help; + }; -class option_group : public option_base -{ -public: - option_group(options &parent, const pstring &group, const pstring &help) - : option_base(parent, help), m_group(group) { } + class option_group : public option_base + { + public: + option_group(options &parent, const pstring &group, const pstring &help) + : option_base(parent, help), m_group(group) { } - pstring group() const { return m_group; } -private: - pstring m_group; -}; + pstring group() const { return m_group; } + private: + pstring m_group; + }; -class option_example : public option_base -{ -public: - option_example(options &parent, const pstring &group, const pstring &help) - : option_base(parent, help), m_example(group) { } + class option_example : public option_base + { + public: + option_example(options &parent, const pstring &group, const pstring &help) + : option_base(parent, help), m_example(group) { } - pstring example() const { return m_example; } -private: - pstring m_example; -}; + pstring example() const { return m_example; } + private: + pstring m_example; + }; -class option : public option_base -{ -public: - option(options &parent, const pstring &ashort, const pstring &along, const pstring &help, bool has_argument); + class option : public option_base + { + public: + option(options &parent, const pstring &short_opt, const pstring &long_opt, const pstring &help, bool has_argument); - /* no_argument options will be called with "" argument */ + // no_argument options will be called with "" argument - pstring short_opt() { return m_short; } - pstring long_opt() { return m_long; } - bool has_argument() { return m_has_argument ; } - bool was_specified() { return m_specified; } + pstring short_opt() const { return m_short; } + pstring long_opt() const { return m_long; } + bool has_argument() const { return m_has_argument ; } + bool was_specified() const { return m_specified; } - int do_parse(const pstring &argument) - { - m_specified = true; - return parse(argument); - } + int do_parse(const pstring &argument) + { + m_specified = true; + return parse(argument); + } -protected: - virtual int parse(const pstring &argument) = 0; + protected: + virtual int parse(const pstring &argument) = 0; -private: - pstring m_short; - pstring m_long; - bool m_has_argument; - bool m_specified; -}; + private: + pstring m_short; + pstring m_long; + bool m_has_argument; + bool m_specified; + }; -class option_str : public option -{ -public: - option_str(options &parent, const pstring &ashort, const pstring &along, const pstring &defval, const pstring &help) - : option(parent, ashort, along, help, true), m_val(defval) - {} + class option_str : public option + { + public: + option_str(options &parent, const pstring &short_opt, const pstring &long_opt, const pstring &default_value, const pstring &help) + : option(parent, short_opt, long_opt, help, true), m_val(default_value) + {} - pstring operator ()() const { return m_val; } + pstring operator ()() const { return m_val; } -protected: - int parse(const pstring &argument) override; + protected: + int parse(const pstring &argument) override; -private: - pstring m_val; -}; + private: + pstring m_val; + }; -class option_str_limit_base : public option -{ -public: - option_str_limit_base(options &parent, const pstring &ashort, const pstring &along, std::vector<pstring> &&limit, const pstring &help) - : option(parent, ashort, along, help, true) - , m_limit(limit) + class option_str_limit_base : public option { - } - const std::vector<pstring> &limit() const { return m_limit; } + public: + option_str_limit_base(options &parent, const pstring &short_opt, const pstring &long_opt, std::vector<pstring> &&limit, const pstring &help) + : option(parent, short_opt, long_opt, help, true) + , m_limit(limit) + { + } + const std::vector<pstring> &limit() const { return m_limit; } -protected: + protected: -private: - std::vector<pstring> m_limit; -}; + private: + std::vector<pstring> m_limit; + }; -template <typename T> -class option_str_limit : public option_str_limit_base -{ -public: - option_str_limit(options &parent, const pstring &ashort, const pstring &along, const T &defval, std::vector<pstring> &&limit, const pstring &help) - : option_str_limit_base(parent, ashort, along, std::move(limit), help), m_val(defval) + template <typename T> + class option_str_limit : public option_str_limit_base { - } - - T operator ()() const { return m_val; } + public: + option_str_limit(options &parent, const pstring &short_opt, const pstring &long_opt, const T &default_value, std::vector<pstring> &&limit, const pstring &help) + : option_str_limit_base(parent, short_opt, long_opt, std::move(limit), help), m_val(default_value) + { + } - pstring as_string() const { return limit()[m_val]; } + T operator ()() const { return m_val; } -protected: - int parse(const pstring &argument) override - { - auto raw = plib::container::indexof(limit(), argument); + pstring as_string() const { return limit()[m_val]; } - if (raw != plib::container::npos) + protected: + int parse(const pstring &argument) override { - m_val = static_cast<T>(raw); - return 0; - } - else + auto raw = plib::container::index_of(limit(), argument); + + if (raw != plib::container::npos) + { + m_val = narrow_cast<T>(raw); + return 0; + } + return 1; - } + } -private: - T m_val; -}; + private: + T m_val; + }; -class option_bool : public option -{ -public: - option_bool(options &parent, const pstring &ashort, const pstring &along, const pstring &help) - : option(parent, ashort, along, help, false), m_val(false) - {} + class option_bool : public option + { + public: + option_bool(options &parent, const pstring &short_opt, const pstring &long_opt, const pstring &help) + : option(parent, short_opt, long_opt, help, false), m_val(false) + {} - bool operator ()() const { return m_val; } + bool operator ()() const { return m_val; } -protected: - int parse(const pstring &argument) override; + protected: + int parse(const pstring &argument) override; -private: - bool m_val; -}; + private: + bool m_val; + }; -template <typename T> -class option_num : public option -{ -public: - option_num(options &parent, const pstring &ashort, const pstring &along, T defval, - const pstring &help, - T minval = std::numeric_limits<T>::min(), - T maxval = std::numeric_limits<T>::max() ) - : option(parent, ashort, along, help, true) - , m_val(defval) - , m_min(minval) - , m_max(maxval) - {} - - T operator ()() const { return m_val; } - -protected: - int parse(const pstring &argument) override + template <typename T> + class option_num : public option { - bool err; - m_val = pstonum_ne<T, true>(argument, err); - return (err ? 1 : (m_val < m_min || m_val > m_max)); - } + public: + option_num(options &parent, const pstring &short_opt, const pstring &long_opt, T default_value, + const pstring &help, + T min_val = std::numeric_limits<T>::lowest(), + T max_val = std::numeric_limits<T>::max() ) + : option(parent, short_opt, long_opt, help, true) + , m_val(default_value) + , m_min(min_val) + , m_max(max_val) + , m_def(default_value) + {} + + T operator ()() const { return m_val; } + + pstring help() const override + { + auto hs(option::help()); + return plib::pfmt(hs)(m_def, m_min, m_max); + } -private: - T m_val; - T m_min; - T m_max; -}; + protected: + int parse(const pstring &argument) override + { + bool err(false); + m_val = pstonum_ne<T>(argument, err); + return (err ? 1 : (m_val < m_min || m_val > m_max)); + } -class option_vec : public option -{ -public: - option_vec(options &parent, const pstring &ashort, const pstring &along, const pstring &help) - : option(parent, ashort, along, help, true) - {} + private: + T m_val; + T m_min; + T m_max; + T m_def; + }; - const std::vector<pstring> &operator ()() const { return m_val; } + class option_vec : public option + { + public: + option_vec(options &parent, const pstring &short_opt, const pstring &long_opt, const pstring &help) + : option(parent, short_opt, long_opt, help, true) + {} -protected: - int parse(const pstring &argument) override; + const std::vector<pstring> &operator ()() const { return m_val; } -private: - std::vector<pstring> m_val; -}; + protected: + int parse(const pstring &argument) override; -class option_args : public option_vec -{ -public: - option_args(options &parent, const pstring &help) - : option_vec(parent, "", "", help) - {} -}; + private: + std::vector<pstring> m_val; + }; -class options : public nocopyassignmove -{ -public: + class option_args : public option_vec + { + public: + option_args(options &parent, const pstring &help) + : option_vec(parent, "", "", help) + {} + }; - options(); - explicit options(option **o); + class options + { + public: - void register_option(option_base *opt); - int parse(int argc, char **argv); + options(); + explicit options(option **o); - pstring help(const pstring &description, const pstring &usage, - unsigned width = 72, unsigned indent = 20) const; + ~options() = default; - pstring app() const { return m_app; } + PCOPYASSIGNMOVE(options, delete) -private: - static pstring split_paragraphs(const pstring &text, unsigned width, unsigned indent, - unsigned firstline_indent); + void register_option(option_base *opt); + std::size_t parse(const std::vector<putf8string> &argv); - void check_consistency(); + pstring help(const pstring &description, const pstring &usage, + unsigned width = 72, unsigned indent = 20) const; - template <typename T> - T *getopt_type() const - { - for (auto & optbase : m_opts ) + pstring app() const { return m_app; } + + private: + static pstring split_paragraphs(const pstring &text, unsigned width, unsigned indent, + unsigned first_line_indent, const pstring &line_end = "\n"); + + void check_consistency() noexcept(false); + + template <typename T> + T *getopt_type() const { - if (auto opt = dynamic_cast<T *>(optbase)) - return opt; - } + for (const auto & base_class : m_options ) + { + if (auto opt = dynamic_cast<T *>(base_class)) + return opt; + } return nullptr; } - option *getopt_short(const pstring &arg) const; - option *getopt_long(const pstring &arg) const; + option *getopt_short(const pstring &arg) const; + option *getopt_long(const pstring &arg) const; - std::vector<option_base *> m_opts; - pstring m_app; - option_args * m_other_args; + std::vector<option_base *> m_options; + pstring m_app; + option_args * m_other_args; }; } // namespace plib -#endif /* POPTIONS_H_ */ +#endif // POPTIONS_H_ |