X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FParsedCommand.cti;h=0ba97d28b4546191b2a43cdfbc3e8fbcdc295194;hb=f9d24df84e9dd01127ebeabef977a22e379cb41d;hp=029fa2deddf61db82e7149b733e63075d85db2fe;hpb=81a550d520e8531b7f353e1ce0da5b99c249cecb;p=senf.git diff --git a/Console/ParsedCommand.cti b/Console/ParsedCommand.cti index 029fa2d..0ba97d2 100644 --- a/Console/ParsedCommand.cti +++ b/Console/ParsedCommand.cti @@ -67,14 +67,6 @@ prefix_ std::string senf::console::detail::ArgumentInfo::defaultV // senf::console::ParsedCommandOverloadBase template -prefix_ senf::console::detail::ArgumentInfo & -senf::console::ParsedCommandOverloadBase::arg(unsigned n) - const -{ - return dynamic_cast &>(arg(n)); -} - -template prefix_ void senf::console::ParsedCommandOverloadBase::addParameter() { parameters_.push_back(detail::ArgumentInfo::create()); @@ -89,24 +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; -} - -template -prefix_ void senf::console::ParsedCommandAttributorBase::parser(Fn fn) - const -{ - overload().arg(index_).parser = fn; -} - -/////////////////////////////////////////////////////////////////////////// // senf::console::ParsedCommandAttributor template @@ -306,7 +280,8 @@ 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 @@ -314,7 +289,7 @@ template prefix_ void senf::console::ParsedArgumentAttributor::parser(Fn fn) const { - ParsedCommandAttributorBase::parser(fn); + this->overload().arg().parser = fn; } /////////////////////////////////////////////////////////////////////////// @@ -324,14 +299,25 @@ template prefix_ senf::console::ParsedArgumentAttributor:: ParsedArgumentAttributor(Overload & overload) - : ParsedArgumentAttributorBase< Overload, - ParsedArgumentAttributor > (overload, index) + : 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 ?? @@ -347,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) @@ -366,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::ParsedArgumentAttributor< - 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 ParsedArgumentAttributor 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::ParsedArgumentAttributor< - 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 ParsedArgumentAttributor 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///////////////////////////////////////