Fix build script
[senf.git] / Console / Node.cci
index 108902a..1fe834d 100644 (file)
 ///////////////////////////////////////////////////////////////////////////
 // senf::console::GenericNode
 
+prefix_ senf::console::GenericNode::ptr senf::console::GenericNode::thisptr()
+{
+    return shared_from_this();
+}
+
+prefix_ senf::console::GenericNode::cptr senf::console::GenericNode::thisptr()
+    const
+{
+    return shared_from_this();
+}
+
 prefix_ senf::console::GenericNode::~GenericNode()
 {}
 
@@ -73,30 +84,58 @@ prefix_ void senf::console::GenericNode::help(std::ostream & output)
     v_help(output);
 }
 
-prefix_ senf::console::GenericNode::ptr senf::console::GenericNode::thisptr()
+prefix_ bool senf::console::GenericNode::operator==(GenericNode & other)
+    const
 {
-    return shared_from_this();
+    return this == & other;
 }
 
-prefix_ senf::console::GenericNode::cptr senf::console::GenericNode::thisptr()
+prefix_ bool senf::console::GenericNode::operator!=(GenericNode & other)
     const
 {
-    return shared_from_this();
+    return this != & other;
 }
 
-prefix_ bool senf::console::GenericNode::operator==(GenericNode & other)
+prefix_ bool senf::console::GenericNode::isDirectory()
     const
 {
-    return this == & other;
+    return dynamic_cast<DirectoryNode const *>(this);
 }
 
-prefix_ bool senf::console::GenericNode::operator!=(GenericNode & other)
+prefix_ bool senf::console::GenericNode::isLink()
     const
 {
-    return this != & other;
+    return dynamic_cast<LinkNode const *>(this);
+}
+
+prefix_ bool senf::console::GenericNode::isCommand()
+    const
+{
+    return dynamic_cast<CommandNode const *>(this);
 }
 
 ///////////////////////////////////////////////////////////////////////////
+// senf::console::LinkNode
+
+prefix_ senf::console::GenericNode & senf::console::LinkNode::follow()
+    const
+{
+    return *node_;
+}
+
+prefix_ senf::console::LinkNode::ptr senf::console::LinkNode::create(GenericNode & node)
+{
+    GenericNode::ptr p (node.thisptr());
+    while ( p->isLink() )
+        p = dynamic_cast<LinkNode&>(*p).follow().thisptr();
+    return ptr(new LinkNode(*p));
+}
+
+prefix_ senf::console::LinkNode::LinkNode(GenericNode & node)
+    : node_ (node.thisptr())
+{}
+
+///////////////////////////////////////////////////////////////////////////
 // senf::console::DirectoryNode
 
 prefix_ senf::console::DirectoryNode::ptr senf::console::DirectoryNode::create()
@@ -111,6 +150,16 @@ prefix_ bool senf::console::DirectoryNode::hasChild(std::string const & name)
     return i != children_.end();
 }
 
+prefix_ senf::console::GenericNode &
+senf::console::DirectoryNode::get(std::string const & name)
+    const
+{
+    GenericNode & node (getLink(name));
+    return node.isLink()
+        ? dynamic_cast<LinkNode&>(node).follow()
+        : node;
+}
+
 prefix_ senf::console::DirectoryNode &
 senf::console::DirectoryNode::getDirectory(std::string const & name)
     const
@@ -165,6 +214,11 @@ senf::console::DirectoryNode::completions(std::string const & s)
                                       children_.lower_bound(s + "\xff"));
 }
 
+prefix_ void senf::console::DirectoryNode::link(std::string const & name, GenericNode & target)
+{
+    add(name, LinkNode::create(target));
+}
+
 prefix_ senf::console::DirectoryNode::DirectoryNode()
 {}
 
@@ -196,23 +250,6 @@ prefix_ senf::console::detail::NodeTraverser::NodeTraverser(DirectoryNode & root
 {}
 
 ///////////////////////////////////////////////////////////////////////////
-// senf::console::SyntaxErrorException
-
-prefix_ senf::console::SyntaxErrorException::SyntaxErrorException(std::string const & msg)
-    : message_(msg)
-{}
-
-prefix_ senf::console::SyntaxErrorException::~SyntaxErrorException()
-    throw()
-{}
-
-prefix_ std::string const & senf::console::SyntaxErrorException::message()
-    const
-{
-    return message_;
-}
-
-///////////////////////////////////////////////////////////////////////////
 // senf::console::CommandNode
 
 prefix_ senf::console::CommandNode::ptr senf::console::CommandNode::thisptr()