X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FParsedCommand.cti;h=e37906c81b4a5a91fa8d2e5b7b4d9517defd406e;hb=259da4c692259311c6ec99566b57f5ed1e68e93e;hp=86a78fc4fe140571937815df684c03127d538635;hpb=bf1d8ba5ce6fc6a169a938183f8d01c8bdbccf32;p=senf.git diff --git a/Console/ParsedCommand.cti b/Console/ParsedCommand.cti index 86a78fc..e37906c 100644 --- a/Console/ParsedCommand.cti +++ b/Console/ParsedCommand.cti @@ -26,25 +26,58 @@ #include "ParsedCommand.ih" // Custom includes +#include "../Utils/membind.hh" +#include +#include #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 static_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()); } /////////////////////////////////////////////////////////////////////////// @@ -56,6 +89,163 @@ 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 +prefix_ Overload & senf::console::ParsedCommandAttributor::overload() + const +{ + return static_cast(ParsedCommandAttributorBase::overload()); +} + +template +prefix_ +senf::console::ParsedCommandAttributor::ParsedCommandAttributor(Overload & overload, + unsigned index) + : ParsedCommandAttributorBase (overload, index) +{} + +/////////////////////////////////////////////////////////////////////////// +// 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_ +senf::console::ParsedArgumentAttributorBase:: +ParsedArgumentAttributorBase(Overload & overload, unsigned index) + : ParsedCommandAttributor (overload, index) +{} + +/////////////////////////////////////////////////////////////////////////// +// senf::console::ParsedArgumentAttributor + +template +prefix_ typename senf::console::ParsedArgumentAttributor::next_type +senf::console::ParsedArgumentAttributor::arg() + const +{ + return next(); +} + +template +template +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 >() + + 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) ); + + return next(); + +# undef HaveArg +} + +template +template +prefix_ void senf::console::ParsedArgumentAttributor:: +argInfo(Kw const &, ArgumentPack const &, boost::mpl::true_) + const +{} + +template +template +prefix_ void senf::console::ParsedArgumentAttributor:: +argInfo(boost::parameter::keyword const &, ArgumentPack const & args, + boost::mpl::false_) + const +{ + this->argName(args[kw::name]); +} + +template +template +prefix_ void senf::console::ParsedArgumentAttributor:: +argInfo(boost::parameter::keyword const &, ArgumentPack const & args, + boost::mpl::false_) + const +{ + this->argDoc(args[kw::description]); +} + +template +template +prefix_ void senf::console::ParsedArgumentAttributor:: +argInfo(boost::parameter::keyword const &, ArgumentPack const & args, + boost::mpl::false_) + const +{ + this->defaultValue(args[kw::default_value]); +} + +template +prefix_ +senf::console::ParsedArgumentAttributor:: +ParsedArgumentAttributor(Overload & overload) + : ParsedArgumentAttributorBase (overload, index) +{} + +template +prefix_ typename senf::console::ParsedArgumentAttributor::next_type +senf::console::ParsedArgumentAttributor::next() + const +{ + return ParsedArgumentAttributor(this->overload()); +} + +template +prefix_ void senf::console::ParsedArgumentAttributor:: +defaultValue(value_type const & value) + const +{ + ParsedCommandAttributorBase::defaultValue(value); +} + +/////////////////////////////////////////////////////////////////////////// +// senf::console::ParsedArgumentAttributor + +template +prefix_ +senf::console::ParsedArgumentAttributor:: +ParsedArgumentAttributor(Overload & overload) + : ParsedArgumentAttributorBase< Overload, + ParsedArgumentAttributor > (overload, index) +{} + +/////////////////////////////////////////////////////////////////////////// // namespace members namespace { @@ -96,8 +286,9 @@ namespace { } template -prefix_ senf::console::ParsedCommandOverload< - typename senf::console::detail::ParsedCommandTraits::traits> & +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, Function fn, int) { @@ -106,10 +297,54 @@ senf::console::senf_console_add_node(DirectoryNode & node, std::string const & n ? dynamic_cast(node(name)) : node.add(name, OverloadedCommandNode::create()) ); - typedef senf::console::detail::ParsedCommandTraits CmdTraits; + 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 cmdNode.add( CreateParsedCommandOverload< - typename CmdTraits::traits, ! CmdTraits::has_ostream_arg>::create(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 *) +{ + 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)) ) ); +} + +/////////////////////////////////////////////////////////////////////////// +// senf::console::detail::CheckVoidReturn + +template +template +prefix_ void senf::console::detail::CheckVoidReturn::call(Fn fn, std::ostream & os) +{ + ReturnValueTraits::format(fn(),os); + os << "\n"; +} + +template +prefix_ void senf::console::detail::CheckVoidReturn::call(Fn fn, std::ostream & os) +{ + fn(); } ///////////////////////////////cti.e///////////////////////////////////////