X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FParsedCommand.cti;h=029fa2deddf61db82e7149b733e63075d85db2fe;hb=81a550d520e8531b7f353e1ce0da5b99c249cecb;hp=6809191b0c422a64aa9fe0687e34f946b348f770;hpb=869df8df564cd4f4934d4cd1c1b290c2aeabbd92;p=senf.git diff --git a/Console/ParsedCommand.cti b/Console/ParsedCommand.cti index 6809191..029fa2d 100644 --- a/Console/ParsedCommand.cti +++ b/Console/ParsedCommand.cti @@ -28,25 +28,56 @@ // Custom includes #include "../Utils/membind.hh" #include +#include "../Utils/parameter.hh" #define prefix_ inline ///////////////////////////////cti.p/////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// +// senf::console::detail::ArgumentInfoBase + +prefix_ senf::console::detail::ArgumentInfoBase::ArgumentInfoBase(std::string const & type_) + : type (type_), name (), hasDefault (false) +{} + +/////////////////////////////////////////////////////////////////////////// +// senf::console::detail::ArgumentInfo + +template +prefix_ typename senf::console::detail::ArgumentInfo::ptr +senf::console::detail::ArgumentInfo::create() +{ + return ptr(new ArgumentInfo()); +} + +template +prefix_ senf::console::detail::ArgumentInfo::ArgumentInfo() + : ArgumentInfoBase ( ArgumentTraits::description() ), + defaultValue () +{} + +template +prefix_ std::string senf::console::detail::ArgumentInfo::defaultValueStr() + const +{ + return hasDefault ? ArgumentTraits::str(defaultValue) : ""; +} + +/////////////////////////////////////////////////////////////////////////// // senf::console::ParsedCommandOverloadBase template -prefix_ senf::console::detail::ParameterInfo & +prefix_ senf::console::detail::ArgumentInfo & senf::console::ParsedCommandOverloadBase::arg(unsigned n) const { - return dynamic_cast &>(arg(n)); + return dynamic_cast &>(arg(n)); } template prefix_ void senf::console::ParsedCommandOverloadBase::addParameter() { - parameters_.push_back(detail::ParameterInfo::create()); + parameters_.push_back(detail::ArgumentInfo::create()); } /////////////////////////////////////////////////////////////////////////// @@ -68,6 +99,13 @@ prefix_ void senf::console::ParsedCommandAttributorBase::defaultValue(Type const overload().arg(index_).hasDefault = true; } +template +prefix_ void senf::console::ParsedCommandAttributorBase::parser(Fn fn) + const +{ + overload().arg(index_).parser = fn; +} + /////////////////////////////////////////////////////////////////////////// // senf::console::ParsedCommandAttributor @@ -86,11 +124,45 @@ senf::console::ParsedCommandAttributor::ParsedCommandAttributor(Overlo {} /////////////////////////////////////////////////////////////////////////// -// senf::console::ParsedAttributeAttributorBase +// senf::console::ParsedArgumentAttributorBase + +template +prefix_ Self +senf::console::ParsedArgumentAttributorBase::doc(std::string const & doc) + const +{ + this->ParsedCommandAttributorBase::nodeDoc(doc); + return static_cast(*this); +} + +template +prefix_ Self senf::console::ParsedArgumentAttributorBase:: +overloadDoc(std::string const & doc) + const +{ + this->ParsedCommandAttributorBase::overloadDoc(doc); + return static_cast(*this); +} + +template +prefix_ Self senf::console::ParsedArgumentAttributorBase:: +formatter(typename Overload::Formatter f) + const +{ + this->overload().formatter(f); + return static_cast(*this); +} + +template +prefix_ +senf::console::ParsedArgumentAttributorBase:: +ParsedArgumentAttributorBase(Overload & overload, unsigned index) + : ParsedCommandAttributor (overload, index) +{} template prefix_ Self -senf::console::ParsedAttributeAttributorBase::doc(std::string const & doc) +senf::console::ParsedArgumentAttributorBase::doc(std::string const & doc) const { this->ParsedCommandAttributorBase::nodeDoc(doc); @@ -98,7 +170,7 @@ senf::console::ParsedAttributeAttributorBase::doc(std::string con } template -prefix_ Self senf::console::ParsedAttributeAttributorBase:: +prefix_ Self senf::console::ParsedArgumentAttributorBase:: overloadDoc(std::string const & doc) const { @@ -108,69 +180,152 @@ overloadDoc(std::string const & doc) template prefix_ -senf::console::ParsedAttributeAttributorBase:: -ParsedAttributeAttributorBase(Overload & overload, unsigned index) +senf::console::ParsedArgumentAttributorBase:: +ParsedArgumentAttributorBase(Overload & overload, unsigned index) : ParsedCommandAttributor (overload, index) {} /////////////////////////////////////////////////////////////////////////// -// senf::console::ParsedAttributeAttributor +// senf::console::ParsedArgumentAttributor template -prefix_ senf::console::ParsedAttributeAttributor -senf::console::ParsedAttributeAttributor::arg(std::string const & name, - std::string const & doc) +prefix_ typename senf::console::ParsedArgumentAttributor::next_type +senf::console::ParsedArgumentAttributor::arg() const { - this->argName(name); - this->argDoc(doc); return next(); } template -prefix_ senf::console::ParsedAttributeAttributor -senf::console::ParsedAttributeAttributor::arg(std::string const & name, - std::string const & doc, - value_type const & value) +template +prefix_ typename senf::console::ParsedArgumentAttributor::next_type +senf::console::ParsedArgumentAttributor:: +argInfo(ArgumentPack const & args) const { - this->argName(name); - this->argDoc(doc); - defaultValue(value); +# define ProcessArg(tag) \ + argInfo( kw:: tag, args, senf::has_parameter< ArgumentPack, kw::type:: tag >() ) + + ProcessArg(name); + ProcessArg(description); + ProcessArg(default_value); + ProcessArg(type_name); + ProcessArg(default_doc); + ProcessArg(parser); + return next(); + +# undef HaveArg +} + +template +template +prefix_ void senf::console::ParsedArgumentAttributor:: +argInfo(Kw const &, ArgumentPack const &, boost::mpl::false_) + const +{} + +template +template +prefix_ void senf::console::ParsedArgumentAttributor:: +argInfo(boost::parameter::keyword const &, ArgumentPack const & args, + boost::mpl::true_) + const +{ + this->argName(args[kw::name]); +} + +template +template +prefix_ void senf::console::ParsedArgumentAttributor:: +argInfo(boost::parameter::keyword const &, ArgumentPack const & args, + boost::mpl::true_) + const +{ + this->argDoc(args[kw::description]); +} + +template +template +prefix_ void senf::console::ParsedArgumentAttributor:: +argInfo(boost::parameter::keyword const &, ArgumentPack const & args, + boost::mpl::true_) + const +{ + this->defaultValue(args[kw::default_value]); +} + +template +template +prefix_ void senf::console::ParsedArgumentAttributor:: +argInfo(boost::parameter::keyword const &, ArgumentPack const & args, + boost::mpl::true_) + const +{ + this->typeName(args[kw::type_name]); +} + +template +template +prefix_ void senf::console::ParsedArgumentAttributor:: +argInfo(boost::parameter::keyword const &, ArgumentPack const & args, + boost::mpl::true_) + const +{ + BOOST_STATIC_ASSERT(( senf::has_parameter::value )); + this->defaultDoc(args[kw::default_doc]); +} + +template +template +prefix_ void senf::console::ParsedArgumentAttributor:: +argInfo(boost::parameter::keyword const &, ArgumentPack const & args, + boost::mpl::true_) + const +{ + this->parser(args[kw::parser]); } template prefix_ -senf::console::ParsedAttributeAttributor:: -ParsedAttributeAttributor(Overload & overload) - : ParsedAttributeAttributorBase (overload, index) +senf::console::ParsedArgumentAttributor:: +ParsedArgumentAttributor(Overload & overload) + : ParsedArgumentAttributorBase (overload, index) {} template -prefix_ senf::console::ParsedAttributeAttributor -senf::console::ParsedAttributeAttributor::next() +prefix_ typename senf::console::ParsedArgumentAttributor::next_type +senf::console::ParsedArgumentAttributor::next() const { - return ParsedAttributeAttributor(this->overload()); + return ParsedArgumentAttributor(this->overload()); } template -prefix_ void senf::console::ParsedAttributeAttributor:: +prefix_ void senf::console::ParsedArgumentAttributor:: defaultValue(value_type const & value) const { - ParsedCommandAttributorBase::defaultValue(value); + ParsedCommandAttributorBase::defaultValue(value); +} + +template +template +prefix_ void senf::console::ParsedArgumentAttributor::parser(Fn fn) + const +{ + ParsedCommandAttributorBase::parser(fn); } /////////////////////////////////////////////////////////////////////////// -// senf::console::ParsedAttributeAttributor +// senf::console::ParsedArgumentAttributor template prefix_ -senf::console::ParsedAttributeAttributor:: -ParsedAttributeAttributor(Overload & overload) - : ParsedAttributeAttributorBase (overload, index) +senf::console::ParsedArgumentAttributor:: +ParsedArgumentAttributor(Overload & overload) + : ParsedArgumentAttributorBase< Overload, + ParsedArgumentAttributor > (overload, index) {} /////////////////////////////////////////////////////////////////////////// @@ -214,7 +369,7 @@ namespace { } template -prefix_ senf::console::ParsedAttributeAttributor< +prefix_ senf::console::ParsedArgumentAttributor< senf::console::ParsedCommandOverload< typename senf::console::detail::ParsedCommandTraits::traits> > senf::console::senf_console_add_node(DirectoryNode & node, std::string const & name, @@ -227,7 +382,7 @@ senf::console::senf_console_add_node(DirectoryNode & node, std::string const & n typedef detail::ParsedCommandTraits CmdTraits; typedef ParsedCommandOverload Overload; - typedef ParsedAttributeAttributor Attributor; + typedef ParsedArgumentAttributor Attributor; return Attributor( cmdNode.add( CreateParsedCommandOverload< @@ -235,7 +390,7 @@ senf::console::senf_console_add_node(DirectoryNode & node, std::string const & n } template -prefix_ senf::console::ParsedAttributeAttributor< +prefix_ senf::console::ParsedArgumentAttributor< senf::console::ParsedCommandOverload< typename senf::console::detail::ParsedCommandTraits::traits> > senf::console:: @@ -250,7 +405,7 @@ senf_console_add_node(DirectoryNode & node, Owner & owner, std::string const & n typedef detail::ParsedCommandTraits CmdTraits; typedef ParsedCommandOverload Overload; - typedef ParsedAttributeAttributor Attributor; + typedef ParsedArgumentAttributor Attributor; return Attributor( cmdNode.add( CreateParsedCommandOverload<