mkwan 2003/02/14 12:31:11
Modified: java/src/org/apache/xml/dtm/ref/sax2dtm Tag: XSLTC_DTM
SAX2DTM2.java
Log:
XSLTC_DTM performance work
Improvement for FollowingIterator and TypedFollowingIterator.
Import the code from the first() and next() interfaces of FollowingTraverser
and optimize it.
Revision Changes Path
No revision
No revision
1.1.2.13 +87 -20
xml-xalan/java/src/org/apache/xml/dtm/ref/sax2dtm/Attic/SAX2DTM2.java
Index: SAX2DTM2.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xml/dtm/ref/sax2dtm/Attic/SAX2DTM2.java,v
retrieving revision 1.1.2.12
retrieving revision 1.1.2.13
diff -u -r1.1.2.12 -r1.1.2.13
--- SAX2DTM2.java 14 Feb 2003 18:30:46 -0000 1.1.2.12
+++ SAX2DTM2.java 14 Feb 2003 20:31:11 -0000 1.1.2.13
@@ -1025,11 +1025,11 @@
*/
public class FollowingIterator extends InternalAxisIteratorBase
{
- DTMAxisTraverser m_traverser; // easier for now
+ //DTMAxisTraverser m_traverser; // easier for now
public FollowingIterator()
{
- m_traverser = getAxisTraverser(Axis.FOLLOWING);
+ //m_traverser = getAxisTraverser(Axis.FOLLOWING);
}
/**
@@ -1049,12 +1049,34 @@
{
_startNode = node;
- // ?? -sb
- // find rightmost descendant (or self)
- // int current;
- // while ((node = getLastChild(current = node)) != NULL){}
- // _currentNode = current;
- _currentNode = m_traverser.first(node);
+ //_currentNode = m_traverser.first(node);
+
+ node = makeNodeIdentity(node);
+
+ int first;
+ int type = _type2(node);
+
+ if ((DTM.ATTRIBUTE_NODE == type) || (DTM.NAMESPACE_NODE == type))
+ {
+ node = _parent2(node);
+ first = _firstch2(node);
+
+ if (NULL != first) {
+ _currentNode = makeNodeHandle(first);
+ return resetPosition();
+ }
+ }
+
+ do
+ {
+ first = _nextsib2(node);
+
+ if (NULL == first)
+ node = _parent2(node);
+ }
+ while (NULL == first && NULL != node);
+
+ _currentNode = makeNodeHandle(first);
// _currentNode precedes possible following(node) nodes
return resetPosition();
@@ -1073,10 +1095,27 @@
int node = _currentNode;
- _currentNode = m_traverser.next(_startNode, _currentNode);
+ //_currentNode = m_traverser.next(_startNode, _currentNode);
+ int current = makeNodeIdentity(node);
+
+ while (true)
+ {
+ current++;
+
+ int type = _type2(current);
+ if (NULL == type) {
+ _currentNode = NULL;
+ return returnNode(node);
+ }
+
+ if (ATTRIBUTE_NODE == type || NAMESPACE_NODE == type)
+ continue;
- return returnNode(node);
+ _currentNode = makeNodeHandle(current);
+ return returnNode(node);
+ }
}
+
} // end of FollowingIterator
/**
@@ -1106,19 +1145,47 @@
*/
public int next()
{
-
+ int current;
int node;
+ int type;
- do{
- node = _currentNode;
-
- _currentNode = m_traverser.next(_startNode, _currentNode);
-
- }
- while (node != DTM.NULL
- && (getExpandedTypeID(node) != _nodeType && getNodeType(node)
!= _nodeType));
+ final int nodeType = _nodeType;
+ int currentNodeID = makeNodeIdentity(_currentNode);
+
+ if (nodeType >= DTM.NTYPES) {
+ do {
+ node = currentNodeID;
+ current = node;
+
+ do {
+ current++;
+ type = _type2(current);
+ }
+ while (type != NULL && (ATTRIBUTE_NODE == type || NAMESPACE_NODE
== type));
+
+ currentNodeID = (type != NULL) ? current : NULL;
+ }
+ while (node != DTM.NULL && _exptype2(node) != nodeType);
+ }
+ else {
+ do {
+ node = currentNodeID;
+ current = node;
+
+ do {
+ current++;
+ type = _type2(current);
+ }
+ while (type != NULL && (ATTRIBUTE_NODE == type || NAMESPACE_NODE
== type));
+
+ currentNodeID = (type != NULL) ? current : NULL;
+ }
+ while (node != DTM.NULL
+ && (_exptype2(node) != nodeType && _type2(node) !=
nodeType));
+ }
- return (node == DTM.NULL ? DTM.NULL :returnNode(node));
+ _currentNode = makeNodeHandle(currentNodeID);
+ return (node == DTM.NULL ? DTM.NULL :returnNode(makeNodeHandle(node)));
}
} // end of TypedFollowingIterator
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]