X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FParsedCommand.mpp;h=3d998c42b7d74a92740010d08709989291e7c0c9;hb=2c1e37335774435b9dd82951aa83dc4d4afaab16;hp=df42e0ae6a4f039ba763044e14d9c49c6cb26add;hpb=01e02e262ea327678dfa0c3f7a66d50ed91924d5;p=senf.git diff --git a/Console/ParsedCommand.mpp b/Console/ParsedCommand.mpp index df42e0a..3d998c4 100644 --- a/Console/ParsedCommand.mpp +++ b/Console/ParsedCommand.mpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -124,25 +125,27 @@ prefix_ void senf::console::ParsedCommandOverload BOOST_PP_ITERATION() - || (command.arguments().size() < BOOST_PP_ITERATION() - && ! arg( command.arguments().size() ).hasDefault) ) + if ( command.arguments().size() > BOOST_PP_ITERATION() ) throw SyntaxErrorException("invalid number of arguments"); + int nDefaults ( BOOST_PP_ITERATION() - command.arguments().size() ); - ParseCommandInfo::argument_iterator i (command.arguments().begin()); - ParseCommandInfo::argument_iterator const i_end (command.arguments().end()); + typedef typename boost::range_const_reverse_iterator::type + riterator; + riterator i (boost::rbegin(command.arguments())); + riterator const i_end (boost::rend(command.arguments())); # define mpp_l(z,n,d) \ + if (i == i_end) \ + throw SyntaxErrorException("invalid number of arguments"); \ 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, _ ) + if (! arg(n).hasDefault || nDefaults-- <= 0) \ + ArgumentTraits< mpp_ArgTypeN(n) >::parse( *(i++), mpp_ArgN(n) ); +# define mpp_l_(z,n,d) mpp_l(z, BOOST_PP_SUB(BOOST_PP_DEC(BOOST_PP_ITERATION()), n), d) + BOOST_PP_REPEAT( BOOST_PP_ITERATION(), mpp_l_, _ ) # undef mpp_l +# undef mpp_l_ - // 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. - detail::ReturnValueTraits::callAndWrite( + detail::CheckVoidReturn::call( boost::bind(function_, boost::ref(os) mpp_TrailingArgs()), os );