Utils: Refactor hexdump() helper to move code out of template function
[senf.git] / Console / Node.hh
index a93c23c..0bfc594 100644 (file)
@@ -218,6 +218,8 @@ namespace console {
     class DirectoryNode;
     class CommandNode;
 
+    DirectoryNode & root();
+
     /** \brief Config/console node tree base-class
 
         GenericNode is the base class of all node objects. There are two basic node types derived
@@ -259,6 +261,10 @@ namespace console {
         std::string path() const;       ///< Node path
                                         /**< The node path is built by joining the names of all
                                              parent nodes with '/' chars. */
+        std::string path(DirectoryNode const & root) const;       
+                                        ///< Node path up to \a root
+                                        /**< The node path is built by joining the names of all
+                                             parent nodes up to \a root with '/' chars. */
 
         ptr unlink();                   ///< Remove node from it's parent directory
                                         /**< You may either discard the return value and thereby
@@ -272,6 +278,16 @@ namespace console {
         ptr thisptr();                  ///< Get smart pointer to node
         cptr thisptr() const;           ///< Get smart pointer to node (const)
 
+        bool isChildOf(DirectoryNode & parent) const;
+                                        ///< \c true, if node is a child of \a parent
+                                        /**< Will also return \c true, if \a parent is the current
+                                             node. */
+
+        bool operator== (GenericNode & other) const;
+                                        /// \c true, if this and \a other are the same node
+        bool operator!= (GenericNode & other) const;
+                                        /// \c true, if this and \a other are different nodes
+
     protected:
         GenericNode();
 
@@ -465,15 +481,19 @@ namespace console {
         DirectoryNode & mkdir(std::string const & name);
                                         ///< Create sub-directory node
         
-        ChildrenRange children() const;
-                                        ///< Return iterator range over all children.
+        ChildrenRange children() const; ///< Return iterator range over all children.
+                                        /**< The returned range is sorted by child name. */
+
+        ChildrenRange completions(std::string const & s) const;
+                                        ///< Return iterator range of completions for \a s
                                         /**< The returned range is sorted by child name. */
 
         ///\}
         ///////////////////////////////////////////////////////////////////////////
 
         template <class ForwardRange>
-        GenericNode & traverse(ForwardRange const & range);
+        GenericNode & traverse(ForwardRange const & range, bool autocomplete=false,
+                               DirectoryNode & root = root());
                                         ///< Traverse node path starting at this node
                                         /**< The <tt>ForwardRange::value_type</tt> must be
                                              (convertible to) std::string. Each range element
@@ -482,7 +502,11 @@ namespace console {
                                              If the range starts with an empty element, the
                                              traversal is started at the root() node, otherwise it
                                              is started at \a this node. The traversal supports '.',
-                                             '..' and ignores further empty elements. */
+                                             '..' and ignores further empty elements. 
+
+                                             If \a autocomplete is set to \c true, invalid path
+                                             components which can be uniquely completed will be
+                                             completed automatically while traversing the tree. */
 
         DirectoryNode & doc(std::string const & doc);
                                         ///< Set node documentation
@@ -513,23 +537,6 @@ namespace console {
     {};
 #endif
 
-    /**  \brief Syntax error parsing command arguments exception
-
-        All errors while parsing the arguments of a command must be signaled by throwing an instance
-        of SyntaxErrorException. This is important, so command overloading works.
-     */
-    struct SyntaxErrorException : public std::exception
-    {
-        explicit SyntaxErrorException(std::string const & msg = "");
-        virtual ~SyntaxErrorException() throw();
-
-        virtual char const * what() const throw();
-        std::string const & message() const;
-
-    private:
-        std::string message_;
-    };
-
     /** \brief Config/console tree command node
 
         The CommandNode is the base-class for the tree leaf nodes. Concrete command node
@@ -651,8 +658,6 @@ namespace console {
 
 #endif
 
-    DirectoryNode & root();
-
 }}
 
 #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()