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]

Reply via email to