dbertoni 2003/01/28 21:22:38
Modified: c/src/DOMSupport TreeWalker.hpp TreeWalker.cpp
Log:
Added support for stopping a traversal, then restarting it.
Revision Changes Path
1.6 +95 -27 xml-xalan/c/src/DOMSupport/TreeWalker.hpp
Index: TreeWalker.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/DOMSupport/TreeWalker.hpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- TreeWalker.hpp 20 Nov 2002 02:27:25 -0000 1.5
+++ TreeWalker.hpp 29 Jan 2003 05:22:38 -0000 1.6
@@ -2,7 +2,7 @@
* The Apache Software License, Version 1.1
*
*
- * Copyright (c) 1999-2002 The Apache Software Foundation. All rights
+ * Copyright (c) 1999-2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -85,47 +85,87 @@
~TreeWalker();
/**
- * Perform a pre-order traversal non-recursive style.
- *
- * @param pos starting node $$$
+ * Perform a document-order traversal.
+ *
+ * Derived classes and stop the traversal by returning
+ * true from startNode() or endNode(). If that happens,
+ * the function will return the next node in document
+ * order. If desired, the caller can start traversing
+ * the tree again from that point. Note that terminal
+ * nodes will always have startNode() and endNode()
+ * called before the traversal terminates.
+ *
+ * @param pos The node in the tree with which to start the walk
+ *
+ * @return 0 if the traversal completes, or the next node if the
traversal doesn't complete.
*/
-
- virtual void
+ const XalanNode*
traverse(const XalanNode* pos);
/**
- * Perform a pre-order traversal non-recursive style.
- *
- * @param pos starting node $$$
+ * Perform a document-order traversal.
+ *
+ * Derived classes and stop the traversal by returning
+ * true from startNode() or endNode(). If that happens,
+ * the function will return the next node in document
+ * order. If desired, the caller can start traversing
+ * the tree again from that point. Note that terminal
+ * nodes will always have startNode() and endNode()
+ * called before the traversal terminates.
+ *
+ * @param pos The node in the tree with which to start the walk
+ *
+ * @return 0 if the traversal completes, or the next node if the
traversal doesn't complete.
*/
-
- virtual void
+ XalanNode*
traverse(XalanNode* pos);
/**
- * Perform a pre-order traversal non-recursive style.
- *
- * @param pos starting node $$$
- * @param parent parent node $$$
+ * Perform a document-order traversal stopping at the
+ * provided parent node.
+ *
+ * Derived classes and stop the traversal by returning
+ * true from startNode() or endNode(). If that happens,
+ * the function will return the next node in document
+ * order. If desired, the caller can start traversing
+ * the tree again from that point. Note that terminal
+ * nodes will always have startNode() and endNode()
+ * called before the traversal terminates.
+ *
+ * @param pos The node in the tree with which to start the walk
+ * @param parent The parent of pos. Note that for multiple calls that
continue the traversal, this node must remain the same.
+ *
+ * @return parent if the traversal completes, or the next node if the
traversal doesn't complete.
*/
- virtual void
+ const XalanNode*
traverse(
const XalanNode* pos,
const XalanNode* parent);
/**
- * Perform a pre-order traversal non-recursive style.
- *
- * @param pos starting node $$$
- * @param parent parent node $$$
+ * Perform a document-order traversal stopping at the
+ * provided parent node.
+ *
+ * Derived classes and stop the traversal by returning
+ * true from startNode() or endNode(). If that happens,
+ * the function will return the next node in document
+ * order. If desired, the caller can start traversing
+ * the tree again from that point. Note that terminal
+ * nodes will always have startNode() and endNode()
+ * called before the traversal terminates.
+ *
+ * @param pos The node in the tree with which to start the walk
+ * @param parent The parent of pos. Note that for multiple calls that
continue the traversal, this node must remain the same.
+ *
+ * @return parent if the traversal completes, or the next node if the
traversal doesn't complete.
*/
- virtual void
+ XalanNode*
traverse(
XalanNode* pos,
XalanNode* parent);
/**
- * Perform a pre-order traversal non-recursive style.
+ * Perform a pre-order traversal.
*
* @param pos starting node
*/
@@ -133,7 +173,7 @@
traverseSubtree(const XalanNode* pos);
/**
- * Perform a pre-order traversal non-recursive style.
+ * Perform a pre-order traversal.
*
* @param pos starting node
*/
@@ -142,16 +182,44 @@
protected:
- virtual void
+ /**
+ * Called when first walking a node
+ *
+ * @param node The node
+ *
+ * @return return false if the walk should continue, or true if it
should not.
+ */
+ virtual bool
startNode(const XalanNode* node) = 0;
- virtual void
+ /**
+ * Called when first walking a node
+ *
+ * @param node The node
+ *
+ * @return return false if the walk should continue, or true if it
should not.
+ */
+ virtual bool
startNode(XalanNode* node) = 0;
- virtual void
+ /**
+ * Called when leaving a node
+ *
+ * @param node The node
+ *
+ * @return return false if the walk should continue, or true if it
should not.
+ */
+ virtual bool
endNode(const XalanNode* node) = 0;
- virtual void
+ /**
+ * Called when leaving a node
+ *
+ * @param node The node
+ *
+ * @return return false if the walk should continue, or true if it
should not.
+ */
+ virtual bool
endNode(XalanNode* node) = 0;
private:
1.5 +61 -17 xml-xalan/c/src/DOMSupport/TreeWalker.cpp
Index: TreeWalker.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/DOMSupport/TreeWalker.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- TreeWalker.cpp 20 Nov 2002 02:27:25 -0000 1.4
+++ TreeWalker.cpp 29 Jan 2003 05:22:38 -0000 1.5
@@ -2,7 +2,7 @@
* The Apache Software License, Version 1.1
*
*
- * Copyright (c) 1999-2002 The Apache Software Foundation. All rights
+ * Copyright (c) 1999-2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -83,22 +83,31 @@
-void
+const XalanNode*
TreeWalker::traverse(const XalanNode* pos)
{
assert(pos != 0);
const XalanNode* thePos = pos;
- while(0 != thePos)
+ bool fStop = false;
+
+ while(0 != thePos && fStop == false)
{
- startNode(thePos);
+ fStop = startNode(thePos);
const XalanNode* nextNode = thePos->getFirstChild();
while(0 == nextNode)
{
- endNode(thePos);
+ if (fStop == false)
+ {
+ fStop = endNode(thePos);
+ }
+ else
+ {
+ endNode(thePos);
+ }
nextNode = thePos->getNextSibling();
@@ -117,26 +126,37 @@
thePos = nextNode;
}
+
+ return thePos;
}
-void
+XalanNode*
TreeWalker::traverse(XalanNode* pos)
{
assert(pos != 0);
XalanNode* thePos = pos;
- while(0 != thePos)
+ bool fStop = false;
+
+ while(0 != thePos && fStop == false)
{
- startNode(thePos);
+ fStop = startNode(thePos);
XalanNode* nextNode = thePos->getFirstChild();
while(0 == nextNode)
{
- endNode(thePos);
+ if (fStop == false)
+ {
+ fStop = endNode(thePos);
+ }
+ else
+ {
+ endNode(thePos);
+ }
nextNode = thePos->getNextSibling();
@@ -155,11 +175,13 @@
thePos = nextNode;
}
+
+ return thePos;
}
-void
+const XalanNode*
TreeWalker::traverse(
const XalanNode* pos,
const XalanNode* parent)
@@ -169,15 +191,24 @@
const XalanNode* thePos = pos;
- while(parent != thePos)
+ bool fStop = false;
+
+ while(parent != thePos && fStop == false)
{
- startNode(thePos);
+ fStop = startNode(thePos);
const XalanNode* nextNode = thePos->getFirstChild();
while(0 == nextNode)
{
- endNode(thePos);
+ if (fStop == false)
+ {
+ fStop = endNode(thePos);
+ }
+ else
+ {
+ endNode(thePos);
+ }
nextNode = thePos->getNextSibling();
@@ -196,11 +227,13 @@
thePos = nextNode;
}
+
+ return thePos;
}
-void
+XalanNode*
TreeWalker::traverse(
XalanNode* pos,
XalanNode* parent)
@@ -210,15 +243,24 @@
XalanNode* thePos = pos;
- while(parent != thePos)
+ bool fStop = false;
+
+ while(parent != thePos && fStop == false)
{
- startNode(thePos);
+ fStop = startNode(thePos);
XalanNode* nextNode = thePos->getFirstChild();
while(0 == nextNode)
{
- endNode(thePos);
+ if (fStop == false)
+ {
+ fStop = endNode(thePos);
+ }
+ else
+ {
+ endNode(thePos);
+ }
nextNode = thePos->getNextSibling();
@@ -237,6 +279,8 @@
thePos = nextNode;
}
+
+ return thePos;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]