X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FParsedCommand.mpp;h=c5ffd18450dc2fbbf58e8bd2f1755c16a40cfcba;hb=fa5eaa97c8593e3587c87f25adb14f7f91f31f37;hp=ede697441d39752519a3fe533b13e5ff2a93d643;hpb=6bf246297d5a9b158b3c179e15d181df6e85a9bd;p=senf.git diff --git a/Console/ParsedCommand.mpp b/Console/ParsedCommand.mpp index ede6974..c5ffd18 100644 --- a/Console/ParsedCommand.mpp +++ b/Console/ParsedCommand.mpp @@ -38,6 +38,8 @@ #include #include #include +#include +#include // ///////////////////////////mpp.p//////////////////////////////////////// #elif BOOST_PP_IS_ITERATING // //////////////////////////////////////////// @@ -47,8 +49,11 @@ #define mpp_ArgTypeN(n) BOOST_PP_CAT(BOOST_PP_CAT(arg, BOOST_PP_INC(n)), _type) #define mpp_ArgN(n) BOOST_PP_CAT(arg, BOOST_PP_INC(n)) -#define mpp_ArgTypes_(z,n,d) typename traits::mpp_ArgTypeN(n) -#define mpp_TrailingArgTypes() BOOST_PP_ENUM_TRAILING( BOOST_PP_ITERATION(), mpp_ArgTypes_, _ ) +#define mpp_TrailingArgTypes_(z,n,d) typename traits::mpp_ArgTypeN(n) +#define mpp_TrailingArgTypes() BOOST_PP_ENUM_TRAILING( BOOST_PP_ITERATION(), mpp_TrailingArgTypes_, _ ) + +#define mpp_ArgTypes_(z,n,d) mpp_ArgTypeN(n) +#define mpp_ArgTypes() BOOST_PP_ENUM( BOOST_PP_ITERATION(), mpp_ArgTypes_, _ ) #define mpp_Args_(z,n,d) mpp_ArgN(n) #define mpp_TrailingArgs() BOOST_PP_ENUM_TRAILING( BOOST_PP_ITERATION(), mpp_Args_, _ ) @@ -80,10 +85,18 @@ public: BOOST_PP_REPEAT( BOOST_PP_ITERATION(), mpp_l, _ ) # undef mpp_l + typedef boost::mpl::vector< mpp_ArgTypes() > arg_types; + static ptr create(Function fn); void formatter(Formatter f); + using ParsedCommandOverloadBase::arg; + template + detail::ArgumentInfo::type> & arg() const; + + void function(Function fn); + protected: private: @@ -112,8 +125,16 @@ public: BOOST_PP_REPEAT( BOOST_PP_ITERATION(), mpp_l, _ ) # undef mpp_l + typedef boost::mpl::vector< mpp_ArgTypes() > arg_types; + static ptr create(Function fn); + using ParsedCommandOverloadBase::arg; + template + detail::ArgumentInfo::type> & arg() const; + + void function(Function fn); + protected: private: @@ -147,6 +168,28 @@ formatter(Formatter f) } template +template +senf::console::detail::ArgumentInfo< + typename boost::mpl::at_c< + typename senf::console::ParsedCommandOverload< + FunctionTraits, ReturnValue, BOOST_PP_ITERATION()>::arg_types, + n>::type> & +senf::console::ParsedCommandOverload:: +arg() const +{ + return static_cast< detail::ArgumentInfo< + typename boost::mpl::at_c::type > & >(arg(n)); +} + +template +void +senf::console::ParsedCommandOverload:: +function(Function fn) +{ + function_ = fn; +} + +template prefix_ senf::console::ParsedCommandOverload:: ParsedCommandOverload(Function fn) @@ -166,6 +209,28 @@ create(Function fn) } template +template +senf::console::detail::ArgumentInfo< + typename boost::mpl::at_c< + typename senf::console::ParsedCommandOverload< + FunctionTraits, void, BOOST_PP_ITERATION()>::arg_types, + n>::type> & +senf::console::ParsedCommandOverload:: +arg() const +{ + return static_cast< detail::ArgumentInfo< + typename boost::mpl::at_c::type > & >(arg(n)); +} + +template +void +senf::console::ParsedCommandOverload:: +function(Function fn) +{ + function_ = fn; +} + +template prefix_ senf::console::ParsedCommandOverload:: ParsedCommandOverload(Function fn) @@ -187,9 +252,12 @@ prefix_ void senf::console::ParsedCommandOverload BOOST_PP_ITERATION() ) + // We NEED to know the number of arguments beforehand so we can assign default values + // correctly ... hrmpf ... + unsigned nArgs ( command.arguments().size() ); + if ( nArgs > BOOST_PP_ITERATION() ) throw SyntaxErrorException("invalid number of arguments"); - int nDefaults ( BOOST_PP_ITERATION() - command.arguments().size() ); + int nDefaults ( BOOST_PP_ITERATION() - nArgs ); typedef typename boost::range_const_reverse_iterator::type riterator; @@ -197,12 +265,12 @@ v_execute(std::ostream & os, ParseCommandInfo const & command) riterator const i_end (boost::rend(command.arguments())); # define mpp_l(z,n,d) \ - mpp_ArgTypeN(n) mpp_ArgN(n) (arg< mpp_ArgTypeN(n) >( n ).defaultValue); \ + mpp_ArgTypeN(n) mpp_ArgN(n) (arg().defaultValue); \ if (! arg(n).hasDefault || nDefaults-- <= 0) { \ if (i == i_end) \ throw SyntaxErrorException("invalid number of arguments"); \ - if (arg< mpp_ArgTypeN(n) >(n).parser) \ - arg< mpp_ArgTypeN(n) >(n).parser( *(i++), mpp_ArgN(n) ); \ + if (arg().parser) \ + arg().parser( *(i++), mpp_ArgN(n) ); \ else \ ArgumentTraits< mpp_ArgTypeN(n) >::parse( *(i++), mpp_ArgN(n) ); \ } @@ -223,9 +291,12 @@ prefix_ void senf::console::ParsedCommandOverload BOOST_PP_ITERATION() ) + // We NEED to know the number of arguments beforehand so we can assign default values + // correctly ... hrmpf ... + unsigned nArgs ( command.arguments().size() ); + if ( nArgs > BOOST_PP_ITERATION() ) throw SyntaxErrorException("invalid number of arguments"); - int nDefaults ( BOOST_PP_ITERATION() - command.arguments().size() ); + int nDefaults ( BOOST_PP_ITERATION() - nArgs ); typedef typename boost::range_const_reverse_iterator::type riterator; @@ -233,12 +304,12 @@ v_execute(std::ostream & os, ParseCommandInfo const & command) riterator const i_end (boost::rend(command.arguments())); # define mpp_l(z,n,d) \ - mpp_ArgTypeN(n) mpp_ArgN(n) (arg< mpp_ArgTypeN(n) >( n ).defaultValue); \ + mpp_ArgTypeN(n) mpp_ArgN(n) (arg().defaultValue); \ if (! arg(n).hasDefault || nDefaults-- <= 0) { \ if (i == i_end) \ throw SyntaxErrorException("invalid number of arguments"); \ - if (arg< mpp_ArgTypeN(n) >(n).parser) \ - arg< mpp_ArgTypeN(n) >(n).parser( *(i++), mpp_ArgN(n) ); \ + if (arg().parser) \ + arg().parser( *(i++), mpp_ArgN(n) ); \ else \ ArgumentTraits< mpp_ArgTypeN(n) >::parse( *(i++), mpp_ArgN(n) ); \ }