#define IH_ParsedCommand_ 1
// Custom includes
+#include <boost/function.hpp>
+#include <boost/intrusive_ptr.hpp>
+#include "Parse.hh"
///////////////////////////////ih.p////////////////////////////////////////
namespace senf {
namespace console {
+
+ template < class FunctionTraits,
+ class ReturnType=typename FunctionTraits::result_type,
+ unsigned arity=FunctionTraits::arity >
+ class ParsedCommandOverload;
+
+ template < class Overload,
+ unsigned index=0,
+ bool flag=(index < unsigned(Overload::traits::arity)) >
+ class ParsedArgumentAttributor;
+
namespace detail {
- template <class Function, bool isFN=senf::is_any_function<Function>::value>
- struct ParsedCommandTraits
- {};
+ /** \brief Internal: Argument information structure
+
+ This class is used to hold argument information for automatically parsed commands.
+
+ \see ParsedCommandOverloadBase
+ */
+ struct ArgumentInfoBase
+ : public intrusive_refcount
+ {
+ typedef boost::intrusive_ptr<ArgumentInfoBase> ptr;
+
+ std::string type;
+ std::string name;
+ std::string defaultDoc;
+ bool hasDefault;
+ std::string doc;
+
+ ArgumentInfoBase(std::string const & type);
+ virtual ~ArgumentInfoBase();
+
+ virtual std::string defaultValueStr() const = 0;
+ };
+
+ /** \brief Internal: Argument information structure
+
+ This class is used to hold argument information for automatically parsed commands.
+
+ \see ParsedCommandOverloadBase
+ */
+ template <class ParameterType>
+ struct ArgumentInfo
+ : public ArgumentInfoBase
+ {
+ typedef boost::intrusive_ptr<ArgumentInfo> ptr;
+ typedef boost::function<void (ParseCommandInfo::TokensRange const &,
+ ParameterType &)> Parser;
+
+ static ptr create();
+ ArgumentInfo();
+
+ ParameterType defaultValue;
+ Parser parser;
+
+ virtual std::string defaultValueStr() const;
+ };
+
+#ifndef DOXYGEN
+
+ // FirstArgType returns void, if the function has no arguments, otherwise it returns arg1_type
template <class Traits, bool flag=(Traits::arity>0)>
struct FirstArgType
typedef typename Traits::arg1_type type;
};
- template <class Function>
- struct ParsedCommandTraits<Function, true>
+ template <class FnunctionP, class Function, bool isFN=boost::is_function<Function>::value>
+ struct ParsedCommandTraits_i
+ {};
+
+ template <class FunctionP, class Function>
+ struct ParsedCommandTraits_i<FunctionP, Function, true>
{
- typedef Function base_type;
- typedef typename senf::remove_member_pointer<
- typename boost::remove_pointer<base_type>::type>::type function_type;
+ typedef FunctionP base_type;
+ typedef typename senf::remove_any_pointer<base_type>::type function_type;
typedef boost::function_traits<function_type> base_traits;
-
typedef typename FirstArgType<base_traits>::type first_arg_type;
static const bool has_ostream_arg = boost::is_same<first_arg_type, std::ostream &>::value;
base_traits>
::type traits;
+ typedef typename senf::remove_cvref<typename base_traits::result_type>::type result_type;
+
static const bool is_member = boost::is_member_pointer<base_type>::value;
typedef typename senf::member_class<base_type>::type class_type;
+
+ typedef ParsedCommandOverload<traits> Overload;
+ typedef ParsedArgumentAttributor<Overload> Attributor;
};
+ // Disable auto-parsing for ParseCommandInfo arg -> register manually parsed command
+ template <class FunctionP>
+ struct ParsedCommandTraits_i<FunctionP, void (std::ostream &, ParseCommandInfo const &), true>
+ {};
+
+ template <class FunctionP>
+ struct ParsedCommandTraits
+ : public ParsedCommandTraits_i< FunctionP,
+ typename senf::remove_any_pointer<FunctionP>::type >
+ {};
+
+ struct ParsedCommandAddNodeAccess;
+
+#endif
+
}}}
///////////////////////////////ih.e////////////////////////////////////////