X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FParsedCommand.cti;h=0ba97d28b4546191b2a43cdfbc3e8fbcdc295194;hb=ca70e274a556bf217f3f4c7b12e0fad2a7cd4853;hp=9abe00dc94db72123cdb54d42984234c95e41900;hpb=f47679431aa3461936ee4a85c0c4216e44292b55;p=senf.git diff --git a/Console/ParsedCommand.cti b/Console/ParsedCommand.cti index 9abe00d..0ba97d2 100644 --- a/Console/ParsedCommand.cti +++ b/Console/ParsedCommand.cti @@ -28,26 +28,48 @@ // Custom includes #include "../Utils/membind.hh" #include -#include +#include "../Utils/parameter.hh" #define prefix_ inline ///////////////////////////////cti.p/////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// -// senf::console::ParsedCommandOverloadBase +// senf::console::detail::ArgumentInfoBase -template -prefix_ senf::console::detail::ParameterInfo & -senf::console::ParsedCommandOverloadBase::arg(unsigned n) +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 dynamic_cast &>(arg(n)); + return hasDefault ? ArgumentTraits::str(defaultValue) : ""; } +/////////////////////////////////////////////////////////////////////////// +// senf::console::ParsedCommandOverloadBase + template prefix_ void senf::console::ParsedCommandOverloadBase::addParameter() { - parameters_.push_back(detail::ParameterInfo::create()); + parameters_.push_back(detail::ArgumentInfo::create()); } /////////////////////////////////////////////////////////////////////////// @@ -59,17 +81,6 @@ prefix_ void senf::console::ParsedCommandOverloadBase::addParameter() #include BOOST_PP_ITERATE() /////////////////////////////////////////////////////////////////////////// -// senf::console::ParsedCommandAttributorBase - -template -prefix_ void senf::console::ParsedCommandAttributorBase::defaultValue(Type const & value) - const -{ - overload().arg(index_).defaultValue = value; - overload().arg(index_).hasDefault = true; -} - -/////////////////////////////////////////////////////////////////////////// // senf::console::ParsedCommandAttributor template @@ -87,11 +98,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); @@ -99,7 +144,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 { @@ -109,17 +154,17 @@ 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_ typename senf::console::ParsedAttributeAttributor::next_type -senf::console::ParsedAttributeAttributor::arg() +prefix_ typename senf::console::ParsedArgumentAttributor::next_type +senf::console::ParsedArgumentAttributor::arg() const { return next(); @@ -127,17 +172,20 @@ senf::console::ParsedAttributeAttributor::arg() template template -prefix_ typename senf::console::ParsedAttributeAttributor::next_type -senf::console::ParsedAttributeAttributor:: +prefix_ typename senf::console::ParsedArgumentAttributor::next_type +senf::console::ParsedArgumentAttributor:: argInfo(ArgumentPack const & args) const { -# define HaveArg(tag) boost::is_same< \ - typename boost::parameter::binding::type, void >() +# define ProcessArg(tag) \ + argInfo( kw:: tag, args, senf::has_parameter< ArgumentPack, kw::type:: tag >() ) - argInfo( kw::name, args, HaveArg(kw::type::name) ); - argInfo( kw::description, args, HaveArg(kw::type::description) ); - argInfo( kw::default_value, args, HaveArg(kw::type::default_value) ); + ProcessArg(name); + ProcessArg(description); + ProcessArg(default_value); + ProcessArg(type_name); + ProcessArg(default_doc); + ProcessArg(parser); return next(); @@ -146,16 +194,16 @@ argInfo(ArgumentPack const & args) template template -prefix_ void senf::console::ParsedAttributeAttributor:: -argInfo(Kw const &, ArgumentPack const &, boost::mpl::true_) +prefix_ void senf::console::ParsedArgumentAttributor:: +argInfo(Kw const &, ArgumentPack const &, boost::mpl::false_) const {} template template -prefix_ void senf::console::ParsedAttributeAttributor:: +prefix_ void senf::console::ParsedArgumentAttributor:: argInfo(boost::parameter::keyword const &, ArgumentPack const & args, - boost::mpl::false_) + boost::mpl::true_) const { this->argName(args[kw::name]); @@ -163,9 +211,9 @@ argInfo(boost::parameter::keyword const &, ArgumentPack const & template template -prefix_ void senf::console::ParsedAttributeAttributor:: +prefix_ void senf::console::ParsedArgumentAttributor:: argInfo(boost::parameter::keyword const &, ArgumentPack const & args, - boost::mpl::false_) + boost::mpl::true_) const { this->argDoc(args[kw::description]); @@ -173,52 +221,103 @@ argInfo(boost::parameter::keyword const &, ArgumentPack c template template -prefix_ void senf::console::ParsedAttributeAttributor:: +prefix_ void senf::console::ParsedArgumentAttributor:: argInfo(boost::parameter::keyword const &, ArgumentPack const & args, - boost::mpl::false_) + 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_ typename senf::console::ParsedAttributeAttributor::next_type -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); + this->overload().arg().defaultValue = value; + this->overload().arg(index).hasDefault = true; +} + +template +template +prefix_ void senf::console::ParsedArgumentAttributor::parser(Fn fn) + const +{ + this->overload().arg().parser = fn; } /////////////////////////////////////////////////////////////////////////// -// senf::console::ParsedAttributeAttributor +// senf::console::ParsedArgumentAttributor template prefix_ -senf::console::ParsedAttributeAttributor:: -ParsedAttributeAttributor(Overload & overload) - : ParsedAttributeAttributorBase< Overload, - ParsedAttributeAttributor > (overload, index) +senf::console::ParsedArgumentAttributor:: +ParsedArgumentAttributor(Overload & overload) + : ParsedArgumentAttributorBase< + Overload, ParsedArgumentAttributor > (overload, index) {} /////////////////////////////////////////////////////////////////////////// // namespace members -namespace { +namespace senf { +namespace console { +namespace detail { + +#ifndef DOXYGEN + + struct ParsedCommandAddNodeAccess + { + template + static Attributor attributor(Node & node) + { return Attributor(node); } + }; // What is THIS about ?? @@ -234,14 +333,16 @@ namespace { // If however, it does NOT take an std::ostream first argument, 'ignoreOneArg' will be true and // the create member will use boost::bind to DROP the first argument. - template + template struct CreateParsedCommandOverload {}; template struct CreateParsedCommandOverload { - typedef Traits traits; + typedef typename Traits::traits traits; template static typename senf::console::ParsedCommandOverload::ptr create(Function fn) @@ -253,51 +354,51 @@ namespace { 4)) # include BOOST_PP_ITERATE() -} + template + typename senf::console::detail::ParsedCommandTraits::Attributor + addOverloadedCommandNode(senf::console::DirectoryNode & node, std::string const & name, Fn fn) + { + senf::console::OverloadedCommandNode & cmdNode ( + node.hasChild(name) + ? dynamic_cast(node(name)) + : node.add(name, senf::console::OverloadedCommandNode::create()) ); + + typedef senf::console::detail::ParsedCommandTraits CmdTraits; + typedef senf::console::ParsedCommandOverload Overload; + typedef senf::console::ParsedArgumentAttributor Attributor; + + return senf::console::detail::ParsedCommandAddNodeAccess::attributor( + cmdNode.add( CreateParsedCommandOverload::create(fn) ) ); + } + +#endif + +}}} template -prefix_ senf::console::ParsedAttributeAttributor< - senf::console::ParsedCommandOverload< - typename senf::console::detail::ParsedCommandTraits::traits> > +typename senf::console::detail::ParsedCommandTraits::Attributor senf::console::senf_console_add_node(DirectoryNode & node, std::string const & name, Function fn, int) { - OverloadedCommandNode & cmdNode ( - node.hasChild(name) - ? dynamic_cast(node(name)) - : node.add(name, OverloadedCommandNode::create()) ); - - typedef detail::ParsedCommandTraits CmdTraits; - typedef ParsedCommandOverload Overload; - typedef ParsedAttributeAttributor Attributor; - - return Attributor( - cmdNode.add( CreateParsedCommandOverload< - typename CmdTraits::traits, ! CmdTraits::has_ostream_arg>::create(fn) ) ); + return senf::console::detail::addOverloadedCommandNode(node, name, fn); +} + +template +typename senf::console::detail::ParsedCommandTraits::Attributor +senf::console::senf_console_add_node(DirectoryNode & node, std::string const & name, + boost::function fn, int) +{ + return senf::console::detail::addOverloadedCommandNode(node, name, fn); } template -prefix_ senf::console::ParsedAttributeAttributor< - senf::console::ParsedCommandOverload< - typename senf::console::detail::ParsedCommandTraits::traits> > -senf::console:: -senf_console_add_node(DirectoryNode & node, Owner & owner, std::string const & name, - Function fn, int, - typename boost::enable_if_c::is_member>::type *) +typename senf::console::detail::ParsedCommandTraits::Attributor +senf::console::senf_console_add_node(DirectoryNode & node, Owner & owner, std::string const & name, + Function fn, int, + typename boost::enable_if_c::is_member>::type *) { - OverloadedCommandNode & cmdNode ( - node.hasChild(name) - ? dynamic_cast(node(name)) - : node.add(name, OverloadedCommandNode::create()) ); - - typedef detail::ParsedCommandTraits CmdTraits; - typedef ParsedCommandOverload Overload; - typedef ParsedAttributeAttributor Attributor; - - return Attributor( - cmdNode.add( CreateParsedCommandOverload< - typename CmdTraits::traits, ! CmdTraits::has_ostream_arg>::create( - senf::membind(fn,&owner)) ) ); + return senf::console::detail::addOverloadedCommandNode( + node, name, senf::membind(fn,&owner)); } ///////////////////////////////cti.e///////////////////////////////////////