X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FNode.cci;h=242881fd8243419df201436d4654f29d8e06c65d;hb=9e7071473642404359c8b7a88c78fe02f00baf16;hp=c0d76bc0e6c1cd45e37a29adb06025ddfb10a372;hpb=706fe01937df3649e40aed24b75c3d28fc4fa007;p=senf.git diff --git a/Console/Node.cci b/Console/Node.cci index c0d76bc..242881f 100644 --- a/Console/Node.cci +++ b/Console/Node.cci @@ -23,7 +23,7 @@ /** \file \brief Node inline non-template implementation */ -//#include "Node.ih" +#include "Node.ih" // Custom includes #include "../Utils/senfassert.hh" @@ -84,6 +84,57 @@ prefix_ senf::console::GenericNode::cptr senf::console::GenericNode::thisptr() return shared_from_this(); } +prefix_ bool senf::console::GenericNode::operator==(GenericNode & other) + const +{ + return this == & other; +} + +prefix_ bool senf::console::GenericNode::operator!=(GenericNode & other) + const +{ + return this != & other; +} + +prefix_ bool senf::console::GenericNode::isDirectory() + const +{ + return dynamic_cast(this); +} + +prefix_ bool senf::console::GenericNode::isLink() + const +{ + return dynamic_cast(this); +} + +prefix_ bool senf::console::GenericNode::isCommand() + const +{ + return dynamic_cast(this); +} + +/////////////////////////////////////////////////////////////////////////// +// senf::console::LinkNode + +prefix_ senf::console::LinkNode::ptr senf::console::LinkNode::create(GenericNode & node) +{ + GenericNode::ptr p (node.thisptr()); + while ( p->isLink() ) + p = dynamic_cast(*p).follow().thisptr(); + return ptr(new LinkNode(*p)); +} + +prefix_ senf::console::GenericNode & senf::console::LinkNode::follow() + const +{ + return *node_; +} + +prefix_ senf::console::LinkNode::LinkNode(GenericNode & node) + : node_ (node.thisptr()) +{} + /////////////////////////////////////////////////////////////////////////// // senf::console::DirectoryNode @@ -99,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(node).follow() + : node; +} + prefix_ senf::console::DirectoryNode & senf::console::DirectoryNode::getDirectory(std::string const & name) const @@ -145,6 +206,19 @@ prefix_ senf::console::DirectoryNode::ChildrenRange senf::console::DirectoryNode return boost::make_iterator_range(children_.begin(), children_.end()); } +prefix_ senf::console::DirectoryNode::ChildrenRange +senf::console::DirectoryNode::completions(std::string const & s) + const +{ + return boost::make_iterator_range(children_.lower_bound(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() {} @@ -167,6 +241,15 @@ prefix_ senf::console::DirectoryNode::cptr senf::console::DirectoryNode::thisptr } /////////////////////////////////////////////////////////////////////////// +// senf::console::detail::NodeTraverser + +prefix_ senf::console::detail::NodeTraverser::NodeTraverser(DirectoryNode & root, + DirectoryNode & dir, + bool autocomplete) + : root_ (root), dir_ (dir.thisptr()), autocomplete_ (autocomplete), init_ (false) +{} + +/////////////////////////////////////////////////////////////////////////// // senf::console::SyntaxErrorException prefix_ senf::console::SyntaxErrorException::SyntaxErrorException(std::string const & msg) @@ -245,6 +328,8 @@ prefix_ senf::console::SimpleCommandNode::cptr senf::console::SimpleCommandNode: return boost::static_pointer_cast(shared_from_this()); } +#ifndef DOXYGEN + prefix_ senf::console::SimpleCommandNode & senf::console::senf_console_add_node(DirectoryNode & node, std::string const & name, SimpleCommandNode::Function fn, int) @@ -252,6 +337,7 @@ senf::console::senf_console_add_node(DirectoryNode & node, std::string const & n return node.add(name, SimpleCommandNode::create(fn)); } +#endif ///////////////////////////////cci.e/////////////////////////////////////// #undef prefix_