#pragma once #include "argtype.h" // The Parameter class describes both parameters (in definitions) and // arguments (in applications). Parameters are the primary concept: // a designer declares parameters, and a writer supplies arguments to // fill them. The class is named for the definition side because // definitions come first; the Argument alias is used at application sites. class Parameter { public: Parameter() : m_name("_default") , m_argtype(Argtype()) , m_optional(false) , m_default("") , m_loc() , m_target() {}; Parameter(const std::string& name, const Argtype& argtype, const Locator& loc, bool optional=false, const std::string& default_value = ""); ~Parameter() = default; bool undefined() const { return m_name == "_default"; }; std::string m_name {}; Argtype m_argtype; // {}; bool m_optional {}; std::string m_default {}; // Where m_default came from, for kdesc provenance display. Default // resolution has three levels -- the argument type's :default, an option // set's declaration, and the site where the set is used (or the klammer's // own parameter list) -- and a reader of kdesc is entitled to know which // one produced the value a klammer will use when the argument is absent. // True when m_default was filled from the argument type's :default: bool m_default_from_type {}; // The option set (".o" target) this parameter was declared in; empty when // it was declared in the klammer's own parameter list. std::string m_option_set {}; // True when the option set declares a default for this parameter and the // declaration using the set overrode it. bool m_default_overridden {}; Locator m_loc; std::string m_target {}; }; using Argument = Parameter;