Console: Factored out path traversal into generic traversal helper
[senf.git] / Console / Node.cci
index 88ed2c6..f4fbc11 100644 (file)
 ///////////////////////////////////////////////////////////////////////////
 // senf::console::GenericNode
 
+prefix_ senf::console::GenericNode::~GenericNode()
+{}
+
 prefix_ std::string const & senf::console::GenericNode::name()
     const
 {
     return name_;
 }
 
-prefix_ senf::console::GenericNode::GenericNode(std::string const & name, bool managed)
-    : name_ (name), managed_ (managed)
-{}
+prefix_ senf::console::GenericNode::GenericNode(std::string const & name)
+    : name_ (name), parent_ (0)
+{
+    ///\fixme Provide a default name if 'name' is empty ?
+}
 
 prefix_ void senf::console::GenericNode::name(std::string const & name)
 {
@@ -54,65 +59,95 @@ prefix_ void senf::console::GenericNode::name(GenericNode & node, std::string co
     node.name_ = name;
 }
 
-prefix_ senf::console::DirectoryNode & senf::console::GenericNode::parent()
+prefix_ boost::shared_ptr<senf::console::DirectoryNode> senf::console::GenericNode::parent()
     const
 {
-    SENF_ASSERT( parent_ );
-    return *parent_;
+    return boost::static_pointer_cast<DirectoryNode>(
+        parent_ ? parent_->shared_from_this() : ptr() );
 }
 
-prefix_ bool senf::console::GenericNode::managed()
-    const
+prefix_ senf::console::GenericNode::ptr senf::console::GenericNode::thisptr()
 {
-    return managed_;
+    return shared_from_this();
 }
 
-prefix_ bool senf::console::GenericNode::release()
+prefix_ senf::console::GenericNode::cptr senf::console::GenericNode::thisptr()
+    const
 {
-    // Beware ! call release() first so the call is not short-circuited way !
-    return intrusive_refcount_base::release() && managed_;
+    return shared_from_this();
 }
 
 ///////////////////////////////////////////////////////////////////////////
 // senf::console::DirectoryNode
 
-prefix_ void senf::console::DirectoryNode::add(std::auto_ptr<GenericNode> node, bool uniquify)
-{
-    SENF_ASSERT( node->managed() );
-    add(GenericNode::ptr(node.release()), uniquify);
-}
-
-prefix_ void senf::console::DirectoryNode::add(GenericNode & node, bool uniquify)
+prefix_ senf::console::GenericNode &
+senf::console::DirectoryNode::add(std::auto_ptr<GenericNode> node, bool uniquify)
 {
-    SENF_ASSERT( ! node.managed() );
-    add(GenericNode::ptr(&node),uniquify);
+    GenericNode::ptr p (node.release());
+    add(p, uniquify);
+    return *p;
 }
 
 prefix_ senf::console::DirectoryNode &
 senf::console::DirectoryNode::operator[](std::string const & name)
     const
 {
-    return dynamic_cast<DirectoryNode&>(lookup(name));
+    return dynamic_cast<DirectoryNode&>(get(name));
 }
 
 prefix_ senf::console::CommandNode &
 senf::console::DirectoryNode::operator()(std::string const & name)
     const
 {
-    return dynamic_cast<CommandNode&>(lookup(name));
+    return dynamic_cast<CommandNode&>(get(name));
+}
+
+prefix_ senf::console::DirectoryNode &
+senf::console::DirectoryNode::mkdir(std::string const & name)
+{
+    return static_cast<DirectoryNode &>(
+        add(std::auto_ptr<GenericNode>(new DirectoryNode(name))));
+}
+
+prefix_ senf::console::DirectoryNode::ChildrenRange senf::console::DirectoryNode::children()
+    const
+{
+    return boost::make_iterator_range(children_.begin(), children_.end());
 }
 
-prefix_ senf::console::DirectoryNode::DirectoryNode(std::string const & name, bool managed)
-    : GenericNode(name, managed)
+prefix_ senf::console::DirectoryNode::DirectoryNode(std::string const & name)
+    : GenericNode(name)
 {}
 
+prefix_ senf::console::DirectoryNode::ptr senf::console::DirectoryNode::thisptr()
+{
+    return boost::static_pointer_cast<DirectoryNode>(shared_from_this());
+}
+
+prefix_ senf::console::DirectoryNode::cptr senf::console::DirectoryNode::thisptr()
+    const
+{
+    return boost::static_pointer_cast<DirectoryNode const>(shared_from_this());
+}
+
 ///////////////////////////////////////////////////////////////////////////
 // senf::console::CommandNode
 
-prefix_ senf::console::CommandNode::CommandNode(std::string const & name, bool managed)
-    : GenericNode(name, managed)
+prefix_ senf::console::CommandNode::CommandNode(std::string const & name)
+    : GenericNode(name)
 {}
 
+prefix_ senf::console::CommandNode::ptr senf::console::CommandNode::thisptr()
+{
+    return boost::static_pointer_cast<CommandNode>(shared_from_this());
+}
+
+prefix_ senf::console::CommandNode::cptr senf::console::CommandNode::thisptr()
+    const
+{
+    return boost::static_pointer_cast<CommandNode const>(shared_from_this());
+}
+
 ///////////////////////////////cci.e///////////////////////////////////////
 #undef prefix_