///////////////////////////////////////////////////////////////////////////
// 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()
{}
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()
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
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()
{}
{}
///////////////////////////////////////////////////////////////////////////
-// 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()