// Custom includes
#include "../Utils/membind.hh"
#include <boost/format.hpp>
-#include <boost/parameter/binding.hpp>
+#include "../Utils/parameter.hh"
#define prefix_ inline
///////////////////////////////cti.p///////////////////////////////////////
overload().arg(index_).hasDefault = true;
}
+template <class Type, class Fn>
+prefix_ void senf::console::ParsedCommandAttributorBase::parser(Fn fn)
+ const
+{
+ overload().arg<Type>(index_).parser = fn;
+}
+
///////////////////////////////////////////////////////////////////////////
// senf::console::ParsedCommandAttributor<Overload>
///////////////////////////////////////////////////////////////////////////
// senf::console::ParsedArgumentAttributorBase<Overload,Self>
+template <class Overload, class Self, class ReturnType>
+prefix_ Self
+senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::doc(std::string const & doc)
+ const
+{
+ this->ParsedCommandAttributorBase::nodeDoc(doc);
+ return static_cast<Self const &>(*this);
+}
+
+template <class Overload, class Self, class ReturnType>
+prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::
+overloadDoc(std::string const & doc)
+ const
+{
+ this->ParsedCommandAttributorBase::overloadDoc(doc);
+ return static_cast<Self const &>(*this);
+}
+
+template <class Overload, class Self, class ReturnType>
+prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::
+formatter(typename Overload::Formatter f)
+ const
+{
+ this->overload().formatter(f);
+ return static_cast<Self const &>(*this);
+}
+
+template <class Overload, class Self, class ReturnType>
+prefix_
+senf::console::ParsedArgumentAttributorBase<Overload,Self,ReturnType>::
+ParsedArgumentAttributorBase(Overload & overload, unsigned index)
+ : ParsedCommandAttributor<Overload> (overload, index)
+{}
+
template <class Overload, class Self>
prefix_ Self
-senf::console::ParsedArgumentAttributorBase<Overload,Self>::doc(std::string const & doc)
+senf::console::ParsedArgumentAttributorBase<Overload,Self,void>::doc(std::string const & doc)
const
{
this->ParsedCommandAttributorBase::nodeDoc(doc);
}
template <class Overload, class Self>
-prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload,Self>::
+prefix_ Self senf::console::ParsedArgumentAttributorBase<Overload,Self,void>::
overloadDoc(std::string const & doc)
const
{
template <class Overload, class Self>
prefix_
-senf::console::ParsedArgumentAttributorBase<Overload,Self>::
+senf::console::ParsedArgumentAttributorBase<Overload,Self,void>::
ParsedArgumentAttributorBase(Overload & overload, unsigned index)
: ParsedCommandAttributor<Overload> (overload, index)
{}
argInfo(ArgumentPack const & args)
const
{
-# define HaveArg(tag) boost::is_same< \
- typename boost::parameter::binding<ArgumentPack, tag>::type, void >()
+# define ProcessArg(tag) \
+ argInfo( kw:: tag, args, senf::has_parameter< ArgumentPack, kw::type:: tag >() )
- 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) );
+ ProcessArg(name);
+ ProcessArg(description);
+ ProcessArg(default_value);
+ ProcessArg(type_name);
+ ProcessArg(default_doc);
+ ProcessArg(parser);
return next();
template <class Overload, unsigned index, bool flag>
template <class Kw, class ArgumentPack>
prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
-argInfo(Kw const &, ArgumentPack const &, boost::mpl::true_)
+argInfo(Kw const &, ArgumentPack const &, boost::mpl::false_)
const
{}
template <class ArgumentPack>
prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
argInfo(boost::parameter::keyword<kw::type::name> const &, ArgumentPack const & args,
- boost::mpl::false_)
+ boost::mpl::true_)
const
{
this->argName(args[kw::name]);
template <class ArgumentPack>
prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
argInfo(boost::parameter::keyword<kw::type::description> const &, ArgumentPack const & args,
- boost::mpl::false_)
+ boost::mpl::true_)
const
{
this->argDoc(args[kw::description]);
template <class ArgumentPack>
prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
argInfo(boost::parameter::keyword<kw::type::default_value> const &, ArgumentPack const & args,
- boost::mpl::false_)
+ boost::mpl::true_)
const
{
this->defaultValue(args[kw::default_value]);
}
template <class Overload, unsigned index, bool flag>
+template <class ArgumentPack>
+prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
+argInfo(boost::parameter::keyword<kw::type::type_name> const &, ArgumentPack const & args,
+ boost::mpl::true_)
+ const
+{
+ this->typeName(args[kw::type_name]);
+}
+
+template <class Overload, unsigned index, bool flag>
+template <class ArgumentPack>
+prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
+argInfo(boost::parameter::keyword<kw::type::default_doc> const &, ArgumentPack const & args,
+ boost::mpl::true_)
+ const
+{
+ BOOST_STATIC_ASSERT(( senf::has_parameter<ArgumentPack, kw::type::default_value>::value ));
+ this->defaultDoc(args[kw::default_doc]);
+}
+
+template <class Overload, unsigned index, bool flag>
+template <class ArgumentPack>
+prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::
+argInfo(boost::parameter::keyword<kw::type::parser> const &, ArgumentPack const & args,
+ boost::mpl::true_)
+ const
+{
+ this->parser(args[kw::parser]);
+}
+
+template <class Overload, unsigned index, bool flag>
prefix_
senf::console::ParsedArgumentAttributor<Overload,index,flag>::
ParsedArgumentAttributor(Overload & overload)
defaultValue(value_type const & value)
const
{
- ParsedCommandAttributorBase::defaultValue<arg_type>(value);
+ ParsedCommandAttributorBase::defaultValue<value_type>(value);
+}
+
+template <class Overload, unsigned index, bool flag>
+template <class Fn>
+prefix_ void senf::console::ParsedArgumentAttributor<Overload,index,flag>::parser(Fn fn)
+ const
+{
+ ParsedCommandAttributorBase::parser<value_type>(fn);
}
///////////////////////////////////////////////////////////////////////////
senf::membind(fn,&owner)) ) );
}
-///////////////////////////////////////////////////////////////////////////
-// senf::console::detail::CheckVoidReturn<Type>
-
-template <class Type>
-template <class Fn>
-prefix_ void senf::console::detail::CheckVoidReturn<Type>::call(Fn fn, std::ostream & os)
-{
- ReturnValueTraits<Type>::format(fn(),os);
- os << "\n";
-}
-
-template <class Fn>
-prefix_ void senf::console::detail::CheckVoidReturn<void>::call(Fn fn, std::ostream & os)
-{
- fn();
-}
-
///////////////////////////////cti.e///////////////////////////////////////
#undef prefix_