/** \file
\brief Node inline non-template implementation */
-//#include "Node.ih"
+#include "Node.ih"
// Custom includes
#include "../Utils/senfassert.hh"
return name_;
}
-prefix_ senf::console::GenericNode::GenericNode(std::string const & name)
- : name_ (name), parent_ (0)
-{
- ///\fixme Provide a default name if 'name' is empty ?
-}
+prefix_ senf::console::GenericNode::GenericNode()
+ : parent_ (0)
+{}
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::DirectoryNode> senf::console::GenericNode::parent()
const
{
parent_ ? parent_->shared_from_this() : ptr() );
}
+prefix_ senf::console::GenericNode::ptr senf::console::GenericNode::unlink()
+{
+ if (parent_)
+ return parent()->remove(name());
+ else
+ return thisptr();
+}
+
+prefix_ void senf::console::GenericNode::help(std::ostream & output)
+ const
+{
+ v_help(output);
+}
+
prefix_ senf::console::GenericNode::ptr senf::console::GenericNode::thisptr()
{
return shared_from_this();
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<DirectoryNode const *>(this);
+}
+
+prefix_ bool senf::console::GenericNode::isLink()
+ const
+{
+ 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::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::GenericNode & senf::console::LinkNode::follow()
+ const
+{
+ return *node_;
+}
+
+prefix_ senf::console::LinkNode::LinkNode(GenericNode & node)
+ : node_ (node.thisptr())
+{}
+
///////////////////////////////////////////////////////////////////////////
// senf::console::DirectoryNode
+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::GenericNode &
-senf::console::DirectoryNode::add(std::auto_ptr<GenericNode> node, bool uniquify)
+senf::console::DirectoryNode::get(std::string const & name)
+ const
{
- GenericNode::ptr p (node.release());
- add(p, uniquify);
- return *p;
+ 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
+{
+ try {
+ return dynamic_cast<DirectoryNode&>(get(name));
+ }
+ SENF_WRAP_EXC(std::bad_cast)
}
prefix_ senf::console::DirectoryNode &
senf::console::DirectoryNode::operator[](std::string const & name)
const
{
- return dynamic_cast<DirectoryNode&>(get(name));
+ return getDirectory(name);
+}
+
+prefix_ senf::console::CommandNode &
+senf::console::DirectoryNode::getCommand(std::string const & name)
+ const
+{
+ try {
+ return dynamic_cast<CommandNode&>(get(name));
+ }
+ SENF_WRAP_EXC(std::bad_cast)
}
prefix_ senf::console::CommandNode &
senf::console::DirectoryNode::operator()(std::string const & name)
const
{
- return dynamic_cast<CommandNode&>(get(name));
+ return getCommand(name);
}
prefix_ senf::console::DirectoryNode &
senf::console::DirectoryNode::mkdir(std::string const & name)
{
- return static_cast<DirectoryNode &>(
- add(std::auto_ptr<GenericNode>(new DirectoryNode(name))));
+ return add(name, create());
}
prefix_ senf::console::DirectoryNode::ChildrenRange senf::console::DirectoryNode::children()
return boost::make_iterator_range(children_.begin(), children_.end());
}
-prefix_ senf::console::DirectoryNode::DirectoryNode(std::string const & name)
- : GenericNode(name)
+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()
{}
+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<DirectoryNode>(shared_from_this());
}
///////////////////////////////////////////////////////////////////////////
-// senf::console::CommandNode
+// 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)
+ : message_(msg)
+{}
-prefix_ senf::console::CommandNode::CommandNode(std::string const & name)
- : GenericNode(name)
+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()
{
return boost::static_pointer_cast<CommandNode>(shared_from_this());
return boost::static_pointer_cast<CommandNode const>(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<SimpleCommandNode>(shared_from_this());
+}
+
+prefix_ senf::console::SimpleCommandNode::cptr senf::console::SimpleCommandNode::thisptr()
+ const
+{
+ return boost::static_pointer_cast<SimpleCommandNode const>(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_