zongaro 2002/12/21 02:24:56 Modified: java/src/org/apache/xml/dtm/ref Tag: XSLTC_DTM DTMDefaultBaseIterators.java Log: Split loops in next() method of most typed iterators into two - one to handle matching against expanded type ID's and another to handle matching against DTM node types. The two can be handled more efficiently separately. Also fixed bug in PrecedingIterator.gotoMark; the _stack was being changed by the operation, even though it's not actually supposed to change during the course of execution of the iterator. Revision Changes Path No revision No revision 1.12.2.10 +174 -64 xml-xalan/java/src/org/apache/xml/dtm/ref/DTMDefaultBaseIterators.java Index: DTMDefaultBaseIterators.java =================================================================== RCS file: /home/cvs/xml-xalan/java/src/org/apache/xml/dtm/ref/DTMDefaultBaseIterators.java,v retrieving revision 1.12.2.9 retrieving revision 1.12.2.10 diff -u -r1.12.2.9 -r1.12.2.10 --- DTMDefaultBaseIterators.java 17 Dec 2002 19:06:41 -0000 1.12.2.9 +++ DTMDefaultBaseIterators.java 21 Dec 2002 10:24:56 -0000 1.12.2.10 @@ -399,13 +399,17 @@ */ public int next() { - int result = _currentNode; - if ((_nodeType != -1) && (getExpandedTypeID(_currentNode) != _nodeType)) - result = END; - else - result = _currentNode; + if (_nodeType >= DTM.NTYPES) { + if (_nodeType != getExpandedTypeID(_currentNode)) { + result = END; + } + } else if (_nodeType != NULL) { + if (_nodeType != getNodeType(_currentNode)) { + result = END; + } + } _currentNode = END; @@ -472,10 +476,24 @@ int eType; int node = _currentNode; - while (node != DTM.NULL - && (eType = _exptype(node)) != _nodeType - && m_expandedNameTable.getType(eType) != _nodeType) { - node = _nextsib(node); + int nodeType = _nodeType; + + if (nodeType >= DTM.NTYPES) { + while (node != DTM.NULL && _exptype(node) != nodeType) { + node = _nextsib(node); + } + } else { + while (node != DTM.NULL) { + eType = _exptype(node); + if (eType < DTM.NTYPES) { + if (eType == nodeType) { + break; + } + } else if (m_expandedNameTable.getType(eType) == nodeType) { + break; + } + node = _nextsib(node); + } } if (node == DTM.NULL) { @@ -651,11 +669,12 @@ { int node; - for (node = _currentNode; node != END; node = getNextNamespaceNode(_startNode, node, true)) - { - if (getExpandedTypeID(node) == _nodeType || getNodeType(node) == _nodeType - || getNamespaceType(node) == _nodeType) - { + for (node = _currentNode; + node != END; + node = getNextNamespaceNode(_startNode, node, true)) { + if (getExpandedTypeID(node) == _nodeType + || getNodeType(node) == _nodeType + || getNamespaceType(node) == _nodeType) { _currentNode = node; return returnNode(node); @@ -752,13 +771,27 @@ if(_startNode == _currentNode) return NULL; - _currentNode = _startNode; + int nodeType = _nodeType; + int node = _startNode; + int expType = getExpandedTypeID(node); - if (getExpandedTypeID(_startNode) == _nodeType || getNodeType(_startNode) == _nodeType) - { - return returnNode(_startNode); + _currentNode = node; + + if (nodeType >= DTM.NTYPES) { + if (nodeType == expType) { + return returnNode(node); } - + } else { + if (expType < DTM.NTYPES) { + if (expType == nodeType) { + return returnNode(node); + } + } else { + if (m_expandedNameTable.getType(expType) == nodeType) { + return returnNode(node); + } + } + } return END; } @@ -906,10 +939,24 @@ int node = _currentNode; int eType; - - while ((node = _nextsib(node)) != DTM.NULL && - (eType = _exptype(node)) != _nodeType && - m_expandedNameTable.getType(eType)!= _nodeType) {} + int nodeType = _nodeType; + + if (nodeType >= DTM.NTYPES) { + do { + node = _nextsib(node); + } while (node != DTM.NULL && _exptype(node) != nodeType); + } else { + while ((node = _nextsib(node)) != DTM.NULL) { + eType = _exptype(node); + if (eType < DTM.NTYPES) { + if (eType == nodeType) { + break; + } + } else if (m_expandedNameTable.getType(eType) == nodeType) { + break; + } + } + } _currentNode = node; @@ -1153,11 +1200,27 @@ int node = _currentNode; int expType; - while (node != NULL - && node != _startNodeID - && ((expType = _exptype(node)) != _nodeType) - && (m_expandedNameTable.getType(expType) != _nodeType)) { - node = _nextsib(node); + int nodeType = _nodeType; + int startID = _startNodeID; + + if (nodeType >= DTM.NTYPES) { + while (node != NULL && node != startID && _exptype(node) != nodeType) { + node = _nextsib(node); + } + } else { + while (node != NULL && node != startID) { + expType = _exptype(node); + if (expType < DTM.NTYPES) { + if (expType == nodeType) { + break; + } + } else { + if (m_expandedNameTable.getType(expType) == nodeType) { + break; + } + } + node = _nextsib(node); + } } if (node == DTM.NULL || node == _startNodeID) { @@ -1333,13 +1396,6 @@ public void gotoMark() { _sp = _markedsp; _currentNode = _markedNode; - _stack[0] = _markedDescendant; - int parent = _parent(_currentNode); - for (int index = 1; index < _sp-1; index++) { - _stack[index] = parent; - parent = _parent(parent); - } - _stack[_sp] = _currentNode; } } // end of PrecedingIterator @@ -1372,26 +1428,57 @@ */ public int next() { + int node = _currentNode; + int nodeType = _nodeType; - int node; - - do{ - node = _currentNode + 1; - if ((_sp >= 0) && (node < _stack[_sp])) - { - node = makeNodeHandle((_currentNode = node)); // | m_dtmIdent); - } - else - { - _currentNode = node; // skip ancestor + if (nodeType >= DTM.NTYPES) { + while (true) { + node = node + 1; + + if (_sp < 0) { + node = NULL; + break; + } else if (node >= _stack[_sp]) { + if (--_sp < 0) { + node = NULL; + break; + } + } else if (_exptype(node) == nodeType) { + break; + } + } + } else { + int expType; - node = (--_sp >= 0 ? makeNodeHandle(node)/*next()*/ : NULL); - } + while (true) { + node = node + 1; + + if (_sp < 0) { + node = NULL; + break; + } else if (node >= _stack[_sp]) { + if (--_sp < 0) { + node = NULL; + break; + } + } else { + expType = _exptype(node); + if (expType < DTM.NTYPES) { + if (expType == nodeType) { + break; + } + } else { + if (m_expandedNameTable.getType(expType) == nodeType) { + break; + } + } + } + } } - while (node /*= super.next())*/ != NULL - && (getExpandedTypeID(node) != _nodeType && getNodeType(node) != _nodeType)); + + _currentNode = node; - return (node == NULL ? NULL : returnNode(node)); + return (node == NULL) ? NULL : returnNode(makeNodeHandle(node)); } } // end of TypedPrecedingIterator @@ -1483,7 +1570,7 @@ { int node; - + do{ node = _currentNode; @@ -1685,6 +1772,7 @@ if (_isRestartable) { int nodeID = makeNodeIdentity(node); + int nodeType = _nodeType; if (!_includeSelf && node != DTM.NULL) { nodeID = _parent(nodeID); @@ -1692,14 +1780,26 @@ _startNode = node; - while (nodeID != END) { - int eType = _exptype(nodeID); - - if ((eType == _nodeType) - || (m_expandedNameTable.getType(eType) == _nodeType)) { - m_ancestors.addElement(makeNodeHandle(nodeID)); + if (nodeType >= DTM.NTYPES) { + while (nodeID != END) { + int eType = _exptype(nodeID); + + if (eType == nodeType) { + m_ancestors.addElement(makeNodeHandle(nodeID)); + } + nodeID = _parent(nodeID); + } + } else { + while (nodeID != END) { + int eType = _exptype(nodeID); + + if ((eType >= DTM.NTYPES + && m_expandedNameTable.getType(eType) == nodeType) + || (eType < DTM.NTYPES && eType == nodeType)) { + m_ancestors.addElement(makeNodeHandle(nodeID)); + } + nodeID = _parent(nodeID); } - nodeID = _parent(nodeID); } m_ancestorsPos = m_ancestors.size()-1; @@ -1848,7 +1948,7 @@ public int next() { int node; - int eType; + int type; if (_startNode == NULL) { return NULL; @@ -1859,15 +1959,14 @@ do { node++; - int type = _type(node); + type = _type(node); if (NULL == type ||!isDescendant(node)) { _currentNode = NULL; return END; } } - while ((eType = _exptype(node)) != _nodeType - && m_expandedNameTable.getType(eType) != _nodeType); + while (type != _nodeType && _exptype(node) != _nodeType); _currentNode = node; return returnNode(makeNodeHandle(node)); @@ -2080,10 +2179,21 @@ //final int result = super.next(); final int result = _currentNode; + int nodeType = _nodeType; _currentNode = END; - return (getExpandedTypeID(result) == _nodeType || getNodeType(result) == _nodeType) ? returnNode(result) : NULL; + if (nodeType >= DTM.NTYPES) { + if (getExpandedTypeID(result) == nodeType) { + return returnNode(result); + } + } else { + if (getNodeType(result) == nodeType) { + return returnNode(result); + } + } + + return NULL; } } // end of TypedSingletonIterator }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]