X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FNode.cci;h=0193989b31695bd22ca88b07466b4c59f1210461;hb=1863c038d0400159ce49b851a5b81c2ce698c684;hp=915d954fe26353228015121ef0606cc98d0bcaa4;hpb=9c0078ac0054789badff2a987364ed0448b080ef;p=senf.git diff --git a/Console/Node.cci b/Console/Node.cci index 915d954..0193989 100644 --- a/Console/Node.cci +++ b/Console/Node.cci @@ -52,11 +52,6 @@ prefix_ void senf::console::GenericNode::name(std::string const & name) name_ = name; } -prefix_ void senf::console::GenericNode::name(GenericNode & node, std::string const & name) -{ - node.name_ = name; -} - prefix_ boost::shared_ptr senf::console::GenericNode::parent() const { @@ -66,8 +61,10 @@ prefix_ boost::shared_ptr senf::console::GenericNo prefix_ senf::console::GenericNode::ptr senf::console::GenericNode::unlink() { - SENF_ASSERT( parent() ); - return parent()->remove(name()); + if (parent_) + return parent()->remove(name()); + else + return thisptr(); } prefix_ void senf::console::GenericNode::help(std::ostream & output) @@ -90,31 +87,56 @@ prefix_ senf::console::GenericNode::cptr senf::console::GenericNode::thisptr() /////////////////////////////////////////////////////////////////////////// // senf::console::DirectoryNode -prefix_ std::auto_ptr -senf::console::DirectoryNode::create() +prefix_ senf::console::DirectoryNode::ptr senf::console::DirectoryNode::create() +{ + return ptr(new DirectoryNode()); +} + +prefix_ bool senf::console::DirectoryNode::hasChild(std::string const & name) + const +{ + ChildMap::const_iterator i (children_.find(name)); + return i != children_.end(); +} + +prefix_ senf::console::DirectoryNode & +senf::console::DirectoryNode::getDirectory(std::string const & name) + const { - return std::auto_ptr(new DirectoryNode()); + try { + return dynamic_cast(get(name)); + } + SENF_WRAP_EXC(std::bad_cast) } prefix_ senf::console::DirectoryNode & senf::console::DirectoryNode::operator[](std::string const & name) const { - return dynamic_cast(get(name)); + return getDirectory(name); +} + +prefix_ senf::console::CommandNode & +senf::console::DirectoryNode::getCommand(std::string const & name) + const +{ + try { + return dynamic_cast(get(name)); + } + SENF_WRAP_EXC(std::bad_cast) } prefix_ senf::console::CommandNode & senf::console::DirectoryNode::operator()(std::string const & name) const { - return dynamic_cast(get(name)); + return getCommand(name); } prefix_ senf::console::DirectoryNode & senf::console::DirectoryNode::mkdir(std::string const & name) { - std::auto_ptr node (create()); - return add(name, node); + return add(name, create()); } prefix_ senf::console::DirectoryNode::ChildrenRange senf::console::DirectoryNode::children() @@ -123,6 +145,14 @@ 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_ senf::console::DirectoryNode::DirectoryNode() {} @@ -145,6 +175,23 @@ prefix_ senf::console::DirectoryNode::cptr senf::console::DirectoryNode::thisptr } /////////////////////////////////////////////////////////////////////////// +// 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() @@ -161,23 +208,31 @@ prefix_ senf::console::CommandNode::cptr senf::console::CommandNode::thisptr() prefix_ senf::console::CommandNode::CommandNode() {} -/////////////////////////////////////////////////////////////////////////// -// senf::console::SimpleCommandNode +prefix_ void senf::console::CommandNode::execute(std::ostream & output, + ParseCommandInfo const & command) + const +{ + v_execute(output, command); +} -prefix_ void senf::console::SimpleCommandNode::operator()(std::ostream & output, - Arguments const & arguments) +prefix_ void senf::console::CommandNode::operator()(std::ostream & output, + ParseCommandInfo const & command) + const { - fn_(output, arguments); + execute(output, command); } +/////////////////////////////////////////////////////////////////////////// +// senf::console::SimpleCommandNode + prefix_ senf::console::SimpleCommandNode::SimpleCommandNode(Function const & fn) : fn_ (fn) {} -prefix_ std::auto_ptr +prefix_ senf::console::SimpleCommandNode::ptr senf::console::SimpleCommandNode::create(Function const & fn) { - return std::auto_ptr(new SimpleCommandNode(fn)); + return ptr(new SimpleCommandNode(fn)); } prefix_ senf::console::SimpleCommandNode & @@ -187,6 +242,28 @@ senf::console::SimpleCommandNode::doc(std::string const & doc) return *this; } +prefix_ senf::console::SimpleCommandNode::ptr senf::console::SimpleCommandNode::thisptr() +{ + return boost::static_pointer_cast(shared_from_this()); +} + +prefix_ senf::console::SimpleCommandNode::cptr senf::console::SimpleCommandNode::thisptr() + const +{ + 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) +{ + return node.add(name, SimpleCommandNode::create(fn)); +} + +#endif + ///////////////////////////////cci.e/////////////////////////////////////// #undef prefix_