Parcourir la source

added some more documentation, fixing minor editorial nits.

JINMEI Tatuya il y a 14 ans
Parent
commit
4d42a76c3e
1 fichiers modifiés avec 54 ajouts et 30 suppressions
  1. 54 30
      src/lib/datasrc/rbtree.h

+ 54 - 30
src/lib/datasrc/rbtree.h

@@ -57,7 +57,7 @@ operator-(const isc::dns::Name& super_name, const isc::dns::Name& sub_name) {
 template <typename T>
 class RBTree;
 
-/// \brief \c RBNode is use by RBTree to store any data related to one domain
+/// \brief \c RBNode is used by RBTree to store any data related to one domain
 ///     name.
 ///
 /// This is meant to be used only from RBTree. It is meaningless to inherit it
@@ -242,18 +242,18 @@ RBNode<T>::~RBNode() {
 // because the verbatim diagram contain a backslash, which could be interpreted
 // as escape of newline in singleline comment.
 /**
- *  \brief \c RBTree class represents all the domains with the same suffix,
+ *  \brief \c RBTree class represents all the domains with the same suffix.
  *      It can be used to store the domains in one zone, for example.
  *
- *  RBTree is generic map from domain names to any kind of data. Internally, it
- *  uses a red-black tree. However, it isn't one tree containing everything.
+ *  RBTree is a generic map from domain names to any kind of data. Internally,
+ *  it uses a red-black tree. However, it isn't one tree containing everything.
  *  Subdomains are trees, so this structure is recursive - trees inside trees.
  *  But, from the interface point of view, it is opaque data structure.
  *
- *  \c RBTree split the domain space into hierarchy red black trees, nodes in one
- *  tree has the same base name. The benefit of this struct is that:
+ *  \c RBTree splits the domain space into hierarchy red black trees; nodes
+ * in one tree has the same base name. The benefit of this struct is that:
  *  - Enhances the query performace compared with one big flat red black tree.
- *  - Decrases the memory footprint, as it doesn't store the suffix labels
+ *  - Decreases the memory footprint, as it doesn't store the suffix labels
  *      multiple times.
  *
  * \anchor diagram
@@ -286,14 +286,15 @@ RBNode<T>::~RBNode() {
                                    o   q
    \endverbatim
  *  \note open problems:
- *  - current find funciton only return non-empty nodes, so there is no difference
- *    between find one not exist name with empty non-terminal nodes, but in DNS query
- *    logic, they are different
+ *  - current \c find() function only returns non-empty nodes, so there is no
+ *    difference between find a non existent name and a name corresponding to
+ *    an empty non-terminal nodes, but in DNS query logic, they are different
  *  \todo
  *  - add remove interface
- *  - add iterator to iterate the whole rbtree while may needed by axfr
- *  - since \c RBNode only has down pointer without up pointer, the node path during finding
- *    should be recorded for later use
+ *  - add iterator to iterate over the whole \c RBTree.  This may be necessary,
+ *    for example, to support AXFR.
+ *  - since \c RBNode only has down pointer without up pointer, the node path
+ *    during finding should be recorded for later use
  */
 template <typename T>
 class RBTree : public boost::noncopyable {
@@ -312,6 +313,9 @@ public:
 
     /// \name Constructor and Destructor
     //@{
+    /// The constructor.
+    ///
+    /// It never throws an exception.
     explicit RBTree();
 
     /// \b Note: RBTree is not intended to be inherited so the destructor
@@ -321,11 +325,11 @@ public:
 
     /// \name Find methods
     ///
-    /// \brief Find the node that gives a longest match agains the given name.
+    /// \brief Find the node that gives a longest match against the given name.
     ///
     /// \anchor find
     ///
-    /// These methods search the RBTree fo a node whose name is a longest
+    /// These methods search the RBTree for a node whose name is a longest
     /// against name. The found node, if any, is returned via the node pointer.
     ///
     /// By default, nodes that don't have data (see RBNode::isEmpty) are
@@ -335,8 +339,10 @@ public:
     /// the node has any data or not.
     ///
     /// The case with "no data OK" mode is not as easy as it seems. For example
-    /// in the diagram, the name y.d.e.f is logically contained in the tree as
-    /// part of the node w.y.
+    /// in the diagram shown in the class description, the name y.d.e.f is
+    /// logically contained in the tree as part of the node w.y.  It cannot be
+    /// identified simply by checking whether existing nodes (such as
+    /// d.e.f or w.y) has data.
     ///
     /// These methods involves operations on names that can throw an exception.
     /// If that happens the exception will be propagated to the caller.
@@ -351,12 +357,12 @@ public:
     ///  - EXACTMATCH when a node with the same name as requested exists.
     ///  - PARTIALMATCH when a node with the same name does not exist (or is
     ///    empty), but there's a (nonempty) superdomain of the requested one.
-    ///    The superdomain with longest name is returned trough the node
+    ///    The superdomain with longest name is returned through the node
     ///    parameter. Beware that if you store a zone in the tree, you may get
     ///    PARTIALMATCH with zone apex when the given domain name is not there.
     ///    You should not try to delegate into another zone in that case.
     ///  - NOTFOUND if there's no node with the same name nor any superdomain
-    ///    of the it. In that case, node parameter is left intact.
+    ///    of it. In that case, node parameter is left intact.
     //@{
 
     /// \brief Find with callback.
@@ -364,7 +370,7 @@ public:
     /// \anchor callback
     ///
     /// This version of find calls the callback whenever traversing (on the
-    /// way from root down the tree) a marked node on the way down trough the
+    /// way from root down the tree) a marked node on the way down through the
     /// domain namespace (see RBNode::enableCallback and related functions).
     ///
     /// If you return true from the callback, the search is stopped and a
@@ -374,7 +380,7 @@ public:
     /// This callback mechanism was designed with zone cut (delegation)
     /// processing in mind. The marked nodes would be the ones at delegation
     /// points. It is not expected that any other applications would need
-    /// callbacks, they should use the versions of find without callbacks.
+    /// callbacks; they should use the versions of find without callbacks.
     /// The callbacks are not general functors for the same reason - we don't
     /// expect it to be needed.
     ///
@@ -387,13 +393,13 @@ public:
     ///     \c callback.
     ///
     /// \return As described above, but in case of callback returning true,
-    ///     it returns imediatelly with the current node.
+    ///     it returns immediately with the current node.
     template <typename CBARG>
     Result find(const isc::dns::Name& name, RBNode<T>** node,
                 bool (*callback)(const RBNode<T>&, CBARG),
                 CBARG callback_arg) const;
 
-    /// \brief Find with callback returning imutable node.
+    /// \brief Find with callback returning immutable node.
     ///
     /// It has the same behaviour as the find with \ref callback version.
     template <typename CBARG>
@@ -408,23 +414,30 @@ public:
         return (find<void*>(name, node, NULL, NULL));
     }
 
-    /// \brieg Simple find returning imutable node.
+    /// \brieg Simple find returning immutable node.
     ///
-    /// Acts as described in the \ref find section, but returns imutable node
+    /// Acts as described in the \ref find section, but returns immutable node
     /// pointer.
     Result find(const isc::dns::Name& name, const RBNode<T>** node) const {
         return (find<void*>(name, node, NULL, NULL));
     }
     //@}
 
-    /// \brief Get the total node count in the tree
-    /// the node count including the node created common suffix node,
-    /// this function will only be used for debuging
-    int getNodeCount() const { return (node_count_);}
+    /// \brief Get the total number of nodes in the tree
+    ///
+    /// It includes nodes internally created as a result of adding a domain
+    /// name that is a subdomain of an existing node of the tree.
+    /// This function is mainly intended to be used for debugging.
+    int getNodeCount() const { return (node_count_); }
 
     /// \name Debug function
     //@{
-    /// \brief print the nodes in the trees
+    /// \brief Print the nodes in the trees.
+    ///
+    /// \param os A \c std::ostream object to which the tree is printed.
+    /// \param depth A factor of the initial indentation.  Each line
+    /// will begin with space character repeating <code>5 * depth</code>
+    /// times.
     void dumpTree(std::ostream& os, unsigned int depth = 0) const;
     //@}
 
@@ -441,6 +454,17 @@ public:
     /// Please note that the tree can add some empty nodes by itself, so don't
     /// assume that if you didn't insert a node of that name it doesn't exist.
     ///
+    /// This method normally involves resource allocation.  If it fails
+    /// the corresponding standard exception will be thrown.
+    ///
+    /// This method does not provide the strong exception guarantee in its
+    /// strict sense; if an exception is thrown in the middle of this
+    /// method, the internal structure may change.  However, it should
+    /// still retain the same property as a mapping container before this
+    /// method is called.  For example, the result of \c find() should be
+    /// the same.  This method provides the weak exception guarantee in its
+    /// normal sense.
+    ///
     /// \param name The name to be inserted into the tree.
     /// \param inserted_node This is an output parameter and is set to the
     ///     node.