#include <boost/type_traits/remove_reference.hpp>
#include <boost/type_traits/remove_const.hpp>
#include <boost/bind.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/at.hpp>
// ///////////////////////////mpp.p////////////////////////////////////////
#elif BOOST_PP_IS_ITERATING // ////////////////////////////////////////////
#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_, _ )
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 <unsigned n>
+ detail::ArgumentInfo<typename boost::mpl::at_c<arg_types, n>::type> & arg() const;
+
+ void function(Function fn);
+
protected:
private:
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 <unsigned n>
+ detail::ArgumentInfo<typename boost::mpl::at_c<arg_types, n>::type> & arg() const;
+
+ void function(Function fn);
+
protected:
private:
}
template <class FunctionTraits, class ReturnValue>
+template <unsigned n>
+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<FunctionTraits, ReturnValue, BOOST_PP_ITERATION() >::
+arg() const
+{
+ return static_cast< detail::ArgumentInfo<
+ typename boost::mpl::at_c<arg_types, n>::type > & >(arg(n));
+}
+
+template <class FunctionTraits, class ReturnValue>
+void
+senf::console::ParsedCommandOverload<FunctionTraits, ReturnValue, BOOST_PP_ITERATION() >::
+function(Function fn)
+{
+ function_ = fn;
+}
+
+template <class FunctionTraits, class ReturnValue>
prefix_
senf::console::ParsedCommandOverload<FunctionTraits, ReturnValue, BOOST_PP_ITERATION()>::
ParsedCommandOverload(Function fn)
}
template <class FunctionTraits>
+template <unsigned n>
+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<FunctionTraits, void, BOOST_PP_ITERATION() >::
+arg() const
+{
+ return static_cast< detail::ArgumentInfo<
+ typename boost::mpl::at_c<arg_types, n>::type > & >(arg(n));
+}
+
+template <class FunctionTraits>
+void
+senf::console::ParsedCommandOverload<FunctionTraits, void, BOOST_PP_ITERATION() >::
+function(Function fn)
+{
+ function_ = fn;
+}
+
+template <class FunctionTraits>
prefix_
senf::console::ParsedCommandOverload<FunctionTraits, void, BOOST_PP_ITERATION() >::
ParsedCommandOverload(Function fn)
v_execute(std::ostream & os, ParseCommandInfo const & command)
const
{
- if ( command.arguments().size() > 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<ParseCommandInfo::ArgumentsRange>::type
riterator;
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<n>().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<n>().parser) \
+ arg<n>().parser( *(i++), mpp_ArgN(n) ); \
else \
ArgumentTraits< mpp_ArgTypeN(n) >::parse( *(i++), mpp_ArgN(n) ); \
}
v_execute(std::ostream & os, ParseCommandInfo const & command)
const
{
- if ( command.arguments().size() > 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<ParseCommandInfo::ArgumentsRange>::type
riterator;
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<n>().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<n>().parser) \
+ arg<n>().parser( *(i++), mpp_ArgN(n) ); \
else \
ArgumentTraits< mpp_ArgTypeN(n) >::parse( *(i++), mpp_ArgN(n) ); \
}
template <class Traits>
struct CreateParsedCommandOverload<Traits, true, BOOST_PP_ITERATION()>
{
- typedef Traits traits;
+ typedef typename Traits::traits traits;
template <class Function>
static typename senf::console::ParsedCommandOverload<traits>::ptr create(Function fn)