dbertoni    00/05/29 15:22:10

  Modified:    c/src/XPath MutableNodeRefList.cpp NodeRefList.cpp
                        NodeRefList.hpp
  Log:
  Added debugging code to check for duplicate nodes.  Added some code to 
prevent some reallocations, and to prevent duplicates from being added.
  
  Revision  Changes    Path
  1.9       +24 -7     xml-xalan/c/src/XPath/MutableNodeRefList.cpp
  
  Index: MutableNodeRefList.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/MutableNodeRefList.cpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- MutableNodeRefList.cpp    2000/05/05 15:12:17     1.8
  +++ MutableNodeRefList.cpp    2000/05/29 22:22:09     1.9
  @@ -258,6 +258,12 @@
   {
        const unsigned int      theLength = nodelist.getLength();
   
  +     // Reserve the space at the start.  We may end up reserving
  +     // more space than necessary, but it's a small price to
  +     // pay for the increased speed.  We can always shrink by
  +     // swapping if we have way to much space.
  +     m_nodeList.reserve(getLength() + theLength);
  +
        for (unsigned int i = 0; i < theLength; i++)
        {
                addNode(nodelist.item(i));
  @@ -269,11 +275,17 @@
   void
   MutableNodeRefList::addNodesInDocOrder(const XalanNodeList&          
nodelist)
   {
  -     const unsigned int      nChildren = nodelist.getLength();
  +     const unsigned int      theLength = nodelist.getLength();
  +
  +     // Reserve the space at the start.  We may end up reserving
  +     // more space than necessary, but it's a small price to
  +     // pay for the increased speed.  We can always shrink by
  +     // swapping if we have way to much space.
  +     m_nodeList.reserve(getLength() + theLength);
   
  -     for(unsigned int i = 0; i < nChildren; i++)
  +     for(unsigned int i = 0; i < theLength; i++)
        {
  -             addNodeInDocOrder(nodelist.item(i), false);
  +             addNodeInDocOrder(nodelist.item(i), true);
        }
   }
   
  @@ -282,9 +294,15 @@
   void
   MutableNodeRefList::addNodesInDocOrder(const NodeRefListBase&        
nodelist)
   {
  -     const unsigned int      nChildren = nodelist.getLength();
  +     const unsigned int      theLength = nodelist.getLength();
   
  -     for(unsigned int i = 0; i < nChildren; i++)
  +     // Reserve the space at the start.  We may end up reserving
  +     // more space than necessary, but it's a small price to
  +     // pay for the increased speed.  We can always shrink by
  +     // swapping if we have way to much space.
  +     m_nodeList.reserve(getLength() + theLength);
  +
  +     for(unsigned int i = 0; i < theLength; i++)
        {
                addNodeInDocOrder(nodelist.item(i), true);
        }
  @@ -305,9 +323,8 @@
                {
                        addNode(node);
                }
  -             else
  +             else if (indexOf(node) == npos)
                {
  -
                        unsigned int    i = size - 1;
   
                        // When wrap-around happens, i will be > than size...
  
  
  
  1.6       +41 -0     xml-xalan/c/src/XPath/NodeRefList.cpp
  
  Index: NodeRefList.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/NodeRefList.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- NodeRefList.cpp   2000/04/11 14:46:09     1.5
  +++ NodeRefList.cpp   2000/05/29 22:22:09     1.6
  @@ -62,6 +62,10 @@
   #include <cassert>
   #include <algorithm>
   
  +#if !defined(NDEBUG)
  +#include <set>
  +#endif
  +
   
   
   NodeRefList::NodeRefList() :
  @@ -184,3 +188,40 @@
   {
        return 0;
   }
  +
  +
  +
  +#if !defined(NDEBUG)
  +bool
  +NodeRefList::checkForDuplicates() const
  +{
  +#if !defined(XALAN_NO_NAMESPACES)
  +     using std::set;
  +#endif
  +
  +     bool    fResult = false;
  +
  +     const unsigned int      theLength = getLength();
  +
  +     if (theLength > 0)
  +     {
  +             set<const XalanNode*>   theNodes;
  +
  +             for (unsigned i = 0; i < theLength && fResult == false; ++i)
  +             {
  +                     const XalanNode* const  theNode = item(i);
  +
  +                     if (theNodes.find(theNode) != theNodes.end())
  +                     {
  +                             fResult = true;
  +                     }
  +                     else
  +                     {
  +                             theNodes.insert(theNode);
  +                     }
  +             }
  +     }
  +
  +     return fResult;
  +}
  +#endif
  
  
  
  1.7       +5 -0      xml-xalan/c/src/XPath/NodeRefList.hpp
  
  Index: NodeRefList.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/NodeRefList.hpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- NodeRefList.hpp   2000/04/11 14:46:09     1.6
  +++ NodeRefList.hpp   2000/05/29 22:22:09     1.7
  @@ -121,6 +121,11 @@
        virtual XPathSupport*
        getSupport() const;
   
  +#if !defined(NDEBUG)
  +     bool
  +     checkForDuplicates() const;
  +#endif
  +
   protected:
   
   #if defined(XALAN_NO_NAMESPACES)
  
  
  

Reply via email to