Add Boost.Typeof library to repository
[senf.git] / Console / Node.cc
index 964eb22..382804f 100644 (file)
 #define prefix_
 ///////////////////////////////cc.p////////////////////////////////////////
 
+prefix_ senf::console::DirectoryNode & senf::console::root()
+{
+    static DirectoryNode::ptr rootNode(new DirectoryNode(""));
+    return *rootNode;
+}
+
+///////////////////////////////////////////////////////////////////////////
+// senf::console::GenericNode
+
+prefix_ std::string senf::console::GenericNode::path()
+    const
+{
+    std::string path (name());
+    ptr node (parent());
+    while (node) {
+        path = node->name() + "/" + path;
+        node = node->parent();
+    }
+    return path.empty() ? "/" : path;
+}
+
 ///////////////////////////////////////////////////////////////////////////
 //senf::console::DirectoryNode
 
 prefix_ void senf::console::DirectoryNode::add(GenericNode::ptr node, bool uniquify)
 {
+    BOOST_ASSERT( ! node->parent() );
     if (children_.find(node->name()) != children_.end()) {
         if (! uniquify)
             throw DuplicateNodeNameException() << ": '" << node->name() << "'";
@@ -49,10 +71,11 @@ prefix_ void senf::console::DirectoryNode::add(GenericNode::ptr node, bool uniqu
         name(*node, newName);
     }
     children_.insert(std::make_pair(node->name(),node));
+    node->parent_ = this;
 }
 
 prefix_ senf::console::GenericNode &
-senf::console::DirectoryNode::lookup(std::string const & name)
+senf::console::DirectoryNode::get(std::string const & name)
     const
 {
     ChildMap::const_iterator i (children_.find(name));