From 4a506a4df2db04a883b0104c17a678aa067124f6 Mon Sep 17 00:00:00 2001
From: g0dil <g0dil@wiback.org>
Date: Tue, 24 Mar 2009 14:23:58 +0000
Subject: [PATCH] Utils/Console: Fix adding DirectoryNode's

---
 PPI/Setup.cti                     |  9 +++++----
 Utils/Console/Node.cci            | 13 +++++++++++++
 Utils/Console/Node.hh             |  5 +++++
 Utils/Console/ScopedDirectory.cti |  8 ++++++++
 Utils/Console/ScopedDirectory.hh  |  4 ++++
 Utils/Console/Variables.cti       |  6 ++++--
 Utils/Console/Variables.hh        |  4 ++++
 7 files changed, 43 insertions(+), 6 deletions(-)

diff --git a/PPI/Setup.cti b/PPI/Setup.cti
index f18f8b484..509bbb112 100644
--- a/PPI/Setup.cti
+++ b/PPI/Setup.cti
@@ -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);
 }
diff --git a/Utils/Console/Node.cci b/Utils/Console/Node.cci
index 3c21bc95b..59228c229 100644
--- a/Utils/Console/Node.cci
+++ b/Utils/Console/Node.cci
@@ -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///////////////////////////////////////
diff --git a/Utils/Console/Node.hh b/Utils/Console/Node.hh
index fcd44d0d1..3e796ecb7 100644
--- a/Utils/Console/Node.hh
+++ b/Utils/Console/Node.hh
@@ -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
 
 }}
diff --git a/Utils/Console/ScopedDirectory.cti b/Utils/Console/ScopedDirectory.cti
index 6fedea2d3..b93344cf4 100644
--- a/Utils/Console/ScopedDirectory.cti
+++ b/Utils/Console/ScopedDirectory.cti
@@ -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,
diff --git a/Utils/Console/ScopedDirectory.hh b/Utils/Console/ScopedDirectory.hh
index 512386e37..1712f9f32 100644
--- a/Utils/Console/ScopedDirectory.hh
+++ b/Utils/Console/ScopedDirectory.hh
@@ -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, 
diff --git a/Utils/Console/Variables.cti b/Utils/Console/Variables.cti
index 3c7fd8ed8..f428842b5 100644
--- a/Utils/Console/Variables.cti
+++ b/Utils/Console/Variables.cti
@@ -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);
diff --git a/Utils/Console/Variables.hh b/Utils/Console/Variables.hh
index 13fb7872d..870f2ed7a 100644
--- a/Utils/Console/Variables.hh
+++ b/Utils/Console/Variables.hh
@@ -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>
-- 
GitLab