Utils/Logger: Remove dependency on libboost_datetime
[senf.git] / Console / ParsedCommand.ih
index 445d055..90231c2 100644 (file)
 #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 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
@@ -50,14 +109,16 @@ namespace detail {
         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;
@@ -68,11 +129,31 @@ namespace detail {
             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////////////////////////////////////////