X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Console%2FNode.cci;h=6f24e9c3a6bb9271e8760caac9670c1f20900620;hb=0eaf5340de8c2fbb02b1e0e13a797931e221dff3;hp=88ed2c674727240723867f834b9b21ba687e2cbe;hpb=327ff174bdc67db20c64d92c9a171abfa5443333;p=senf.git diff --git a/Console/Node.cci b/Console/Node.cci index 88ed2c6..6f24e9c 100644 --- a/Console/Node.cci +++ b/Console/Node.cci @@ -34,14 +34,17 @@ /////////////////////////////////////////////////////////////////////////// // senf::console::GenericNode +prefix_ senf::console::GenericNode::~GenericNode() +{} + prefix_ std::string const & senf::console::GenericNode::name() const { return name_; } -prefix_ senf::console::GenericNode::GenericNode(std::string const & name, bool managed) - : name_ (name), managed_ (managed) +prefix_ senf::console::GenericNode::GenericNode() + : parent_ (0) {} prefix_ void senf::console::GenericNode::name(std::string const & name) @@ -49,70 +52,197 @@ prefix_ void senf::console::GenericNode::name(std::string const & name) name_ = name; } -prefix_ void senf::console::GenericNode::name(GenericNode & node, std::string const & name) +prefix_ boost::shared_ptr senf::console::GenericNode::parent() + const { - node.name_ = name; + return boost::static_pointer_cast( + parent_ ? parent_->shared_from_this() : ptr() ); } -prefix_ senf::console::DirectoryNode & senf::console::GenericNode::parent() - const +prefix_ senf::console::GenericNode::ptr senf::console::GenericNode::unlink() { - SENF_ASSERT( parent_ ); - return *parent_; + if (parent_) + return parent()->remove(name()); + else + return thisptr(); } -prefix_ bool senf::console::GenericNode::managed() +prefix_ void senf::console::GenericNode::help(std::ostream & output) const { - return managed_; + v_help(output); +} + +prefix_ senf::console::GenericNode::ptr senf::console::GenericNode::thisptr() +{ + return shared_from_this(); } -prefix_ bool senf::console::GenericNode::release() +prefix_ senf::console::GenericNode::cptr senf::console::GenericNode::thisptr() + const { - // Beware ! call release() first so the call is not short-circuited way ! - return intrusive_refcount_base::release() && managed_; + return shared_from_this(); } /////////////////////////////////////////////////////////////////////////// // senf::console::DirectoryNode -prefix_ void senf::console::DirectoryNode::add(std::auto_ptr node, bool uniquify) +prefix_ senf::console::DirectoryNode::ptr senf::console::DirectoryNode::create() +{ + return ptr(new DirectoryNode()); +} + +prefix_ bool senf::console::DirectoryNode::hasChild(std::string const & name) + const { - SENF_ASSERT( node->managed() ); - add(GenericNode::ptr(node.release()), uniquify); + ChildMap::const_iterator i (children_.find(name)); + return i != children_.end(); } -prefix_ void senf::console::DirectoryNode::add(GenericNode & node, bool uniquify) +prefix_ senf::console::DirectoryNode & +senf::console::DirectoryNode::getDirectory(std::string const & name) + const { - SENF_ASSERT( ! node.managed() ); - add(GenericNode::ptr(&node),uniquify); + 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(lookup(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(lookup(name)); + return getCommand(name); +} + +prefix_ senf::console::DirectoryNode & +senf::console::DirectoryNode::mkdir(std::string const & name) +{ + return add(name, create()); +} + +prefix_ senf::console::DirectoryNode::ChildrenRange senf::console::DirectoryNode::children() + const +{ + return boost::make_iterator_range(children_.begin(), children_.end()); +} + +prefix_ senf::console::DirectoryNode::DirectoryNode() +{} + +prefix_ senf::console::DirectoryNode & +senf::console::DirectoryNode::doc(std::string const & doc) +{ + doc_ = doc; + return *this; +} + +prefix_ senf::console::DirectoryNode::ptr senf::console::DirectoryNode::thisptr() +{ + return boost::static_pointer_cast(shared_from_this()); +} + +prefix_ senf::console::DirectoryNode::cptr senf::console::DirectoryNode::thisptr() + const +{ + return boost::static_pointer_cast(shared_from_this()); } -prefix_ senf::console::DirectoryNode::DirectoryNode(std::string const & name, bool managed) - : GenericNode(name, managed) +/////////////////////////////////////////////////////////////////////////// +// senf::console::SyntaxErrorException + +prefix_ senf::console::SyntaxErrorException::SyntaxErrorException(std::string const & msg) + : Exception(msg) {} /////////////////////////////////////////////////////////////////////////// // senf::console::CommandNode -prefix_ senf::console::CommandNode::CommandNode(std::string const & name, bool managed) - : GenericNode(name, managed) +prefix_ senf::console::CommandNode::ptr senf::console::CommandNode::thisptr() +{ + return boost::static_pointer_cast(shared_from_this()); +} + +prefix_ senf::console::CommandNode::cptr senf::console::CommandNode::thisptr() + const +{ + return boost::static_pointer_cast(shared_from_this()); +} + +prefix_ senf::console::CommandNode::CommandNode() {} +prefix_ void senf::console::CommandNode::execute(std::ostream & output, + ParseCommandInfo const & command) + const +{ + v_execute(output, command); +} + +prefix_ void senf::console::CommandNode::operator()(std::ostream & output, + ParseCommandInfo const & command) + const +{ + execute(output, command); +} + +/////////////////////////////////////////////////////////////////////////// +// senf::console::SimpleCommandNode + +prefix_ senf::console::SimpleCommandNode::SimpleCommandNode(Function const & fn) + : fn_ (fn) +{} + +prefix_ senf::console::SimpleCommandNode::ptr +senf::console::SimpleCommandNode::create(Function const & fn) +{ + return ptr(new SimpleCommandNode(fn)); +} + +prefix_ senf::console::SimpleCommandNode & +senf::console::SimpleCommandNode::doc(std::string const & doc) +{ + doc_ = 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()); +} + +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)); +} + + ///////////////////////////////cci.e/////////////////////////////////////// #undef prefix_