X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FParsedCommand.mpp;h=df42e0ae6a4f039ba763044e14d9c49c6cb26add;hb=ef4c5558d6a52367bd7040530d40c7616f6f5b71;hp=305229017666c88e8b3def67999322da0c401302;hpb=bf1d8ba5ce6fc6a169a938183f8d01c8bdbccf32;p=senf.git diff --git a/Console/ParsedCommand.mpp b/Console/ParsedCommand.mpp index 3052290..df42e0a 100644 --- a/Console/ParsedCommand.mpp +++ b/Console/ParsedCommand.mpp @@ -29,10 +29,13 @@ // Custom includes #include #include +#include +#include #include #include #include #include +#include #include // ///////////////////////////mpp.p//////////////////////////////////////// @@ -68,8 +71,8 @@ public: typedef boost::function Function; -# define mpp_l(z,n,d) \ - typedef typename boost::remove_reference::type \ +# define mpp_l(z,n,d) \ + typedef typename senf::remove_cvref< typename traits::mpp_ArgTypeN(n) >::type \ mpp_ArgTypeN(n); BOOST_PP_REPEAT( BOOST_PP_ITERATION(), mpp_l, _ ) # undef mpp_l @@ -123,34 +126,19 @@ v_execute(std::ostream & os, ParseCommandInfo const & command) { if ( command.arguments().size() > BOOST_PP_ITERATION() || (command.arguments().size() < BOOST_PP_ITERATION() - && ! arg( BOOST_PP_ITERATION()-1 ).hasDefault) ) + && ! arg( command.arguments().size() ).hasDefault) ) throw SyntaxErrorException("invalid number of arguments"); - // First define local variables argN for the parameters. The variables are initialized to their - // default values -# define mpp_l(z,n,d) mpp_ArgTypeN(n) mpp_ArgN(n) (arg< mpp_ArgTypeN(n) >( n ).defaultValue); - BOOST_PP_REPEAT( BOOST_PP_ITERATION(), mpp_l, _ ) -# undef mpp_l - ParseCommandInfo::argument_iterator i (command.arguments().begin()); ParseCommandInfo::argument_iterator const i_end (command.arguments().end()); - // Now parse the arguments which are provided leaving the trailing arguments at their default - // value. We have already checked above, whether those default values are valid. Be aware, that - // the following cases do NOT have 'break' statements ! - - switch (BOOST_PP_ITERATION() - command.arguments().size()) { - # define mpp_l(z,n,d) \ - case n : \ + mpp_ArgTypeN(n) mpp_ArgN(n) (arg< mpp_ArgTypeN(n) >( n ).defaultValue); \ + if (i != i_end) \ detail::ParameterTraits< mpp_ArgTypeN(n) >::parse( *(i++), mpp_ArgN(n) ); BOOST_PP_REPEAT( BOOST_PP_ITERATION(), mpp_l, _ ) # undef mpp_l - default : // This happens, if ALL arguments are defaulted - ; - } - // Now call the function binding the arguments to the values parsed above. callAndWrite is // specialized to ignore a 'void' return value but automatically write all other values to the // output stream. @@ -181,6 +169,19 @@ struct CreateParsedCommandOverload }; // //////////////////////////////////////////////////////////////////////// +#elif BOOST_PP_ITERATION_FLAGS()==5 // //////////////////////////////////// +// //////////////////////////////////////////////////////////////////////// + +// Create keyword arg forwarding functions + +template +next_type arg ( BOOST_PP_ENUM_BINARY_PARAMS( BOOST_PP_ITERATION(), A, const & a ), + typename arg_params::match< BOOST_PP_ENUM_PARAMS( BOOST_PP_ITERATION(), A ) >::type + kw = arg_params()) const { + return argInfo( kw(BOOST_PP_ENUM_PARAMS( BOOST_PP_ITERATION(), a )) ); +} + +// //////////////////////////////////////////////////////////////////////// #endif // ///////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////// // Undefine local Macros