Utils/Console: Fix adding DirectoryNode's
g0dil [Tue, 24 Mar 2009 14:23:58 +0000 (14:23 +0000)]
git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@1167 270642c3-0616-0410-b53a-bc976706d245

PPI/Setup.cti
Utils/Console/Node.cci
Utils/Console/Node.hh
Utils/Console/ScopedDirectory.cti
Utils/Console/ScopedDirectory.hh
Utils/Console/Variables.cti
Utils/Console/Variables.hh

index f18f8b4..509bbb1 100644 (file)
@@ -26,6 +26,7 @@
 //#include "Setup.ih"
 
 // Custom includes
+#include "Jack.hh"
 
 #define prefix_ inline
 ///////////////////////////////cti.p///////////////////////////////////////
@@ -37,7 +38,7 @@ prefix_ void senf::ppi::
 connect(T & source, C & target,
         typename boost::disable_if< boost::is_base_of<connector::Connector, T> >::type *,
         typename boost::enable_if< boost::is_base_of<connector::Connector, C> >::type *,
-        typename boost::disable_if< boost::is_base_of<connector::Jack, T> >:: type *)
+        typename boost::disable_if< boost::is_base_of<connector::Jack, T> >::type *)
 {
     connect(source.output, target);
 }
@@ -47,7 +48,7 @@ prefix_ void senf::ppi::
 connect(C & source, T & target,
         typename boost::enable_if< boost::is_base_of<connector::Connector, C> >::type *,
         typename boost::disable_if< boost::is_base_of<connector::Connector,T> >::type *,
-        typename boost::disable_if< boost::is_base_of<connector::Jack, T> >:: type *)
+        typename boost::disable_if< boost::is_base_of<connector::Jack, T> >::type *)
 {
     connect(source, target.input);
 }
@@ -57,8 +58,8 @@ prefix_ void senf::ppi::
 connect(T1 & source, T2 & target,
         typename boost::disable_if< boost::is_base_of<connector::Connector, T1> >::type *,
         typename boost::disable_if< boost::is_base_of<connector::Connector, T2> >::type *,
-        typename boost::disable_if< boost::is_base_of<connector::Jack, T1> >:: type *,
-        typename boost::disable_if< boost::is_base_of<connector::Jack, T2> >:: type *)
+        typename boost::disable_if< boost::is_base_of<connector::Jack, T1> >::type *,
+        typename boost::disable_if< boost::is_base_of<connector::Jack, T2> >::type *)
 {
     connect(source.output, target.input);
 }
index 3c21bc9..59228c2 100644 (file)
@@ -212,6 +212,12 @@ senf::console::DirectoryNode::mkdir(std::string const & name)
     return add(name, create());
 }
 
+prefix_ senf::console::DirectoryNode &
+senf::console::DirectoryNode::provideDirectory(std::string const & name)
+{
+    return hasChild(name) ? getDirectory(name) : mkdir(name);
+}
+
 prefix_ senf::console::DirectoryNode::ChildrenRange senf::console::DirectoryNode::children()
     const
 {
@@ -348,6 +354,13 @@ senf::console::senf_console_add_node(DirectoryNode & node, std::string const & n
     return node.add(name, SimpleCommandNode::create(fn));
 }
 
+prefix_ senf::console::DirectoryNode &
+senf::console::senf_console_add_node(DirectoryNode & node, std::string const & name,
+                                     DirectoryNode & dir, int)
+{
+    return node.add(name, dir.thisptr());
+}
+
 #endif
 
 ///////////////////////////////cci.e///////////////////////////////////////
index fcd44d0..3e796ec 100644 (file)
@@ -538,6 +538,8 @@ namespace console {
 
         DirectoryNode & mkdir(std::string const & name);
                                         ///< Create sub-directory node
+        DirectoryNode & provideDirectory(std::string const & name);
+                                        ///< Return subdirectory, possibly creating it
 
         ChildrenRange children() const; ///< Return iterator range over all children.
                                         /**< The returned range is sorted by child name. */
@@ -711,6 +713,9 @@ namespace console {
     SimpleCommandNode & senf_console_add_node(DirectoryNode & node, std::string const & name,
                                               SimpleCommandNode::Function fn, int);
 
+    DirectoryNode & senf_console_add_node(DirectoryNode & node, std::string const & name,
+                                          DirectoryNode & dir, int);
+
 #endif
 
 }}
index 6fedea2..b93344c 100644 (file)
@@ -88,6 +88,14 @@ senf_console_add_node(DirectoryNode & node, Owner & owner, std::string const & n
     return node.add(name, boost::bind(fn,boost::ref(owner),_1,_2));
 }
 
+template <class Owner>
+prefix_ senf::console::DirectoryNode &
+senf::console::senf_console_add_node(DirectoryNode & node, Owner & owner,
+                                     std::string const & name, DirectoryNode & dir, int)
+{
+    return node.add(name, dir.thisptr());
+}
+
 template <class Node>
 prefix_ senf::console::DirectoryNode & senf::console::
 senf_console_add_node(DirectoryNode & dir, std::string const & name, Node const & node, int,
index 512386e..1712f9f 100644 (file)
@@ -197,6 +197,10 @@ namespace console {
         DirectoryNode & node, Owner & owner, std::string const & name,
         void (Owner::*fn)(std::ostream &, ParseCommandInfo const &), int);
 
+    template <class Owner>
+    DirectoryNode & senf_console_add_node(DirectoryNode & node, Owner & owner, 
+                                          std::string const & name, DirectoryNode & dir, int);
+
     template <class Node>
     DirectoryNode & senf_console_add_node(
         DirectoryNode & dir, std::string const & name, Node const & node, int, 
index 3c7fd8e..f428842 100644 (file)
@@ -199,6 +199,7 @@ template <class Variable>
 prefix_ senf::console::VariableAttributor<Variable> senf::console::
 senf_console_add_node(DirectoryNode & node, std::string const & name, Variable & var, int,
                       typename boost::disable_if< boost::is_convertible<Variable*, ScopedDirectoryBase*> >::type *,
+                      typename boost::disable_if< boost::is_convertible<Variable*, GenericNode*> >::type *, 
                       typename boost::disable_if_c<detail::ParsedCommandTraits<Variable>::is_callable>::type *)
 {
     return detail::VariableNodeCreator<Variable>::add(node, name, var);
@@ -214,9 +215,10 @@ senf::console::senf_console_add_node(DirectoryNode & node, std::string const & n
 
 template <class Variable, class Owner>
 prefix_ senf::console::VariableAttributor<Variable> senf::console::
-senf_console_add_node(DirectoryNode & node, Owner &, std::string const & name,
+senf_console_add_node(DirectoryNode & node, Owner & owner, std::string const & name,
                       Variable & var, int,
-                      typename boost::disable_if< boost::is_convertible<Variable*, ScopedDirectoryBase*> >::type *,
+                      typename boost::disable_if< boost::is_convertible<Variable*, ScopedDirectoryBase*> >::type *, 
+                      typename boost::disable_if< boost::is_convertible<Variable*, GenericNode*> >::type *, 
                       typename boost::disable_if_c<detail::ParsedCommandTraits<Variable>::is_callable>::type *)
 {
     return detail::VariableNodeCreator<Variable>::add(node, name, var);
index 13fb787..870f2ed 100644 (file)
@@ -42,12 +42,15 @@ namespace console {
     class ScopedDirectoryBase;
     template <class Variable> class VariableAttributor;
 
+    
+
 #ifndef DOXYGEN
 
     template <class Variable>
     VariableAttributor<Variable> senf_console_add_node(
         DirectoryNode & node, std::string const & name, Variable & var, int,
         typename boost::disable_if< boost::is_convertible<Variable*, ScopedDirectoryBase*> >::type * = 0,
+        typename boost::disable_if< boost::is_convertible<Variable*, GenericNode*> >::type * = 0,
         typename boost::disable_if_c<detail::ParsedCommandTraits<Variable>::is_callable>::type * = 0);
 
     template <class Variable>
@@ -59,6 +62,7 @@ namespace console {
     VariableAttributor<Variable> senf_console_add_node(
         DirectoryNode & node, Owner & owner, std::string const & name, Variable & var, int,
         typename boost::disable_if< boost::is_convertible<Variable*, ScopedDirectoryBase*> >::type * = 0,
+        typename boost::disable_if< boost::is_convertible<Variable*, GenericNode*> >::type * = 0,
         typename boost::disable_if_c<detail::ParsedCommandTraits<Variable>::is_callable>::type * = 0);
 
     template <class Variable, class Owner>