xalan-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From dbert...@apache.org
Subject cvs commit: xml-xalan/c/src/DOMSupport TreeWalker.hpp TreeWalker.cpp
Date Wed, 29 Jan 2003 05:22:38 GMT
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: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org


Mime
View raw message