hopefully this commit will not break other things....
[senf.git] / Console / ParsedCommand.cti
index 60b7fde..9abe00d 100644 (file)
@@ -28,6 +28,7 @@
 // Custom includes
 #include "../Utils/membind.hh"
 #include <boost/format.hpp>
+#include <boost/parameter/binding.hpp>
 
 #define prefix_ inline
 ///////////////////////////////cti.p///////////////////////////////////////
@@ -58,6 +59,163 @@ prefix_ void senf::console::ParsedCommandOverloadBase::addParameter()
 #include BOOST_PP_ITERATE()
 
 ///////////////////////////////////////////////////////////////////////////
+// senf::console::ParsedCommandAttributorBase
+
+template <class Type>
+prefix_ void senf::console::ParsedCommandAttributorBase::defaultValue(Type const & value)
+    const
+{
+    overload().arg<Type>(index_).defaultValue = value;
+    overload().arg(index_).hasDefault = true;
+}
+
+///////////////////////////////////////////////////////////////////////////
+// senf::console::ParsedCommandAttributor<Overload>
+
+template <class Overload>
+prefix_ Overload & senf::console::ParsedCommandAttributor<Overload>::overload()
+    const
+{
+    return static_cast<Overload &>(ParsedCommandAttributorBase::overload());
+}
+
+template <class Overload>
+prefix_
+senf::console::ParsedCommandAttributor<Overload>::ParsedCommandAttributor(Overload & overload,
+                                                                          unsigned index)
+    : ParsedCommandAttributorBase (overload, index)
+{}
+
+///////////////////////////////////////////////////////////////////////////
+// senf::console::ParsedAttributeAttributorBase<Overload,Self>
+
+template <class Overload, class Self>
+prefix_ Self
+senf::console::ParsedAttributeAttributorBase<Overload,Self>::doc(std::string const & doc)
+    const
+{
+    this->ParsedCommandAttributorBase::nodeDoc(doc);
+    return static_cast<Self const &>(*this);
+}
+
+template <class Overload, class Self>
+prefix_ Self senf::console::ParsedAttributeAttributorBase<Overload,Self>::
+overloadDoc(std::string const & doc)
+    const
+{
+    this->ParsedCommandAttributorBase::overloadDoc(doc);
+    return static_cast<Self const &>(*this);
+}
+
+template <class Overload, class Self>
+prefix_
+senf::console::ParsedAttributeAttributorBase<Overload,Self>::
+ParsedAttributeAttributorBase(Overload & overload, unsigned index)
+    : ParsedCommandAttributor<Overload> (overload, index)
+{}
+
+///////////////////////////////////////////////////////////////////////////
+// senf::console::ParsedAttributeAttributor<Overload,index,flag>
+
+template <class Overload, unsigned index, bool flag>
+prefix_ typename senf::console::ParsedAttributeAttributor<Overload,index,flag>::next_type
+senf::console::ParsedAttributeAttributor<Overload,index,flag>::arg()
+    const
+{
+    return next();
+}
+
+template <class Overload, unsigned index, bool flag>
+template <class ArgumentPack>
+prefix_ typename senf::console::ParsedAttributeAttributor<Overload,index,flag>::next_type
+senf::console::ParsedAttributeAttributor<Overload,index,flag>::
+argInfo(ArgumentPack const & args)
+    const
+{
+#   define HaveArg(tag) boost::is_same< \
+        typename boost::parameter::binding<ArgumentPack, tag>::type, void >()
+
+    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) );
+
+    return next();
+
+#   undef HaveArg
+}
+
+template <class Overload, unsigned index, bool flag>
+template <class Kw, class ArgumentPack>
+prefix_ void senf::console::ParsedAttributeAttributor<Overload,index,flag>::
+argInfo(Kw const &, ArgumentPack const &, boost::mpl::true_)
+    const
+{}
+
+template <class Overload, unsigned index, bool flag>
+template <class ArgumentPack>
+prefix_ void senf::console::ParsedAttributeAttributor<Overload,index,flag>::
+argInfo(boost::parameter::keyword<kw::type::name> const &, ArgumentPack const & args,
+        boost::mpl::false_)
+    const
+{
+    this->argName(args[kw::name]);
+}
+
+template <class Overload, unsigned index, bool flag>
+template <class ArgumentPack>
+prefix_ void senf::console::ParsedAttributeAttributor<Overload,index,flag>::
+argInfo(boost::parameter::keyword<kw::type::description> const &, ArgumentPack const & args,
+        boost::mpl::false_)
+    const
+{
+    this->argDoc(args[kw::description]);
+}
+
+template <class Overload, unsigned index, bool flag>
+template <class ArgumentPack>
+prefix_ void senf::console::ParsedAttributeAttributor<Overload,index,flag>::
+argInfo(boost::parameter::keyword<kw::type::default_value> const &, ArgumentPack const & args,
+        boost::mpl::false_)
+    const
+{
+    this->defaultValue(args[kw::default_value]);
+}
+
+template <class Overload, unsigned index, bool flag>
+prefix_
+senf::console::ParsedAttributeAttributor<Overload,index,flag>::
+ParsedAttributeAttributor(Overload & overload)
+    : ParsedAttributeAttributorBase<Overload, ParsedAttributeAttributor> (overload, index)
+{}
+
+template <class Overload, unsigned index, bool flag>
+prefix_ typename senf::console::ParsedAttributeAttributor<Overload,index,flag>::next_type
+senf::console::ParsedAttributeAttributor<Overload,index,flag>::next()
+    const
+{
+    return ParsedAttributeAttributor<Overload, index+1>(this->overload());
+}
+
+template <class Overload, unsigned index, bool flag>
+prefix_ void senf::console::ParsedAttributeAttributor<Overload,index,flag>::
+defaultValue(value_type const & value)
+    const
+{
+    ParsedCommandAttributorBase::defaultValue<arg_type>(value);
+}
+
+///////////////////////////////////////////////////////////////////////////
+// senf::console::ParsedAttributeAttributor<Overload, index, false>
+
+template <class Overload, unsigned index>
+prefix_
+senf::console::ParsedAttributeAttributor<Overload, index, false>::
+ParsedAttributeAttributor(Overload & overload)
+    : ParsedAttributeAttributorBase< Overload, 
+                                     ParsedAttributeAttributor<Overload, index, false> > (overload, index)
+{}
+
+///////////////////////////////////////////////////////////////////////////
 // namespace members
 
 namespace {
@@ -98,8 +256,9 @@ namespace {
 }
 
 template <class Function>
-prefix_ senf::console::ParsedCommandOverload<
-    typename senf::console::detail::ParsedCommandTraits<Function>::traits> &
+prefix_ senf::console::ParsedAttributeAttributor<
+    senf::console::ParsedCommandOverload<
+        typename senf::console::detail::ParsedCommandTraits<Function>::traits> >
 senf::console::senf_console_add_node(DirectoryNode & node, std::string const & name,
                                      Function fn, int)
 {
@@ -108,15 +267,19 @@ senf::console::senf_console_add_node(DirectoryNode & node, std::string const & n
         ? dynamic_cast<OverloadedCommandNode &>(node(name))
         : node.add(name, OverloadedCommandNode::create()) );
 
-    typedef senf::console::detail::ParsedCommandTraits<Function> CmdTraits;
+    typedef detail::ParsedCommandTraits<Function> CmdTraits;
+    typedef ParsedCommandOverload<typename CmdTraits::traits> Overload;
+    typedef ParsedAttributeAttributor<Overload> Attributor;
 
-    return cmdNode.add( CreateParsedCommandOverload<
-                            typename CmdTraits::traits, ! CmdTraits::has_ostream_arg>::create(fn) );
+    return Attributor(
+        cmdNode.add( CreateParsedCommandOverload<
+                         typename CmdTraits::traits, ! CmdTraits::has_ostream_arg>::create(fn) ) );
 }
 
 template <class Owner, class Function>
-prefix_ senf::console::ParsedCommandOverload<
-    typename senf::console::detail::ParsedCommandTraits<Function>::traits> &
+prefix_ senf::console::ParsedAttributeAttributor<
+    senf::console::ParsedCommandOverload<
+        typename senf::console::detail::ParsedCommandTraits<Function>::traits> >
 senf::console::
 senf_console_add_node(DirectoryNode & node, Owner & owner, std::string const & name,
                       Function fn, int,
@@ -127,11 +290,14 @@ senf_console_add_node(DirectoryNode & node, Owner & owner, std::string const & n
         ? dynamic_cast<OverloadedCommandNode &>(node(name))
         : node.add(name, OverloadedCommandNode::create()) );
 
-    typedef senf::console::detail::ParsedCommandTraits<Function> CmdTraits;
+    typedef detail::ParsedCommandTraits<Function> CmdTraits;
+    typedef ParsedCommandOverload<typename CmdTraits::traits> Overload;
+    typedef ParsedAttributeAttributor<Overload> Attributor;
 
-    return cmdNode.add( CreateParsedCommandOverload<
-                            typename CmdTraits::traits, ! CmdTraits::has_ostream_arg>::create(
-                                senf::membind(fn,&owner)) );
+    return Attributor(
+        cmdNode.add( CreateParsedCommandOverload<
+                         typename CmdTraits::traits, ! CmdTraits::has_ostream_arg>::create(
+                             senf::membind(fn,&owner)) ) );
 }
 
 ///////////////////////////////cti.e///////////////////////////////////////