dbertoni    00/08/10 11:41:47

  Modified:    c/src/XercesParserLiaison XercesAttrBridge.cpp
                        XercesAttrBridge.hpp XercesBridgeNavigator.cpp
                        XercesBridgeNavigator.hpp
                        XercesCDATASectionBridge.cpp
                        XercesCDATASectionBridge.hpp
                        XercesCommentBridge.cpp XercesCommentBridge.hpp
                        XercesDocumentBridge.cpp XercesDocumentBridge.hpp
                        XercesDocumentFragmentBridge.cpp
                        XercesDocumentFragmentBridge.hpp
                        XercesDocumentTypeBridge.cpp
                        XercesDocumentTypeBridge.hpp
                        XercesElementBridge.cpp XercesElementBridge.hpp
                        XercesEntityBridge.cpp XercesEntityBridge.hpp
                        XercesEntityReferenceBridge.cpp
                        XercesEntityReferenceBridge.hpp
                        XercesNotationBridge.cpp XercesNotationBridge.hpp
                        XercesParserLiaison.cpp
                        XercesProcessingInstructionBridge.cpp
                        XercesProcessingInstructionBridge.hpp
                        XercesTextBridge.cpp XercesTextBridge.hpp
                        XercesToXalanNodeMap.cpp XercesToXalanNodeMap.hpp
  Log:
  Added document order indexing.  By default, now build the entire structure 
and keeps pointers to navigate rather than rely on mapping nodes.  Added 
experimental block allocaters, which, by default, are not enabled.
  
  Revision  Changes    Path
  1.2       +28 -0     xml-xalan/c/src/XercesParserLiaison/XercesAttrBridge.cpp
  
  Index: XercesAttrBridge.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesAttrBridge.cpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XercesAttrBridge.cpp      2000/04/11 14:39:29     1.1
  +++ XercesAttrBridge.cpp      2000/08/10 18:41:35     1.2
  @@ -62,6 +62,10 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
   #include "XercesDOMException.hpp"
   #include "XercesDocumentBridge.hpp"
   #include "XercesElementBridge.hpp"
  @@ -317,6 +321,30 @@
        }
   }
   
  +
  +
  +
  +bool
  +XercesAttrBridge::isIndexed() const
  +{
  +     return m_navigator.getOwnerDocument()->isIndexed();
  +}
  +
  +
  +
  +unsigned long
  +XercesAttrBridge::getIndex() const
  +{
  +     return m_navigator.getIndex();
  +}
  +
  +
  +
  +XalanDOMString
  +XercesAttrBridge::getXSLTData() const
  +{
  +     return DOMServices::getNodeData(*this);
  +}
   
   
   
  
  
  
  1.3       +9 -0      xml-xalan/c/src/XercesParserLiaison/XercesAttrBridge.hpp
  
  Index: XercesAttrBridge.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesAttrBridge.hpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XercesAttrBridge.hpp      2000/04/11 21:39:14     1.2
  +++ XercesAttrBridge.hpp      2000/08/10 18:41:35     1.3
  @@ -429,6 +429,15 @@
        virtual void
        setPrefix(const XalanDOMString&         prefix);
   
  +     virtual bool
  +     isIndexed() const;
  +
  +     virtual unsigned long
  +     getIndex() const;
  +
  +     virtual XalanDOMString
  +     getXSLTData() const;
  +
        //@}
   
        // These interfaces are inherited from XalanAttr...
  
  
  
  1.3       +12 -28    
xml-xalan/c/src/XercesParserLiaison/XercesBridgeNavigator.cpp
  
  Index: XercesBridgeNavigator.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesBridgeNavigator.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XercesBridgeNavigator.cpp 2000/07/21 19:38:31     1.2
  +++ XercesBridgeNavigator.cpp 2000/08/10 18:41:36     1.3
  @@ -76,13 +76,16 @@
   
   
   
  -XercesBridgeNavigator::XercesBridgeNavigator(XercesDocumentBridge*   
theOwnerDocument) :
  +XercesBridgeNavigator::XercesBridgeNavigator(
  +                     XercesDocumentBridge*   theOwnerDocument,
  +                     bool                                    mappingMode) :
        m_ownerDocument(theOwnerDocument),
  -     m_parentNode(invalidNodeAddress),
  -     m_previousSibling(invalidNodeAddress),
  -     m_nextSibling(invalidNodeAddress),
  -     m_firstChild(invalidNodeAddress),
  -     m_lastChild(invalidNodeAddress)
  +     m_parentNode(mappingMode == true ? invalidNodeAddress : 0),
  +     m_previousSibling(mappingMode == true ? invalidNodeAddress : 0),
  +     m_nextSibling(mappingMode == true ? invalidNodeAddress : 0),
  +     m_firstChild(mappingMode == true ? invalidNodeAddress : 0),
  +     m_lastChild(mappingMode == true ? invalidNodeAddress : 0),
  +     m_index(UINT_MAX)
   {
   }
   
  @@ -94,7 +97,8 @@
        m_previousSibling(theSource.m_previousSibling),
        m_nextSibling(theSource.m_nextSibling),
        m_firstChild(theSource.m_firstChild),
  -     m_lastChild(theSource.m_lastChild)
  +     m_lastChild(theSource.m_lastChild),
  +     m_index(theSource.m_index)
   {
   }
   
  @@ -106,26 +110,6 @@
   
   
   
  -void
  -XercesBridgeNavigator::clearCachedNodes()
  -{
  -     m_parentNode = invalidNodeAddress;
  -     m_previousSibling = invalidNodeAddress;
  -     m_nextSibling = invalidNodeAddress;
  -     m_firstChild = invalidNodeAddress;
  -     m_lastChild = invalidNodeAddress;
  -}
  -
  -
  -
  -XercesDocumentBridge*
  -XercesBridgeNavigator::getOwnerDocument() const
  -{
  -     return m_ownerDocument;
  -}
  -
  -
  -
   XalanNode*
   XercesBridgeNavigator::mapNode(const DOM_Node&               theXercesNode) 
const
   {
  @@ -368,7 +352,7 @@
                DOM_Text        theNewXercesText = 
theXercesText.splitText(offset);
                assert(theXercesText.isNull() == false);
   
  -             theXalanText = 
m_ownerDocument->createBridgeNode(theNewXercesText);
  +             theXalanText = 
m_ownerDocument->createBridgeNode(theNewXercesText, 0, true);
        }
        catch(const DOM_DOMException&   theException)
        {
  
  
  
  1.4       +100 -25   
xml-xalan/c/src/XercesParserLiaison/XercesBridgeNavigator.hpp
  
  Index: XercesBridgeNavigator.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesBridgeNavigator.hpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XercesBridgeNavigator.hpp 2000/07/21 19:38:31     1.3
  +++ XercesBridgeNavigator.hpp 2000/08/10 18:41:36     1.4
  @@ -83,7 +83,9 @@
   public:
   
        explicit
  -     XercesBridgeNavigator(XercesDocumentBridge*             
theOwnerDocument);
  +     XercesBridgeNavigator(
  +                     XercesDocumentBridge*   theOwnerDocument,
  +                     bool                                    mappingMode);
   
        XercesBridgeNavigator(const XercesBridgeNavigator&      theSource);
   
  @@ -91,71 +93,145 @@
        ~XercesBridgeNavigator();
   
   
  -     void
  -     clearCachedNodes();
  -
  -     virtual XercesDocumentBridge*
  -     getOwnerDocument() const;
  +     XercesDocumentBridge*
  +     getOwnerDocument() const
  +     {
  +             return m_ownerDocument;
  +     }
   
  -     virtual XalanNode*
  +     XalanNode*
        mapNode(const DOM_Node&         theXercesNode) const;
   
  -     virtual XalanAttr*
  +     XalanAttr*
        mapNode(const DOM_Attr&         theXercesNode) const;
   
  -     virtual DOM_Node
  +     DOM_Node
        mapNode(const XalanNode*        theXalanNode) const;
   
  -     virtual DOM_Attr
  +     DOM_Attr
        mapNode(const XalanAttr*        theXercesNode) const;
  +
  +public:
  +
  +     unsigned long
  +     getIndex() const
  +     {
  +             return m_index;
  +     }
  +
  +     void
  +     setIndex(unsigned long  theIndex)
  +     {
  +             m_index = theIndex;
  +     }
   
  -     virtual XalanNode*
  +     XalanNode*
        getParentNode(const DOM_Node&   theXercesNode) const;
   
  -     virtual XalanNode*
  +     XalanNode*
  +     getParentNode() const
  +     {
  +             return m_parentNode;
  +     }
  +
  +     void
  +     setParentNode(XalanNode*        theParent)
  +     {
  +             m_parentNode = theParent;
  +     }
  +
  +     XalanNode*
        getPreviousSibling(const DOM_Node&      theXercesNode) const;
  +
  +     XalanNode*
  +     getPreviousSibling() const
  +     {
  +             return m_previousSibling;
  +     }
  +
  +     void
  +     setPreviousSibling(XalanNode*   thePreviousSibling)
  +     {
  +             m_previousSibling = thePreviousSibling;
  +     }
   
  -     virtual XalanNode*
  +     XalanNode*
        getNextSibling(const DOM_Node&  theXercesNode) const;
   
  -     virtual XalanNode*
  +     XalanNode*
  +     getNextSibling() const
  +     {
  +             return m_nextSibling;
  +     }
  +
  +     void
  +     setNextSibling(XalanNode*       theNextSibling)
  +     {
  +             m_nextSibling = theNextSibling;
  +     }
  +
  +     XalanNode*
        getFirstChild(const DOM_Node&   theXercesNode) const;
  +
  +     XalanNode*
  +     getFirstChild() const
  +     {
  +             return m_firstChild;
  +     }
  +
  +     void
  +     setFirstChild(XalanNode*        theFirstChild)
  +     {
  +             m_firstChild = theFirstChild;
  +     }
   
  -     virtual XalanNode*
  +     XalanNode*
        getLastChild(const DOM_Node&    theXercesNode) const;
   
  -     virtual XalanNode*
  +     XalanNode*
  +     getLastChild() const
  +     {
  +             return m_lastChild;
  +     }
  +
  +     void
  +     setLastChild(XalanNode* theLastChild)
  +     {
  +             m_lastChild = theLastChild;
  +     }
  +
  +     XalanNode*
        insertBefore(
                        DOM_Node&       theXercesParent,
                        XalanNode*      newChild,
                        XalanNode*      refChild) const;
   
  -     virtual XalanNode*
  +     XalanNode*
        replaceChild(
                        DOM_Node&       theXercesParent,
                        XalanNode*      newChild,
                        XalanNode*      oldChild) const;
   
  -     virtual XalanNode*
  +     XalanNode*
        removeChild(
                        DOM_Node&       theXercesParent,
                        XalanNode*      oldChild) const;
   
  -     virtual XalanNode*
  +     XalanNode*
        appendChild(
                        DOM_Node&       theXercesParent,
                        XalanNode*      newChild) const;
   
  -     virtual XalanElement*
  +     XalanElement*
        getOwnerElement(const DOM_Attr&         theXercesAttr) const;
   
  -     virtual XalanNode*
  +     XalanNode*
        cloneNode(
                        const XalanNode*        theXalanNode,
                        const DOM_Node&         theXercesNode,
                        bool                            deep) const;
   
  -     virtual XalanText*
  +     XalanText*
        splitText(
                        DOM_Text&               theXercesText,
                        unsigned int    offset) const;
  @@ -163,9 +239,6 @@
   private:
   
        // Not implemented...
  -//   XercesBridgeNavigator&
  -//   operator=(const XercesBridgeNavigator&  theRHS);
  -
        bool
        operator==(const XercesBridgeNavigator& theRHS) const;
   
  @@ -181,6 +254,8 @@
        mutable XalanNode*              m_firstChild;
   
        mutable XalanNode*              m_lastChild;
  +
  +     unsigned long                   m_index;
   };
   
   
  
  
  
  1.2       +36 -0     
xml-xalan/c/src/XercesParserLiaison/XercesCDATASectionBridge.cpp
  
  Index: XercesCDATASectionBridge.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesCDATASectionBridge.cpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XercesCDATASectionBridge.cpp      2000/04/11 14:39:29     1.1
  +++ XercesCDATASectionBridge.cpp      2000/08/10 18:41:36     1.2
  @@ -62,6 +62,10 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
   #include "XercesDOMException.hpp"
   #include "XercesDocumentBridge.hpp"
   
  @@ -323,6 +327,30 @@
   
   
   
  +bool
  +XercesCDATASectionBridge::isIndexed() const
  +{
  +     return m_navigator.getOwnerDocument()->isIndexed();
  +}
  +
  +
  +
  +unsigned long
  +XercesCDATASectionBridge::getIndex() const
  +{
  +     return m_navigator.getIndex();
  +}
  +
  +
  +
  +XalanDOMString
  +XercesCDATASectionBridge::getXSLTData() const
  +{
  +     return DOMServices::getNodeData(*this);
  +}
  +
  +
  +
   XalanDOMString
   XercesCDATASectionBridge::getData() const
   {
  @@ -427,4 +455,12 @@
   XercesCDATASectionBridge::splitText(unsigned int     offset)
   {
        return m_navigator.splitText(m_xercesNode, offset);
  +}
  +
  +
  +
  +bool
  +XercesCDATASectionBridge::isIgnorableWhitespace() const
  +{
  +     return isWhiteSpace(m_xercesNode.getData());
   }
  
  
  
  1.2       +13 -0     
xml-xalan/c/src/XercesParserLiaison/XercesCDATASectionBridge.hpp
  
  Index: XercesCDATASectionBridge.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesCDATASectionBridge.hpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XercesCDATASectionBridge.hpp      2000/04/11 14:39:29     1.1
  +++ XercesCDATASectionBridge.hpp      2000/08/10 18:41:36     1.2
  @@ -426,6 +426,15 @@
        virtual void
        setPrefix(const XalanDOMString&         prefix);
   
  +     virtual bool
  +     isIndexed() const;
  +
  +     virtual unsigned long
  +     getIndex() const;
  +
  +     virtual XalanDOMString
  +     getXSLTData() const;
  +
        //@}
   
        // These interfaces are inherited from XalanCDATASection...
  @@ -583,6 +592,10 @@
        splitText(unsigned int  offset);
   
       //@}
  +
  +     virtual bool
  +     isIgnorableWhitespace() const;
  +
   private:
   
        // Not implemented...
  
  
  
  1.2       +28 -0     
xml-xalan/c/src/XercesParserLiaison/XercesCommentBridge.cpp
  
  Index: XercesCommentBridge.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesCommentBridge.cpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XercesCommentBridge.cpp   2000/04/11 14:39:29     1.1
  +++ XercesCommentBridge.cpp   2000/08/10 18:41:36     1.2
  @@ -58,6 +58,10 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
   #include "XercesDOMException.hpp"
   #include "XercesDocumentBridge.hpp"
   
  @@ -313,6 +317,30 @@
        {
                throw XercesDOMException(theException);
        }
  +}
  +
  +
  +
  +bool
  +XercesCommentBridge::isIndexed() const
  +{
  +     return m_navigator.getOwnerDocument()->isIndexed();
  +}
  +
  +
  +
  +unsigned long
  +XercesCommentBridge::getIndex() const
  +{
  +     return m_navigator.getIndex();
  +}
  +
  +
  +
  +XalanDOMString
  +XercesCommentBridge::getXSLTData() const
  +{
  +     return DOMServices::getNodeData(*this);
   }
   
   
  
  
  
  1.2       +9 -0      
xml-xalan/c/src/XercesParserLiaison/XercesCommentBridge.hpp
  
  Index: XercesCommentBridge.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesCommentBridge.hpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XercesCommentBridge.hpp   2000/04/11 14:39:29     1.1
  +++ XercesCommentBridge.hpp   2000/08/10 18:41:36     1.2
  @@ -425,6 +425,15 @@
        virtual void
        setPrefix(const XalanDOMString& prefix);
   
  +     virtual bool
  +     isIndexed() const;
  +
  +     virtual unsigned long
  +     getIndex() const;
  +
  +     virtual XalanDOMString
  +     getXSLTData() const;
  +
        //@}
   
        // These interfaces are inherited from XalanCDATASection...
  
  
  
  1.10      +737 -278  
xml-xalan/c/src/XercesParserLiaison/XercesDocumentBridge.cpp
  
  Index: XercesDocumentBridge.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesDocumentBridge.cpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- XercesDocumentBridge.cpp  2000/07/21 19:38:31     1.9
  +++ XercesDocumentBridge.cpp  2000/08/10 18:41:36     1.10
  @@ -72,12 +72,15 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
   #include <XalanDOM/XalanDocumentType.hpp>
   #include <XalanDOM/XalanElement.hpp>
   
   
   
  -#include "NullTreeWalker.hpp"
   #include "XercesAttrBridge.hpp"
   #include "XercesCommentBridge.hpp"
   #include "XercesCDATASectionBridge.hpp"
  @@ -93,6 +96,7 @@
   #include "XercesNotationBridge.hpp"
   #include "XercesProcessingInstructionBridge.hpp"
   #include "XercesTextBridge.hpp"
  +#include "XercesTreeWalker.hpp"
   
   
   
  @@ -101,32 +105,42 @@
                        bool                                    buildBridge) :
        XalanDocument(),
        m_xercesDocument(theXercesDocument),
  -     m_navigator(this),
  +     m_documentElement(0),
        m_children(theXercesDocument.getChildNodes(),
                           m_navigator),
        m_cachedNodeLists(theXercesDocument,
                                          m_navigator),
        m_nodeMap(),
        m_domImplementation(new 
XercesDOMImplementationBridge(theXercesDocument.getImplementation())),
  -     m_navigators(),
  +     m_navigators(1, XercesBridgeNavigator(this, !buildBridge)),
  +     m_navigator(m_navigators.front()),
        m_nodes(),
  -     m_doctype(0)
  +     m_doctype(0),
  +     m_mappingMode(!buildBridge),
  +     m_indexValid(false)
  +#if defined(XALAN_USE_BLOCK_ALLOCATORS)
  +     , m_elementAllocator(25),
  +     m_textAllocator(25),
  +     m_attributeAllocator(25)
  +#endif
   {
   #if !defined(XALAN_NO_NAMESPACES)
        using std::make_pair;
   #endif
   
  -     // Put ourself into the node map, and don't assign an index...
  -     m_nodeMap.addAssociation(m_xercesDocument, this, false);
  -
  -     m_doctype = buildDocumentTypeBridge();
  -
  -     if (buildBridge == true)
  +     if (m_mappingMode == false)
        {
  +             // The document index is always 1...
  +             m_navigator.setIndex(1);
  +
                // OK, let's build the nodes.  This makes things
                // thread-safe, so the document can be shared...
                buildBridgeNodes();
        }
  +     else
  +     {
  +             m_nodeMap.addAssociation(m_xercesDocument, this);
  +     }
   }
   
   
  @@ -165,11 +179,11 @@
                        {
                                throw 
XalanDOMException(XalanDOMException::WRONG_DOCUMENT_ERR);
                        }
  -                     else
  +                     else if (m_mappingMode == true)
                        {
                                // OK, we haven't yet created a bridge not, so 
go ahead and
                                // create one.
  -                             theXalanNode = createBridgeNode(theHack);
  +                             theXalanNode = createBridgeNode(theHack, 0, 
true);
                                assert(theXalanNode != 0);
                        }
                }
  @@ -234,7 +248,11 @@
   XalanAttr*
   XercesDocumentBridge::mapNode(const DOM_Attr&        theXercesNode) const
   {
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +     return 
(XercesAttrBridge*)mapNode(XercesDOM_NodeHack::getImpl(theXercesNode));
  +#else
        return 
static_cast<XercesAttrBridge*>(mapNode(XercesDOM_NodeHack::getImpl(theXercesNode)));
  +#endif
   }
   
   
  @@ -242,36 +260,11 @@
   XalanElement*
   XercesDocumentBridge::mapNode(const DOM_Element&     theXercesNode) const
   {
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +     return 
(XercesElementBridge*)mapNode(XercesDOM_NodeHack::getImpl(theXercesNode));
  +#else
        return 
static_cast<XercesElementBridge*>(mapNode(XercesDOM_NodeHack::getImpl(theXercesNode)));
  -}
  -
  -
  -
  -class ClearCacheFunctor
  -{
  -public:
  -
  -     void
  -     operator()(XercesBridgeNavigator&       theNavigator)
  -     {
  -             theNavigator.clearCachedNodes();
  -     }
  -};
  -
  -
  -
  -void
  -XercesDocumentBridge::clearCachedNodes()
  -{
  -#if !defined(XALAN_NO_NAMESPACES)
  -     using std::for_each;
   #endif
  -     // m_bridgeMap contains all of the nodes that
  -     // are still alive...
  -     for_each(m_navigators.begin(),
  -                      m_navigators.end(),
  -                      ClearCacheFunctor());
  -
   }
   
   
  @@ -282,6 +275,7 @@
   #if !defined(XALAN_NO_NAMESPACES)
        using std::for_each;
   #endif
  +
        // Set this to null, since it will be deleted
        // by the next for_each...
        m_doctype = 0;
  @@ -292,12 +286,18 @@
                         m_nodes.end(),
                         DeleteFunctor<XalanNode>());
   
  -     // Clear everything out...
  +     // Clear everything out, since we just delete everything...
        m_nodes.clear();
   
  -     m_navigators.clear();
  +     // Clear out all of the navigators, except ours...
  +     m_navigators.erase(m_navigators.begin() + 1, m_navigators.end());
   
  +     // Clear the node map...
        m_nodeMap.clear();
  +
  +     m_indexValid = false;
  +
  +     m_mappingMode = true;
   }
   
   
  @@ -307,53 +307,88 @@
   {
        destroyBridge();
   
  -     // Create the doctype...
  -     m_doctype = buildDocumentTypeBridge();
  -
        buildBridgeNodes();
   }
   
   
   
  -void
  -XercesDocumentBridge::buildBridgeNodes()
  +XercesBridgeNavigator&
  +XercesDocumentBridge::pushNavigator(bool     mappingMode) const
   {
  -     // First, build any children of the document...
  -     const XalanNode*        theChild = getFirstChild();
  +     XercesDocumentBridge* const             This =
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +             (XercesDocumentBridge*)this;
  +#else
  +             const_cast<XercesDocumentBridge*>(this);
  +#endif
   
  -     while(theChild != 0)
  -     {
  -             // Note that just accessing the sibling is
  -             // enough to build the bridge nodes...
  -             theChild = theChild->getNextSibling();
  -     }
  +     This->m_navigators.push_back(XercesBridgeNavigator(This, mappingMode));
   
  -     // OK, now walk everything below the document
  -     // element...
  -     const XalanNode* const  theDocumentElement =
  -                     getDocumentElement();
  +     return This->m_navigators.back();
  +}
   
  -     if (theDocumentElement != 0)
  -     {
  -             NullTreeWalker  theTreeWalker(true);
  +
  +
  +XercesDocumentTypeBridge*
  +XercesDocumentBridge::createBridgeNode(
  +                     const DOM_DocumentType&         theDoctype,
  +                     unsigned long                           theIndex,
  +                     bool                                            
mapNode) const
  +{
  +     // This is a special case, since there is only one
  +     // doctype node allowed...
  +     assert(m_doctype == 0);
  +     assert(m_xercesDocument.getDoctype().isNull() == false &&
  +                m_xercesDocument.getDoctype() == theDoctype);
  +
  +     // Create a navigator...
  +     XercesBridgeNavigator&  theNavigator = pushNavigator(mapNode);
  +
  +     theNavigator.setIndex(theIndex);
  +
  +     // Update the member variable for the new instance.
  +     m_doctype = new XercesDocumentTypeBridge(theDoctype, theNavigator);;
   
  -             theTreeWalker.traverse(theDocumentElement, this);
  +     if (mapNode == true)
  +     {
  +             m_nodeMap.addAssociation(theDoctype, m_doctype);
        }
  +
  +     m_nodes.push_back(m_doctype);
  +
  +     return m_doctype;
   }
   
   
   
   XercesElementBridge*
  -XercesDocumentBridge::createBridgeNode(const DOM_Element&    theXercesNode) 
const
  +XercesDocumentBridge::createBridgeNode(
  +                     const DOM_Element&      theXercesNode,
  +                     unsigned long           theIndex,
  +                     bool                            mapNode) const
   {
  +     // Create a navigator...
  +     XercesBridgeNavigator&  theNavigator = pushNavigator(mapNode);
  +
  +     theNavigator.setIndex(theIndex);
  +
        XercesElementBridge* const      theBridge =
  +#if defined(XALAN_USE_BLOCK_ALLOCATORS)
  +             m_elementAllocator.create(theXercesNode,
  +                                                             theNavigator);
  +#else
                new XercesElementBridge(theXercesNode,
  -                                                             
pushNavigator());
  +                                                             theNavigator);
   
  -     m_nodes.insert(theBridge);
  +     m_nodes.push_back(theBridge);
  +#endif
   
  -     // Add it to the node map...
  -     m_nodeMap.addAssociation(theXercesNode, theBridge, false);
  +     if (m_doctype != 0 || mapNode == true)
  +     {
  +             // Add it to the node map, since we my need it for getting
  +             // elements by ID, or we're in mapping mode.
  +             m_nodeMap.addAssociation(theXercesNode, theBridge);
  +     }
   
        return theBridge;
   }
  @@ -361,16 +396,27 @@
   
   
   XercesDocumentFragmentBridge*
  -XercesDocumentBridge::createBridgeNode(const DOM_DocumentFragment&   
theXercesNode) const
  +XercesDocumentBridge::createBridgeNode(
  +                     const DOM_DocumentFragment&             theXercesNode,
  +                     unsigned long                                   
theIndex,
  +                     bool                                                    
mapNode) const
   {
  +     // Create a navigator...
  +     XercesBridgeNavigator&  theNavigator = pushNavigator(mapNode);
  +
  +     theNavigator.setIndex(theIndex);
  +
        XercesDocumentFragmentBridge* const             theBridge =
                new XercesDocumentFragmentBridge(theXercesNode,
  -                                                                             
 pushNavigator());
  +                                                                             
 theNavigator);
   
  -     m_nodes.insert(theBridge);
  +     m_nodes.push_back(theBridge);
   
  -     // Add it to the node map...
  -     m_nodeMap.addAssociation(theXercesNode, theBridge, false);
  +     if (mapNode == true)
  +     {
  +             // Add it to the node map...
  +             m_nodeMap.addAssociation(theXercesNode, theBridge);
  +     }
   
        return theBridge;
   }
  @@ -378,16 +424,32 @@
   
   
   XercesTextBridge*
  -XercesDocumentBridge::createBridgeNode(const DOM_Text&       theXercesNode) 
const
  +XercesDocumentBridge::createBridgeNode(
  +                     const DOM_Text&         theXercesNode,
  +                     unsigned long           theIndex,
  +                     bool                            mapNode) const
   {
  +     // Create a navigator...
  +     XercesBridgeNavigator&  theNavigator = pushNavigator(mapNode);
  +
  +     theNavigator.setIndex(theIndex);
  +
        XercesTextBridge* const         theBridge =
  +#if defined(XALAN_USE_BLOCK_ALLOCATORS)
  +             m_textAllocator.create(theXercesNode,
  +                                                        theNavigator);
  +#else
                new XercesTextBridge(theXercesNode,
  -                                                      pushNavigator());
  +                                                      theNavigator);
   
  -     m_nodes.insert(theBridge);
  +     m_nodes.push_back(theBridge);
  +#endif
   
  -     // Add it to the node map...
  -     m_nodeMap.addAssociation(theXercesNode, theBridge, false);
  +     if (mapNode == true)
  +     {
  +             // Add it to the node map...
  +             m_nodeMap.addAssociation(theXercesNode, theBridge);
  +     }
   
        return theBridge;
   }
  @@ -395,16 +457,27 @@
   
   
   XercesCommentBridge*
  -XercesDocumentBridge::createBridgeNode(const DOM_Comment&    theXercesNode) 
const
  +XercesDocumentBridge::createBridgeNode(
  +                     const DOM_Comment&      theXercesNode,
  +                     unsigned long           theIndex,
  +                     bool                            mapNode) const
   {
  +     // Create a navigator...
  +     XercesBridgeNavigator&  theNavigator = pushNavigator(mapNode);
  +
  +     theNavigator.setIndex(theIndex);
  +
        XercesCommentBridge* const      theBridge =
                new XercesCommentBridge(theXercesNode,
  -                                                             
pushNavigator());
  +                                                             theNavigator);
   
  -     m_nodes.insert(theBridge);
  +     m_nodes.push_back(theBridge);
   
  -     // Add it to the node map...
  -     m_nodeMap.addAssociation(theXercesNode, theBridge, false);
  +     if (mapNode == true)
  +     {
  +             // Add it to the node map...
  +             m_nodeMap.addAssociation(theXercesNode, theBridge);
  +     }
   
        return theBridge;
   }
  @@ -412,16 +485,27 @@
   
   
   XercesCDATASectionBridge*
  -XercesDocumentBridge::createBridgeNode(const DOM_CDATASection&       
theXercesNode) const
  +XercesDocumentBridge::createBridgeNode(
  +                     const DOM_CDATASection&         theXercesNode,
  +                     unsigned long                           theIndex,
  +                     bool                                            
mapNode) const
   {
  +     // Create a navigator...
  +     XercesBridgeNavigator&  theNavigator = pushNavigator(mapNode);
  +
  +     theNavigator.setIndex(theIndex);
  +
        XercesCDATASectionBridge* const         theBridge =
                new XercesCDATASectionBridge(theXercesNode,
  -                                                                      
pushNavigator());
  +                                                                      
theNavigator);
   
  -     m_nodes.insert(theBridge);
  +     m_nodes.push_back(theBridge);
   
  -     // Add it to the node map...
  -     m_nodeMap.addAssociation(theXercesNode, theBridge, false);
  +     if (mapNode == true)
  +     {
  +             // Add it to the node map...
  +             m_nodeMap.addAssociation(theXercesNode, theBridge);
  +     }
   
        return theBridge;
   }
  @@ -429,16 +513,27 @@
   
   
   XercesProcessingInstructionBridge*
  -XercesDocumentBridge::createBridgeNode(const DOM_ProcessingInstruction&      
        theXercesNode) const
  +XercesDocumentBridge::createBridgeNode(
  +                     const DOM_ProcessingInstruction&        theXercesNode,
  +                     unsigned long                                           
theIndex,
  +                     bool                                                    
        mapNode) const
   {
  +     // Create a navigator...
  +     XercesBridgeNavigator&  theNavigator = pushNavigator(mapNode);
  +
  +     theNavigator.setIndex(theIndex);
  +
        XercesProcessingInstructionBridge* const        theBridge =
                new XercesProcessingInstructionBridge(theXercesNode,
  -                                                                             
          pushNavigator());
  +                                                                             
          theNavigator);
   
  -     m_nodes.insert(theBridge);
  +     m_nodes.push_back(theBridge);
   
  -     // Add it to the node map...
  -     m_nodeMap.addAssociation(theXercesNode, theBridge, false);
  +     if (mapNode == true)
  +     {
  +             // Add it to the node map...
  +             m_nodeMap.addAssociation(theXercesNode, theBridge);
  +     }
   
        return theBridge;
   }
  @@ -446,16 +541,30 @@
   
   
   XercesAttrBridge*
  -XercesDocumentBridge::createBridgeNode(const DOM_Attr&       theXercesNode) 
const
  +XercesDocumentBridge::createBridgeNode(
  +                     const DOM_Attr&         theXercesNode,
  +                     unsigned long           theIndex,
  +                     bool                            mapNode) const
   {
  +     // Create a navigator...
  +     XercesBridgeNavigator&  theNavigator = pushNavigator(mapNode);
  +
  +     theNavigator.setIndex(theIndex);
  +
        XercesAttrBridge* const         theBridge =
  +#if defined(XALAN_USE_BLOCK_ALLOCATORS)
  +             m_attributeAllocator.create(theXercesNode,
  +                                                                     
theNavigator);
  +#else
                new XercesAttrBridge(theXercesNode,
  -                                                      pushNavigator());
  +                                                      theNavigator);
   
  -     m_nodes.insert(theBridge);
  +     m_nodes.push_back(theBridge);
  +#endif
   
  -     // Add it to the node map...
  -     m_nodeMap.addAssociation(theXercesNode, theBridge, false);
  +     // Add it to the node map -- attributes ALWAYS go in the map
  +     // for now...
  +     m_nodeMap.addAssociation(theXercesNode, theBridge);
   
        return theBridge;
   }
  @@ -463,16 +572,25 @@
   
   
   XercesEntityBridge*
  -XercesDocumentBridge::createBridgeNode(const DOM_Entity&     theXercesNode) 
const
  +XercesDocumentBridge::createBridgeNode(
  +                     const DOM_Entity&       theXercesNode,
  +                     unsigned long           theIndex,
  +                     bool                            mapNode) const
   {
  +     // Create a navigator...
  +     XercesBridgeNavigator&  theNavigator = pushNavigator(mapNode);
  +
  +     theNavigator.setIndex(theIndex);
  +
        XercesEntityBridge* const       theBridge =
                new XercesEntityBridge(theXercesNode,
  -                                                        pushNavigator());
  +                                                        theNavigator);
   
  -     m_nodes.insert(theBridge);
  +     m_nodes.push_back(theBridge);
   
  -     // Add it to the node map...
  -     m_nodeMap.addAssociation(theXercesNode, theBridge, false);
  +     // Add it to the node map -- entities ALWAYS go in the map
  +     // for now...
  +     m_nodeMap.addAssociation(theXercesNode, theBridge);
   
        return theBridge;
   }
  @@ -480,16 +598,27 @@
   
   
   XercesEntityReferenceBridge*
  -XercesDocumentBridge::createBridgeNode(const DOM_EntityReference&    
theXercesNode) const
  +XercesDocumentBridge::createBridgeNode(
  +                     const DOM_EntityReference&      theXercesNode,
  +                     unsigned long                           theIndex,
  +                     bool                                            
mapNode) const
   {
  +     // Create a navigator...
  +     XercesBridgeNavigator&  theNavigator = pushNavigator(mapNode);
  +
  +     theNavigator.setIndex(theIndex);
  +
        XercesEntityReferenceBridge* const      theBridge =
                new XercesEntityReferenceBridge(theXercesNode,
  -                                                                             
pushNavigator());
  +                                                                             
theNavigator);
   
  -     m_nodes.insert(theBridge);
  +     m_nodes.push_back(theBridge);
   
  -     // Add it to the node map...
  -     m_nodeMap.addAssociation(theXercesNode, theBridge, false);
  +     if (mapNode == true)
  +     {
  +             // Add it to the node map...
  +             m_nodeMap.addAssociation(theXercesNode, theBridge);
  +     }
   
        return theBridge;
   }
  @@ -497,27 +626,217 @@
   
   
   XercesNotationBridge*
  -XercesDocumentBridge::createBridgeNode(const DOM_Notation&   theXercesNode) 
const
  +XercesDocumentBridge::createBridgeNode(
  +                     const DOM_Notation&             theXercesNode,
  +                     unsigned long                   theIndex,
  +                     bool                                    mapNode) const
   {
  +     // Create a navigator...
  +     XercesBridgeNavigator&  theNavigator = pushNavigator(mapNode);
  +
  +     theNavigator.setIndex(theIndex);
  +
        XercesNotationBridge* const             theBridge =
                new XercesNotationBridge(theXercesNode,
  -                                                              
pushNavigator());
  +                                                              theNavigator);
   
  -     m_nodes.insert(theBridge);
  +     m_nodes.push_back(theBridge);
   
  -     // Add it to the node map...
  -     m_nodeMap.addAssociation(theXercesNode, theBridge, false);
  +     // Add it to the node map -- notations ALWAYS go in the map
  +     // for now...
  +     m_nodeMap.addAssociation(theXercesNode, theBridge);
   
        return theBridge;
   }
   
   
   
  +XalanNode*
  +XercesDocumentBridge::createBridgeNode(
  +                     const DOM_Node&         theXercesNode,
  +                     unsigned long           theIndex,
  +                     bool                            mapNode) const
  +{
  +     XalanNode*                              theNewNode = 0;
  +
  +     switch(theXercesNode.getNodeType())
  +     {
  +     case DOM_Node::ATTRIBUTE_NODE:
  +             {
  +                     const DOM_Attr&         theAttrNode =
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +                                             (const DOM_Attr&)theXercesNode;
  +#else
  +                                             static_cast<const 
DOM_Attr&>(theXercesNode);
  +#endif
  +
  +                     theNewNode = createBridgeNode(theAttrNode, theIndex, 
mapNode);
  +                     assert(theNewNode != 0);
  +             }
  +             break;
  +
  +     case DOM_Node::CDATA_SECTION_NODE:
  +             {
  +                     const DOM_CDATASection&         theCDATASectionNode =
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +                                             (const 
DOM_CDATASection&)theXercesNode;
  +#else
  +                                             static_cast<const 
DOM_CDATASection&>(theXercesNode);
  +#endif
  +
  +                     theNewNode = createBridgeNode(theCDATASectionNode, 
theIndex, mapNode);
  +                     assert(theNewNode != 0);
  +
  +             }
  +             break;
  +
  +     case DOM_Node::COMMENT_NODE:
  +             {
  +                     const DOM_Comment&      theCommentNode =
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +                                             (const 
DOM_Comment&)theXercesNode;
  +#else
  +                                             static_cast<const 
DOM_Comment&>(theXercesNode);
  +#endif
  +
  +                     theNewNode = createBridgeNode(theCommentNode, theIndex, 
mapNode);
  +                     assert(theNewNode != 0);
  +             }
  +             break;
  +
  +     case DOM_Node::DOCUMENT_FRAGMENT_NODE:
  +             {
  +                     const DOM_DocumentFragment&             
theDocumentFragmentNode =
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +                                             (const 
DOM_DocumentFragment&)theXercesNode;
  +#else
  +                                             static_cast<const 
DOM_DocumentFragment&>(theXercesNode);
  +#endif
  +
  +                     theNewNode = createBridgeNode(theDocumentFragmentNode, 
theIndex, mapNode);
  +                     assert(theNewNode != 0);
  +
  +             }
  +             break;
  +
  +     case DOM_Node::ELEMENT_NODE:
  +             {
  +                     const DOM_Element&      theElementNode =
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +                                             (const 
DOM_Element&)theXercesNode;
  +#else
  +                                             static_cast<const 
DOM_Element&>(theXercesNode);
  +#endif
  +
  +                     theNewNode = createBridgeNode(theElementNode, theIndex, 
mapNode);
  +                     assert(theNewNode != 0);
  +             }
  +             break;
  +
  +     case DOM_Node::ENTITY_NODE:
  +             {
  +                     const DOM_Entity&       theEntityNode =
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +                                             (const 
DOM_Entity&)theXercesNode;
  +#else
  +                                             static_cast<const 
DOM_Entity&>(theXercesNode);
  +#endif
  +
  +                     theNewNode = createBridgeNode(theEntityNode, theIndex, 
mapNode);
  +                     assert(theNewNode != 0);
  +             }
  +             break;
  +
  +     case DOM_Node::ENTITY_REFERENCE_NODE:
  +             {
  +                     const DOM_EntityReference&      theEntityReferenceNode =
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +                                             (const 
DOM_EntityReference&)theXercesNode;
  +#else
  +                                             static_cast<const 
DOM_EntityReference&>(theXercesNode);
  +#endif
  +
  +                     theNewNode = createBridgeNode(theEntityReferenceNode, 
theIndex, mapNode);
  +                     assert(theNewNode != 0);
  +             }
  +             break;
  +
  +     case DOM_Node::NOTATION_NODE:
  +             {
  +                     const DOM_Notation&             theNotationNode =
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +                                             (const 
DOM_Notation&)theXercesNode;
  +#else
  +                                             static_cast<const 
DOM_Notation&>(theXercesNode);
  +#endif
  +
  +                     theNewNode = createBridgeNode(theNotationNode, 
theIndex, mapNode);
  +                     assert(theNewNode != 0);
  +             }
  +             break;
  +
  +     case DOM_Node::PROCESSING_INSTRUCTION_NODE:
  +             {
  +                     const DOM_ProcessingInstruction&        thePINode =
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +                                             (const 
DOM_ProcessingInstruction&)theXercesNode;
  +#else
  +                                             static_cast<const 
DOM_ProcessingInstruction&>(theXercesNode);
  +#endif
  +
  +                     theNewNode = createBridgeNode(thePINode, theIndex, 
mapNode);
  +                     assert(theNewNode != 0);
  +             }
  +             break;
  +
  +     case DOM_Node::TEXT_NODE:
  +             {
  +                     const DOM_Text&         theTextNode =
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +                                             (const DOM_Text&)theXercesNode;
  +#else
  +                                             static_cast<const 
DOM_Text&>(theXercesNode);
  +#endif
  +
  +                     theNewNode = createBridgeNode(theTextNode, theIndex, 
mapNode);
  +                     assert(theNewNode != 0);
  +             }
  +             break;
  +
  +     case DOM_Node::DOCUMENT_TYPE_NODE:
  +             {
  +                     const DOM_DocumentType&         theDoctypeNode =
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +                                             (const 
DOM_DocumentType&)theXercesNode;
  +#else
  +                                             static_cast<const 
DOM_DocumentType&>(theXercesNode);
  +#endif
  +
  +                     theNewNode = createBridgeNode(theDoctypeNode, theIndex, 
mapNode);
  +
  +                     assert(theNewNode != 0);
  +             }
  +             break;
  +
  +     default:
  +             assert(false);
  +             break;
  +     }
  +
  +     return theNewNode;
  +}
  +
  +
  +
   void
   XercesDocumentBridge::destroyNode(XalanNode* theNode)
   {
  -     const NodeSetType::iterator     i =
  -             m_nodes.find(theNode);
  +#if !defined(XALAN_NO_NAMESPACES)
  +     using std::find;
  +#endif
  +
  +     const NodeVectorType::iterator  i =
  +             find(m_nodes.begin(), m_nodes.end(), theNode);
   
        if (i == m_nodes.end())
        {
  @@ -554,7 +873,7 @@
                const DOM_Node  theNewXercesNode = 
                        theXercesNode.cloneNode(deep);
   
  -             theNewNode = createBridgeNode(theNewXercesNode);
  +             theNewNode = createBridgeNode(theNewXercesNode, 0, true);
        }
        catch(const DOM_DOMException&   theException)
        {
  @@ -566,35 +885,6 @@
   
   
   
  -XercesDocumentTypeBridge*
  -XercesDocumentBridge::buildDocumentTypeBridge() const
  -{
  -     XercesDocumentTypeBridge*       theResult = 0;
  -
  -     // Try to build the doctype...
  -     DOM_DocumentType        theDoctype = m_xercesDocument.getDoctype();
  -
  -     if (theDoctype.isNull() == false)
  -     {
  -             theResult = new XercesDocumentTypeBridge(theDoctype, 
pushNavigator());
  -#if defined(XALAN_NO_MUTABLE)
  -             // Add it to the node map...
  -             
((XercesDocumentBridge*)this)->m_nodeMap.addAssociation(theDoctype, theResult, 
false);
  -
  -             ((XercesDocumentBridge*)this)->m_nodes.insert(theResult);
  -#else
  -             // Add it to the node map...
  -             m_nodeMap.addAssociation(theDoctype, theResult, false);
  -
  -             m_nodes.insert(theResult);
  -#endif
  -     }
  -
  -     return theResult;
  -}
  -
  -
  -
   // The rest of these are the standard DOM interfaces...
   
   XalanDOMString
  @@ -699,7 +989,11 @@
                const DOM_Node  theNewDocument = 
m_xercesDocument.cloneNode(deep);
   
                theBridge =
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +                     new XercesDocumentBridge((const 
DOM_Document&)theNewDocument);
  +#else
                        new XercesDocumentBridge(static_cast<const 
DOM_Document&>(theNewDocument));
  +#endif
        }
        catch(const DOM_DOMException&   theException)
        {
  @@ -833,6 +1127,32 @@
   
   
   
  +bool
  +XercesDocumentBridge::isIndexed() const
  +{
  +     return m_indexValid;
  +}
  +
  +
  +
  +unsigned long
  +XercesDocumentBridge::getIndex() const
  +{
  +     assert(m_navigator.getIndex() == 1);
  +
  +     return m_navigator.getIndex();
  +}
  +
  +
  +
  +XalanDOMString
  +XercesDocumentBridge::getXSLTData() const
  +{
  +     return DOMServices::getNodeData(*this);
  +}
  +
  +
  +
   XalanElement*
   XercesDocumentBridge::createElement(const XalanDOMString&    tagName)
   {
  @@ -844,7 +1164,7 @@
                        m_xercesDocument.createElement(tagName);
                assert(theXercesNode.isNull() == false);
   
  -             theBridgeNode = createBridgeNode(theXercesNode);
  +             theBridgeNode = createBridgeNode(theXercesNode, 0, true);
                assert(mapNode(theXercesNode) == theBridgeNode);
        }
        catch(const DOM_DOMException&   theException)
  @@ -868,7 +1188,7 @@
                        m_xercesDocument.createDocumentFragment();
                assert(theXercesNode.isNull() == false);
   
  -             theBridgeNode = createBridgeNode(theXercesNode);
  +             theBridgeNode = createBridgeNode(theXercesNode, 0, true);
                assert(mapNode(theXercesNode) == theBridgeNode);
        }
        catch(const DOM_DOMException&   theException)
  @@ -892,7 +1212,7 @@
                        m_xercesDocument.createTextNode(data);
                assert(theXercesNode.isNull() == false);
   
  -             theBridgeNode = createBridgeNode(theXercesNode);
  +             theBridgeNode = createBridgeNode(theXercesNode, 0, true);
                assert(mapNode(theXercesNode) == theBridgeNode);
        }
        catch(const DOM_DOMException&   theException)
  @@ -916,7 +1236,7 @@
                        m_xercesDocument.createComment(data);
                assert(theXercesNode.isNull() == false);
   
  -             theBridgeNode = createBridgeNode(theXercesNode);
  +             theBridgeNode = createBridgeNode(theXercesNode, 0, true);
                assert(mapNode(theXercesNode) == theBridgeNode);
        }
        catch(const DOM_DOMException&   theException)
  @@ -940,7 +1260,7 @@
                        m_xercesDocument.createCDATASection(data);
                assert(theXercesNode.isNull() == false);
   
  -             theBridgeNode = createBridgeNode(theXercesNode);
  +             theBridgeNode = createBridgeNode(theXercesNode, 0, true);
                assert(mapNode(theXercesNode) == theBridgeNode);
        }
        catch(const DOM_DOMException&   theException)
  @@ -966,7 +1286,7 @@
                        m_xercesDocument.createProcessingInstruction(target, 
data);
                assert(theXercesNode.isNull() == false);
   
  -             theBridgeNode = createBridgeNode(theXercesNode);
  +             theBridgeNode = createBridgeNode(theXercesNode, 0, true);
                assert(mapNode(theXercesNode) == theBridgeNode);
        }
        catch(const DOM_DOMException&   theException)
  @@ -990,7 +1310,7 @@
                        m_xercesDocument.createAttribute(name);
                assert(theXercesNode.isNull() == false);
   
  -             theBridgeNode = createBridgeNode(theXercesNode);
  +             theBridgeNode = createBridgeNode(theXercesNode, 0, true);
                assert(mapNode(theXercesNode) == theBridgeNode);
        }
        catch(const DOM_DOMException&   theException)
  @@ -1014,7 +1334,7 @@
                        m_xercesDocument.createEntityReference(name);
                assert(theXercesNode.isNull() == false);
   
  -             theBridgeNode = createBridgeNode(theXercesNode);
  +             theBridgeNode = createBridgeNode(theXercesNode, 0, true);
                assert(mapNode(theXercesNode) == theBridgeNode);
        }
        catch(const DOM_DOMException&   theException)
  @@ -1030,31 +1350,6 @@
   XalanDocumentType*
   XercesDocumentBridge::getDoctype() const
   {
  -     if (m_doctype == 0)
  -     {
  -             // Try to build the doctype...
  -             DOM_DocumentType        theDoctype = 
m_xercesDocument.getDoctype();
  -
  -             if (theDoctype.isNull() == false)
  -             {
  -#if defined(XALAN_NO_MUTABLE)
  -                     ((XercesDocumentBridge*)this)->m_doctype = new 
XercesDocumentTypeBridge(theDoctype, pushNavigator());
  -
  -                     // Add it to the node map...
  -                     
((XercesDocumentBridge*)this)->m_nodeMap.addAssociation(theDoctype, m_doctype, 
false);
  -
  -                     
((XercesDocumentBridge*)this)->m_nodes.insert(m_doctype);
  -#else
  -                     m_doctype = new XercesDocumentTypeBridge(theDoctype, 
pushNavigator());
  -
  -                     // Add it to the node map...
  -                     m_nodeMap.addAssociation(theDoctype, m_doctype, false);
  -
  -                     m_nodes.insert(m_doctype);
  -#endif
  -             }
  -     }
  -
        return m_doctype;
   }
   
  @@ -1072,7 +1367,9 @@
   XalanElement*
   XercesDocumentBridge::getDocumentElement() const
   {
  -     return mapNode(m_xercesDocument.getDocumentElement());
  +     // If we're working in mapping mode, m_documentElement will
  +     // be null, so we'll have to map the node...
  +     return m_documentElement != 0 ? m_documentElement : 
mapNode(m_xercesDocument.getDocumentElement());
   }
   
   
  @@ -1114,7 +1411,7 @@
                        m_xercesDocument.createElementNS(namespaceURI, 
qualifiedName);
                assert(theXercesNode.isNull() == false);
   
  -             theBridgeNode = createBridgeNode(theXercesNode);
  +             theBridgeNode = createBridgeNode(theXercesNode, 0, true);
                assert(mapNode(theXercesNode) == theBridgeNode);
        }
        catch(const DOM_DOMException&   theException)
  @@ -1140,7 +1437,7 @@
                        m_xercesDocument.createAttributeNS(namespaceURI, 
qualifiedName);
                assert(theXercesNode.isNull() == false);
   
  -             theBridgeNode = createBridgeNode(theXercesNode);
  +             theBridgeNode = createBridgeNode(theXercesNode, 0, true);
                assert(mapNode(theXercesNode) == theBridgeNode);
        }
        catch(const DOM_DOMException&   theException)
  @@ -1174,143 +1471,305 @@
        const DOM_Node  
theXercesNode(m_xercesDocument.getElementById(elementId));
   #endif
   
  -     assert(theXercesNode.isNull() == true ||
  -                (mapNode(theXercesNode) != 0 &&
  -                 mapNode(theXercesNode)->getNodeType() == 
XalanNode::ELEMENT_NODE));
  -
        return theXercesNode.isNull() == true ? 0 :
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +                             (XalanElement*)mapNode(theXercesNode);
  +#else
                                
static_cast<XalanElement*>(mapNode(theXercesNode));
  +#endif
   }
   
   
   
  -XalanNode*
  -XercesDocumentBridge::createBridgeNode(const DOM_Node&       theXercesNode) 
const
  +// Helper class to walk the tree and build everything...
  +class BuildBridgeTreeWalker : public XercesTreeWalker
   {
  -     XalanNode*                              theNewNode = 0;
  +public:
   
  -     switch(theXercesNode.getNodeType())
  +     typedef XercesDocumentBridge::NavigatorBridgeVectorType         
NavigatorBridgeVectorType;
  +
  +     BuildBridgeTreeWalker(
  +                     XercesDocumentBridge*           theDocument,
  +                     XercesBridgeNavigator*          theDocumentNavigator,
  +                     NavigatorBridgeVectorType&      theNavigators,
  +                     unsigned long                           theStartIndex);
  +
  +     virtual
  +     ~BuildBridgeTreeWalker();
  +
  +protected:
  +
  +     virtual void
  +     startNode(const DOM_Node&       node);
  +
  +     virtual void
  +     endNode(const DOM_Node& node);
  +
  +private:
  +
  +     XercesDocumentBridge*           m_document;
  +
  +     NavigatorBridgeVectorType&      m_navigators;
  +
  +     unsigned long                           m_currentIndex;
  +
  +     struct NavigatorStackEntryType
        {
  -     case DOM_Node::ATTRIBUTE_NODE:
  +             NavigatorStackEntryType(
  +                                     XercesBridgeNavigator*  theNavigator,
  +                                     XalanNode*                              
theNode) :
  +                     m_navigator(theNavigator),
  +                     m_node(theNode)
                {
  -                     const DOM_Attr&         theAttrNode =
  -                                             static_cast<const 
DOM_Attr&>(theXercesNode);
  -
  -                     theNewNode = createBridgeNode(theAttrNode);
  -                     assert(theNewNode != 0);
                }
  -             break;
   
  -     case DOM_Node::CDATA_SECTION_NODE:
  -             {
  -                     const DOM_CDATASection&         theCDATASectionNode =
  -                                             static_cast<const 
DOM_CDATASection&>(theXercesNode);
  +             XercesBridgeNavigator*  m_navigator;
   
  -                     theNewNode = createBridgeNode(theCDATASectionNode);
  -                     assert(theNewNode != 0);
  +             XalanNode*                              m_node;
  +     };
   
  -             }
  -             break;
  +#if defined(XALAN_NO_NAMESPACES)
  +     typedef vector<NavigatorStackEntryType>         NavigatorStackType;
  +#else
  +     typedef std::vector<NavigatorStackEntryType>    NavigatorStackType;
  +#endif
   
  -     case DOM_Node::COMMENT_NODE:
  -             {
  -                     const DOM_Comment&      theCommentNode =
  -                                             static_cast<const 
DOM_Comment&>(theXercesNode);
  +     NavigatorStackType      m_parentNavigatorStack;
   
  -                     theNewNode = createBridgeNode(theCommentNode);
  -                     assert(theNewNode != 0);
  -             }
  -             break;
  +     NavigatorStackType      m_siblingNavigatorStack;
  +};
   
  -     case DOM_Node::DOCUMENT_FRAGMENT_NODE:
  -             {
  -                     const DOM_DocumentFragment&             
theDocumentFragmentNode =
  -                                             static_cast<const 
DOM_DocumentFragment&>(theXercesNode);
   
  -                     theNewNode = createBridgeNode(theDocumentFragmentNode);
  -                     assert(theNewNode != 0);
   
  -             }
  -             break;
  +void
  +XercesDocumentBridge::buildBridgeNodes()
  +{
  +     const DOM_Node  theStartChild = m_xercesDocument.getFirstChild();
   
  -     case DOM_Node::ELEMENT_NODE:
  -             {
  -                     const DOM_Element&      theElementNode =
  -                                             static_cast<const 
DOM_Element&>(theXercesNode);
  +     if (theStartChild.isNull() == false)
  +     {
  +             assert(m_navigators.back().getIndex() == 1);
  +             assert(m_navigators.size() == 1);
   
  -                     theNewNode = createBridgeNode(theElementNode);
  -                     assert(theNewNode != 0);
  -             }
  -             break;
  +             BuildBridgeTreeWalker   theTreeWalker(
  +                             this,
  +                             &m_navigators.back(),
  +                             m_navigators,
  +                             2);
   
  -     case DOM_Node::ENTITY_NODE:
  -             {
  -                     const DOM_Entity&       theEntityNode =
  -                                             static_cast<const 
DOM_Entity&>(theXercesNode);
  +             theTreeWalker.traverse(theStartChild, m_xercesDocument);
  +     }
   
  -                     theNewNode = createBridgeNode(theEntityNode);
  -                     assert(theNewNode != 0);
  -             }
  -             break;
  +     // OK, now set m_documentElement...
  +     XalanNode*      theChild = m_navigator.getFirstChild();
   
  -     case DOM_Node::ENTITY_REFERENCE_NODE:
  -             {
  -                     const DOM_EntityReference&      theEntityReferenceNode =
  -                                             static_cast<const 
DOM_EntityReference&>(theXercesNode);
  +     while(theChild != 0 && theChild->getNodeType() != 
XalanNode::ELEMENT_NODE)
  +     {
  +             theChild = theChild->getNextSibling();
  +     }
   
  -                     theNewNode = createBridgeNode(theEntityReferenceNode);
  -                     assert(theNewNode != 0);
  -             }
  -             break;
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +     m_documentElement = (XalanElement*)theChild;
  +#else
  +     m_documentElement = static_cast<XalanElement*>(theChild);
  +#endif
   
  -     case DOM_Node::NOTATION_NODE:
  -             {
  -                     const DOM_Notation&             theNotationNode =
  -                                             static_cast<const 
DOM_Notation&>(theXercesNode);
  +     m_indexValid = true;
   
  -                     theNewNode = createBridgeNode(theNotationNode);
  -                     assert(theNewNode != 0);
  -             }
  -             break;
  +     m_mappingMode = false;
  +}
   
  -     case DOM_Node::PROCESSING_INSTRUCTION_NODE:
  -             {
  -                     const DOM_ProcessingInstruction&        thePINode =
  -                                             static_cast<const 
DOM_ProcessingInstruction&>(theXercesNode);
   
  -                     theNewNode = createBridgeNode(thePINode);
  -                     assert(theNewNode != 0);
  +
  +BuildBridgeTreeWalker::BuildBridgeTreeWalker(
  +                     XercesDocumentBridge*           theDocument,
  +                     XercesBridgeNavigator*          theDocumentNavigator,
  +                     NavigatorBridgeVectorType&      theNavigators,
  +                     unsigned long                           theStartIndex) :
  +     m_document(theDocument),
  +     m_navigators(theNavigators),
  +     m_currentIndex(theStartIndex),
  +     m_parentNavigatorStack(),
  +     m_siblingNavigatorStack()
  +{
  +     assert(theDocument != 0 && theDocumentNavigator != 0);
  +
  +     // Reserve some space...
  +     m_parentNavigatorStack.reserve(100);
  +     m_parentNavigatorStack.reserve(100);
  +
  +     // The document navigator is the last navigator on the stack...
  +     
m_parentNavigatorStack.push_back(NavigatorStackEntryType(theDocumentNavigator, 
theDocument));
  +
  +     // There is no previous sibling...
  +     m_siblingNavigatorStack.push_back(NavigatorStackEntryType(0, 0));
  +}
  +
  +
  +
  +BuildBridgeTreeWalker::~BuildBridgeTreeWalker()
  +{
  +}
  +
  +
  +
  +void
  +BuildBridgeTreeWalker::startNode(const DOM_Node&     node)
  +{
  +     XalanNode* const        theBridgeNode = 
m_document->createBridgeNode(node, m_currentIndex, false);
  +
  +     XercesBridgeNavigator&  theCurrentNodeNavigator = m_navigators.back();
  +
  +     assert(m_parentNavigatorStack.empty() == false);
  +     assert(m_siblingNavigatorStack.empty() == false);
  +
  +     // Get the two navigators...
  +     NavigatorStackEntryType&        theParentEntry = 
m_parentNavigatorStack.back();
  +     NavigatorStackEntryType&        theSiblingEntry = 
m_siblingNavigatorStack.back();
  +
  +     theCurrentNodeNavigator.setParentNode(theParentEntry.m_node);
  +
  +     // If the first child has not been set, then set it
  +     // now...
  +     if (theParentEntry.m_navigator->getFirstChild() == 0)
  +     {
  +             assert(theSiblingEntry.m_node == 0);
  +
  +             theParentEntry.m_navigator->setFirstChild(theBridgeNode);
  +     }
  +
  +     // Always set the last child...
  +     theParentEntry.m_navigator->setLastChild(theBridgeNode);
  +
  +     theCurrentNodeNavigator.setPreviousSibling(theSiblingEntry.m_node);
  +
  +     if (theSiblingEntry.m_navigator != 0)
  +     {
  +             theSiblingEntry.m_navigator->setNextSibling(theBridgeNode);
  +     }
  +
  +     // Build an entry for the stacks...
  +     const NavigatorStackEntryType   
theCurrentEntry(&theCurrentNodeNavigator, theBridgeNode);
  +
  +     // My child nodes will now be visited, so push the current
  +     // context on the parent stack...
  +     m_parentNavigatorStack.push_back(theCurrentEntry);
  +
  +     // My siblings will also need to know about me as well...
  +     m_siblingNavigatorStack.push_back(theCurrentEntry);
  +
  +     // This will serve to mark the sibling context for my first child,
  +     // since it has no previous sibling.  This will be popped off
  +     // when endNode() is called.
  +     m_siblingNavigatorStack.push_back(NavigatorStackEntryType(0, 0));
  +
  +     // Finally, increment the index counter...
  +     ++m_currentIndex;
  +
  +     const short             theType = node.getNodeType();
  +
  +     if (theType == DOM_Node::DOCUMENT_TYPE_NODE)
  +     {
  +             // Special case for doctype -- we have to build its entities...
  +             const DOM_DocumentType&         theDoctype =
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +                     (const DOM_DocumentType&)node;
  +#else
  +                     static_cast<const DOM_DocumentType&>(node);
  +#endif
  +
  +             const DOM_NamedNodeMap  theEntities =
  +                     theDoctype.getEntities();
  +
  +             const unsigned int      theLength =
  +                     theEntities.getLength();
  +
  +             for (unsigned int i = 0; i < theLength; ++i)
  +             {
  +                     // Build it, but don't index it...
  +                     m_document->createBridgeNode(theEntities.item(i), 
m_currentIndex++, true);
                }
  -             break;
  +     }
  +     else if (theType == DOM_Node::ELEMENT_NODE)
  +     {
  +     // Special case for element nodes -- we have to build the attributes...
  +             const DOM_Element&      theElement =
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +                     (const DOM_Element&)node;
  +#else
  +                     static_cast<const DOM_Element&>(node);
  +#endif
   
  -     case DOM_Node::TEXT_NODE:
  +             const DOM_NamedNodeMap  theAttributes =
  +                     theElement.getAttributes();
  +
  +             const unsigned int      theLength =
  +                     theAttributes.getLength();
  +
  +             XercesBridgeNavigator*  thePreviousAttrNavigator = 0;
  +             XalanNode*                              thePreviousAttr = 0;
  +
  +             for (unsigned int i = 0; i < theLength; ++i)
                {
  -                     const DOM_Text&         theTextNode =
  -                                             static_cast<const 
DOM_Text&>(theXercesNode);
  +                     // Get the attribute from the node map...
  +                     const DOM_Node  theAttr = theAttributes.item(i);
  +                     assert(theAttr.isNull() == false);
  +
  +                     // Create a bridge node.
  +                     XalanNode* const        theCurrentAttr =
  +                             m_document->createBridgeNode(theAttr, 
m_currentIndex, false);
  +                     assert(theCurrentAttr != 0);
  +
  +                     // Get the attribute node's navigator...
  +                     XercesBridgeNavigator&  theCurrentAttrNavigator =
  +                             m_navigators.back();
   
  -                     theNewNode = createBridgeNode(theTextNode);
  -                     assert(theNewNode != 0);
  -             }
  -             break;
  +                     // Set the parent node...
  +                     theCurrentAttrNavigator.setParentNode(theBridgeNode);
   
  -     default:
  -             assert(false);
  -             break;
  -     }
  +                     if (thePreviousAttr != 0)
  +                     {
  +                             assert(thePreviousAttrNavigator != 0);
   
  -     return theNewNode;
  +                             // Link in the previous attribute...
  +                             
theCurrentAttrNavigator.setPreviousSibling(thePreviousAttr);
  +
  +                             
thePreviousAttrNavigator->setNextSibling(theCurrentAttr);
  +                     }
  +
  +                     // Update the pointers so they point to this 
attribute...
  +                     thePreviousAttr = theCurrentAttr;
  +                     thePreviousAttrNavigator = &theCurrentAttrNavigator;
  +
  +                     // Finally, increment the index...
  +                     ++m_currentIndex;
  +             }
  +     }
   }
   
   
   
  -const XercesBridgeNavigator&
  -XercesDocumentBridge::pushNavigator() const
  +void
  +BuildBridgeTreeWalker::endNode(const DOM_Node&       /* node */)
   {
  -     XercesDocumentBridge* const             This =
  -             const_cast<XercesDocumentBridge*>(this);
  +     assert(m_parentNavigatorStack.empty() == false);
  +     assert(m_siblingNavigatorStack.empty() == false);
   
  -     m_navigators.push_back(XercesBridgeNavigator(This));
  +     // I have to pop my entry, since my children are finished...
  +     m_parentNavigatorStack.pop_back();
   
  -     return m_navigators.back();
  -}
  +     // Pop any sibling navigators my child pushed...
  +     while(m_siblingNavigatorStack.back().m_navigator != 0)
  +     {
  +             assert(m_siblingNavigatorStack.back().m_node != 0);
   
  +             m_siblingNavigatorStack.pop_back();
  +     }
  +
  +     // There must be a context marker...
  +     assert(m_siblingNavigatorStack.back().m_navigator == 0 &&
  +                m_siblingNavigatorStack.back().m_node == 0);
  +
  +     // Pop the context marker...
  +     m_siblingNavigatorStack.pop_back();
  +}
  
  
  
  1.5       +107 -38   
xml-xalan/c/src/XercesParserLiaison/XercesDocumentBridge.hpp
  
  Index: XercesDocumentBridge.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesDocumentBridge.hpp,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- XercesDocumentBridge.hpp  2000/07/21 19:38:31     1.4
  +++ XercesDocumentBridge.hpp  2000/08/10 18:41:36     1.5
  @@ -66,6 +66,7 @@
   #include <deque>
   #include <memory>
   #include <set>
  +#include <vector>
   
   
   
  @@ -77,11 +78,23 @@
   
   
   
  +#include <DOMSupport/TreeWalker.hpp>
  +
  +
  +
   #include <XercesParserLiaison/XercesToXalanNodeMap.hpp>
   #include <XercesParserLiaison/XercesBridgeNavigator.hpp>
   #include <XercesParserLiaison/XercesDocumentNamedNodeListCache.hpp>
   #include <XercesParserLiaison/XercesNodeListBridge.hpp>
   
  +//#define XALAN_USE_BLOCK_ALLOCATORS
  +
  +#if defined(XALAN_USE_BLOCK_ALLOCATORS)
  +#include <XercesParserLiaison/XercesElementBridgeAllocator.hpp>
  +#include <XercesParserLiaison/XercesTextBridgeAllocator.hpp>
  +#include <XercesParserLiaison/XercesAttributeBridgeAllocator.hpp>
  +#endif
  +
   
   
   class XalanDOMImplementation;
  @@ -210,6 +223,15 @@
        virtual void
        setPrefix(const XalanDOMString& prefix);
   
  +     virtual bool
  +     isIndexed() const;
  +
  +     virtual unsigned long
  +     getIndex() const;
  +
  +     virtual XalanDOMString
  +     getXSLTData() const;
  +
        virtual XalanElement*
        createElement(const XalanDOMString& tagName);
   
  @@ -271,6 +293,7 @@
        virtual XalanElement*
        getElementById(const XalanDOMString&    elementId) const;
   
  +     
        // These are some special interfaces to manage relationships between
        // our nodes and Xerces nodes.
   
  @@ -293,35 +316,24 @@
        void
        rebuildBridge();
   
  -     /**
  -      * Clears any node relationships that may have been
  -      * cached.  This should be done if the document is
  -      * modified in any way.
  -      */
  -     void
  -     clearCachedNodes();
  -
        XalanNode*
        mapNode(const DOM_Node&         theXercesNode) const;
   
  +     XalanAttr*
  +     mapNode(const DOM_Attr&         theXercesNode) const;
  +
  +     XalanElement*
  +     mapNode(const DOM_Element&      theXercesNode) const;
  +
        DOM_Node
        mapNode(const XalanNode*        theXalanNode) const;
   
  -     XalanNode*
  -     mapNode(NodeImpl*       theXercesNodeImpl) const;
  -
        DOM_Attr
        mapNode(const XalanAttr*        theXalanNode) const;
   
        NodeImpl*
        mapNodeToImpl(const XalanNode*  theXalanNode) const;
   
  -     XalanAttr*
  -     mapNode(const DOM_Attr&         theXercesNode) const;
  -
  -     XalanElement*
  -     mapNode(const DOM_Element&      theXercesNode) const;
  -
        /**
         *
         * Get the Xerces DOM_Document that this XercesDocument represents.
  @@ -348,6 +360,9 @@
   
   private:
   
  +     XalanNode*
  +     mapNode(NodeImpl*       theXercesNodeImpl) const;
  +
        // Destruction API...
        void
        destroyBridgeNode(XalanNode*    theNode);
  @@ -372,52 +387,90 @@
                        const DOM_Node&         theXercesNode,
                        bool                            deep);
   
  -     // Convenience function to build the Doctype node...
  -     XercesDocumentTypeBridge*
  -     buildDocumentTypeBridge() const;
  -
        // Factory methods for our implementation nodes...
        XalanNode*
  -     createBridgeNode(const DOM_Node&        theXercesNode) const;
  +     createBridgeNode(
  +                     const DOM_Node& theXercesNode,
  +                     unsigned long   theIndex,
  +                     bool                    mapNode) const;
  +
  +     XercesDocumentTypeBridge*
  +     createBridgeNode(
  +                     const DOM_DocumentType&         theDoctype,
  +                     unsigned long                           theIndex,
  +                     bool                                            
mapNode) const;
   
        XercesElementBridge*
  -     createBridgeNode(const DOM_Element&     theXercesNode) const;
  +     createBridgeNode(
  +                     const DOM_Element&      theXercesNode,
  +                     unsigned long           theIndex,
  +                     bool                            mapNode) const;
   
        XercesDocumentFragmentBridge*
  -     createBridgeNode(const DOM_DocumentFragment&    theXercesNode) const;
  +     createBridgeNode(
  +                     const DOM_DocumentFragment&             theXercesNode,
  +                     unsigned long                                   
theIndex,
  +                     bool                                                    
mapNode) const;
   
        XercesTextBridge*
  -     createBridgeNode(const DOM_Text&        theXercesNode) const;
  +     createBridgeNode(
  +                     const DOM_Text&         theXercesNode,
  +                     unsigned long           theIndex,
  +                     bool                            mapNode) const;
   
        XercesCommentBridge*
  -     createBridgeNode(const DOM_Comment&             theXercesNode) const;
  +     createBridgeNode(
  +                     const DOM_Comment&      theXercesNode,
  +                     unsigned long           theIndex,
  +                     bool                            mapNode) const;
   
        XercesCDATASectionBridge*
  -     createBridgeNode(const DOM_CDATASection&        theXercesNode) const;
  +     createBridgeNode(
  +                     const DOM_CDATASection&         theXercesNode,
  +                     unsigned long                           theIndex,
  +                     bool                                            
mapNode) const;
   
        XercesProcessingInstructionBridge*
  -     createBridgeNode(const DOM_ProcessingInstruction&       theXercesNode) 
const;
  +     createBridgeNode(
  +                     const DOM_ProcessingInstruction&        theXercesNode,
  +                     unsigned long                                           
theIndex,
  +                     bool                                                    
        mapNode) const;
   
        XercesAttrBridge*
  -     createBridgeNode(const DOM_Attr&        theXercesNode) const;
  +     createBridgeNode(
  +                     const DOM_Attr&         theXercesNode,
  +                     unsigned long           theIndex,
  +                     bool                            mapNode) const;
   
        XercesEntityBridge*
  -     createBridgeNode(const DOM_Entity&      theXercesNode) const;
  +     createBridgeNode(
  +                     const DOM_Entity&       theXercesNode,
  +                     unsigned long           theIndex,
  +                     bool                            mapNode) const;
   
        XercesEntityReferenceBridge*
  -     createBridgeNode(const DOM_EntityReference&             theXercesNode) 
const;
  +     createBridgeNode(
  +                     const DOM_EntityReference&      theXercesNode,
  +                     unsigned long                           theIndex,
  +                     bool                                            
mapNode) const;
   
        XercesNotationBridge*
  -     createBridgeNode(const DOM_Notation&    theXercesNode) const;
  +     createBridgeNode(
  +                     const DOM_Notation&             theXercesNode,
  +                     unsigned long                   theIndex,
  +                     bool                                    mapNode) const;
   
  -     const XercesBridgeNavigator&
  -     pushNavigator() const;
  +     XercesBridgeNavigator&
  +     pushNavigator(bool      mappingMode) const;
   
  +     // This is a private helper class for building the tree...
  +     friend class BuildBridgeTreeWalker;
  +
        // $$$ ToDo: This is because DOM_Document::getElementById() is not
        // const...
        mutable DOM_Document                                    
m_xercesDocument;
   
  -     XercesBridgeNavigator                                   m_navigator;
  +     XalanElement*                                                   
m_documentElement;
   
        XercesNodeListBridge                                    m_children;
   
  @@ -430,20 +483,36 @@
   
        typedef deque<XercesBridgeNavigator>    NavigatorBridgeVectorType;
   
  -     typedef set<XalanNode*>                                 NodeSetType;
  +     typedef deque<XalanNode*>                               NodeVectorType;
   #else
        std::auto_ptr<XalanDOMImplementation>   m_domImplementation;
   
        typedef std::deque<XercesBridgeNavigator>       
NavigatorBridgeVectorType;
   
  -     typedef std::set<XalanNode*>                    NodeSetType;
  +     typedef std::deque<XalanNode*>                          NodeVectorType;
   #endif
   
        mutable NavigatorBridgeVectorType               m_navigators;
  +
  +     // Our navigator will be the first entry in m_navigators,
  +     // but we'll cache this so access is faster...
  +     XercesBridgeNavigator&                                  m_navigator;
   
  -     mutable NodeSetType                                             m_nodes;
  +     mutable NodeVectorType                                  m_nodes;
   
        mutable XercesDocumentTypeBridge*               m_doctype;
  +
  +     bool                                                                    
m_mappingMode;
  +
  +     bool                                                                    
m_indexValid;
  +
  +#if defined(XALAN_USE_BLOCK_ALLOCATORS)
  +     mutable XercesElementBridgeAllocator    m_elementAllocator;
  +
  +     mutable XercesTextBridgeAllocator               m_textAllocator;
  +
  +     mutable XercesAttributeBridgeAllocator  m_attributeAllocator;
  +#endif
   };
   
   
  
  
  
  1.3       +34 -0     
xml-xalan/c/src/XercesParserLiaison/XercesDocumentFragmentBridge.cpp
  
  Index: XercesDocumentFragmentBridge.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesDocumentFragmentBridge.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XercesDocumentFragmentBridge.cpp  2000/05/03 18:42:11     1.2
  +++ XercesDocumentFragmentBridge.cpp  2000/08/10 18:41:36     1.3
  @@ -62,6 +62,10 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
   #include "XercesDOMException.hpp"
   #include "XercesDocumentBridge.hpp"
   
  @@ -311,4 +315,34 @@
        {
                throw XercesDOMException(theException);
        }
  +}
  +
  +
  +
  +bool
  +XercesDocumentFragmentBridge::isIndexed() const
  +{
  +     // $$$ ToDo: Are document fragments ever indexed?
  +     // I don't think so...
  +     return false;
  +
  +//   return m_navigator.getOwnerDocument()->isIndexed();
  +}
  +
  +
  +
  +unsigned long
  +XercesDocumentFragmentBridge::getIndex() const
  +{
  +     return 0;
  +
  +//   return m_navigator.getIndex();
  +}
  +
  +
  +
  +XalanDOMString
  +XercesDocumentFragmentBridge::getXSLTData() const
  +{
  +     return DOMServices::getNodeData(*this);
   }
  
  
  
  1.2       +9 -0      
xml-xalan/c/src/XercesParserLiaison/XercesDocumentFragmentBridge.hpp
  
  Index: XercesDocumentFragmentBridge.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesDocumentFragmentBridge.hpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XercesDocumentFragmentBridge.hpp  2000/04/11 14:39:29     1.1
  +++ XercesDocumentFragmentBridge.hpp  2000/08/10 18:41:36     1.2
  @@ -429,6 +429,15 @@
        virtual void
        setPrefix(const XalanDOMString&         prefix);
   
  +     virtual bool
  +     isIndexed() const;
  +
  +     virtual unsigned long
  +     getIndex() const;
  +
  +     virtual XalanDOMString
  +     getXSLTData() const;
  +
        //@}
   
   private:
  
  
  
  1.3       +28 -0     
xml-xalan/c/src/XercesParserLiaison/XercesDocumentTypeBridge.cpp
  
  Index: XercesDocumentTypeBridge.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesDocumentTypeBridge.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XercesDocumentTypeBridge.cpp      2000/05/03 18:42:12     1.2
  +++ XercesDocumentTypeBridge.cpp      2000/08/10 18:41:36     1.3
  @@ -58,6 +58,10 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
   #include "XercesDOMException.hpp"
   #include "XercesDocumentBridge.hpp"
   
  @@ -321,6 +325,30 @@
        {
                throw XercesDOMException(theException);
        }
  +}
  +
  +
  +
  +bool
  +XercesDocumentTypeBridge::isIndexed() const
  +{
  +     return m_navigator.getOwnerDocument()->isIndexed();
  +}
  +
  +
  +
  +unsigned long
  +XercesDocumentTypeBridge::getIndex() const
  +{
  +     return m_navigator.getIndex();
  +}
  +
  +
  +
  +XalanDOMString
  +XercesDocumentTypeBridge::getXSLTData() const
  +{
  +     return DOMServices::getNodeData(*this);
   }
   
   
  
  
  
  1.2       +9 -0      
xml-xalan/c/src/XercesParserLiaison/XercesDocumentTypeBridge.hpp
  
  Index: XercesDocumentTypeBridge.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesDocumentTypeBridge.hpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XercesDocumentTypeBridge.hpp      2000/04/11 14:39:29     1.1
  +++ XercesDocumentTypeBridge.hpp      2000/08/10 18:41:37     1.2
  @@ -430,6 +430,15 @@
        virtual void
        setPrefix(const XalanDOMString& prefix);
   
  +     virtual bool
  +     isIndexed() const;
  +
  +     virtual unsigned long
  +     getIndex() const;
  +
  +     virtual XalanDOMString
  +     getXSLTData() const;
  +
        //@}
   
        // These interfaces are inherited from XalanDocumentType...
  
  
  
  1.2       +28 -0     
xml-xalan/c/src/XercesParserLiaison/XercesElementBridge.cpp
  
  Index: XercesElementBridge.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesElementBridge.cpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XercesElementBridge.cpp   2000/04/11 14:39:29     1.1
  +++ XercesElementBridge.cpp   2000/08/10 18:41:37     1.2
  @@ -62,6 +62,10 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
   #include "XercesDOMException.hpp"
   #include "XercesBridgeNavigator.hpp"
   #include "XercesDocumentBridge.hpp"
  @@ -316,6 +320,30 @@
        {
                throw XercesDOMException(theException);
        }
  +}
  +
  +
  +
  +bool
  +XercesElementBridge::isIndexed() const
  +{
  +     return m_navigator.getOwnerDocument()->isIndexed();
  +}
  +
  +
  +
  +unsigned long
  +XercesElementBridge::getIndex() const
  +{
  +     return m_navigator.getIndex();
  +}
  +
  +
  +
  +XalanDOMString
  +XercesElementBridge::getXSLTData() const
  +{
  +     return DOMServices::getNodeData(*this);
   }
   
   
  
  
  
  1.2       +9 -0      
xml-xalan/c/src/XercesParserLiaison/XercesElementBridge.hpp
  
  Index: XercesElementBridge.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesElementBridge.hpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XercesElementBridge.hpp   2000/04/11 14:39:29     1.1
  +++ XercesElementBridge.hpp   2000/08/10 18:41:37     1.2
  @@ -436,6 +436,15 @@
        virtual void
        setPrefix(const XalanDOMString& prefix);
   
  +     virtual bool
  +     isIndexed() const;
  +
  +     virtual unsigned long
  +     getIndex() const;
  +
  +     virtual XalanDOMString
  +     getXSLTData() const;
  +
        //@}
   
        // These interfaces are inherited from XalanElement...
  
  
  
  1.3       +28 -0     
xml-xalan/c/src/XercesParserLiaison/XercesEntityBridge.cpp
  
  Index: XercesEntityBridge.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesEntityBridge.cpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XercesEntityBridge.cpp    2000/05/03 18:41:10     1.2
  +++ XercesEntityBridge.cpp    2000/08/10 18:41:37     1.3
  @@ -58,6 +58,10 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
   #include "XercesBridgeNavigator.hpp"
   #include "XercesDOMException.hpp"
   #include "XercesDocumentBridge.hpp"
  @@ -308,6 +312,30 @@
        {
                throw XercesDOMException(theException);
        }
  +}
  +
  +
  +
  +bool
  +XercesEntityBridge::isIndexed() const
  +{
  +     return m_navigator.getOwnerDocument()->isIndexed();
  +}
  +
  +
  +
  +unsigned long
  +XercesEntityBridge::getIndex() const
  +{
  +     return m_navigator.getIndex();
  +}
  +
  +
  +
  +XalanDOMString
  +XercesEntityBridge::getXSLTData() const
  +{
  +     return DOMServices::getNodeData(*this);
   }
   
   
  
  
  
  1.3       +9 -0      
xml-xalan/c/src/XercesParserLiaison/XercesEntityBridge.hpp
  
  Index: XercesEntityBridge.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesEntityBridge.hpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XercesEntityBridge.hpp    2000/05/03 18:41:11     1.2
  +++ XercesEntityBridge.hpp    2000/08/10 18:41:38     1.3
  @@ -429,6 +429,15 @@
        virtual void
        setPrefix(const XalanDOMString& prefix);
   
  +     virtual bool
  +     isIndexed() const;
  +
  +     virtual unsigned long
  +     getIndex() const;
  +
  +     virtual XalanDOMString
  +     getXSLTData() const;
  +
        //@}
   
        // These interfaces are inherited from XalanEntity...
  
  
  
  1.2       +28 -0     
xml-xalan/c/src/XercesParserLiaison/XercesEntityReferenceBridge.cpp
  
  Index: XercesEntityReferenceBridge.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesEntityReferenceBridge.cpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XercesEntityReferenceBridge.cpp   2000/04/11 14:39:30     1.1
  +++ XercesEntityReferenceBridge.cpp   2000/08/10 18:41:38     1.2
  @@ -58,6 +58,10 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
   #include "XercesDOMException.hpp"
   #include "XercesDocumentBridge.hpp"
   
  @@ -308,4 +312,28 @@
        {
                throw XercesDOMException(theException);
        }
  +}
  +
  +
  +
  +bool
  +XercesEntityReferenceBridge::isIndexed() const
  +{
  +     return m_navigator.getOwnerDocument()->isIndexed();
  +}
  +
  +
  +
  +unsigned long
  +XercesEntityReferenceBridge::getIndex() const
  +{
  +     return m_navigator.getIndex();
  +}
  +
  +
  +
  +XalanDOMString
  +XercesEntityReferenceBridge::getXSLTData() const
  +{
  +     return DOMServices::getNodeData(*this);
   }
  
  
  
  1.2       +9 -0      
xml-xalan/c/src/XercesParserLiaison/XercesEntityReferenceBridge.hpp
  
  Index: XercesEntityReferenceBridge.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesEntityReferenceBridge.hpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XercesEntityReferenceBridge.hpp   2000/04/11 14:39:30     1.1
  +++ XercesEntityReferenceBridge.hpp   2000/08/10 18:41:38     1.2
  @@ -429,6 +429,15 @@
        virtual void
        setPrefix(const XalanDOMString& prefix);
   
  +     virtual bool
  +     isIndexed() const;
  +
  +     virtual unsigned long
  +     getIndex() const;
  +
  +     virtual XalanDOMString
  +     getXSLTData() const;
  +
        //@}
   
   private:
  
  
  
  1.2       +28 -0     
xml-xalan/c/src/XercesParserLiaison/XercesNotationBridge.cpp
  
  Index: XercesNotationBridge.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesNotationBridge.cpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XercesNotationBridge.cpp  2000/04/11 14:39:30     1.1
  +++ XercesNotationBridge.cpp  2000/08/10 18:41:38     1.2
  @@ -58,6 +58,10 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
   #include "XercesDOMException.hpp"
   #include "XercesDocumentBridge.hpp"
   
  @@ -305,6 +309,30 @@
        {
                throw XercesDOMException(theException);
        }
  +}
  +
  +
  +
  +bool
  +XercesNotationBridge::isIndexed() const
  +{
  +     return m_navigator.getOwnerDocument()->isIndexed();
  +}
  +
  +
  +
  +unsigned long
  +XercesNotationBridge::getIndex() const
  +{
  +     return m_navigator.getIndex();
  +}
  +
  +
  +
  +XalanDOMString
  +XercesNotationBridge::getXSLTData() const
  +{
  +     return DOMServices::getNodeData(*this);
   }
   
   
  
  
  
  1.2       +9 -0      
xml-xalan/c/src/XercesParserLiaison/XercesNotationBridge.hpp
  
  Index: XercesNotationBridge.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesNotationBridge.hpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XercesNotationBridge.hpp  2000/04/11 14:39:30     1.1
  +++ XercesNotationBridge.hpp  2000/08/10 18:41:39     1.2
  @@ -425,6 +425,15 @@
        virtual void
        setPrefix(const XalanDOMString&         prefix);
   
  +     virtual bool
  +     isIndexed() const;
  +
  +     virtual unsigned long
  +     getIndex() const;
  +
  +     virtual XalanDOMString
  +     getXSLTData() const;
  +
        //@}
   
        // These interfaces are inherited from XalanNotation...
  
  
  
  1.14      +6 -4      
xml-xalan/c/src/XercesParserLiaison/XercesParserLiaison.cpp
  
  Index: XercesParserLiaison.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesParserLiaison.cpp,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- XercesParserLiaison.cpp   2000/07/21 19:28:25     1.13
  +++ XercesParserLiaison.cpp   2000/08/10 18:41:39     1.14
  @@ -96,7 +96,7 @@
        m_shouldExpandEntityRefs(false),
        m_useValidation(false),
        m_includeIgnorableWhitespace(true),
  -     m_doNamespaces(false),
  +     m_doNamespaces(true),
        m_exitOnFirstFatalError(true),
        m_entityResolver(0),
        m_errorHandler(this),
  @@ -414,7 +414,7 @@
        const DocumentMapType::const_iterator   i =
                m_documentMap.find(theDocument);
   
  -     return i != m_documentMap.end() ? i->second : 0;
  +     return i != m_documentMap.end() ? (*i).second : 0;
   }
   
   
  @@ -425,7 +425,7 @@
        const DocumentMapType::const_iterator   i =
                m_documentMap.find(theDocument);
   
  -     return i != m_documentMap.end() ? i->second->getXercesDocument() : 
DOM_Document();
  +     return i != m_documentMap.end() ? (*i).second->getXercesDocument() : 
DOM_Document();
   }
   
   
  @@ -516,7 +516,9 @@
   
        theParser->setDoValidation(m_useValidation);
   
  -     theParser->setDoNamespaces(m_doNamespaces);
  +     // $$$ ToDo: For the time being, we cannot process namespaces
  +     // with SAX due to the age of Xerces' SAX interfaces.
  +//   theParser->setDoNamespaces(m_doNamespaces);
   
        theParser->setExitOnFirstFatalError(m_exitOnFirstFatalError);
   
  
  
  
  1.2       +28 -0     
xml-xalan/c/src/XercesParserLiaison/XercesProcessingInstructionBridge.cpp
  
  Index: XercesProcessingInstructionBridge.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesProcessingInstructionBridge.cpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XercesProcessingInstructionBridge.cpp     2000/04/11 14:39:30     1.1
  +++ XercesProcessingInstructionBridge.cpp     2000/08/10 18:41:39     1.2
  @@ -58,6 +58,10 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
   #include "XercesDOMException.hpp"
   #include "XercesDocumentBridge.hpp"
   
  @@ -313,6 +317,30 @@
        {
                throw XercesDOMException(theException);
        }
  +}
  +
  +
  +
  +bool
  +XercesProcessingInstructionBridge::isIndexed() const
  +{
  +     return m_navigator.getOwnerDocument()->isIndexed();
  +}
  +
  +
  +
  +unsigned long
  +XercesProcessingInstructionBridge::getIndex() const
  +{
  +     return m_navigator.getIndex();
  +}
  +
  +
  +
  +XalanDOMString
  +XercesProcessingInstructionBridge::getXSLTData() const
  +{
  +     return DOMServices::getNodeData(*this);
   }
   
   
  
  
  
  1.2       +9 -0      
xml-xalan/c/src/XercesParserLiaison/XercesProcessingInstructionBridge.hpp
  
  Index: XercesProcessingInstructionBridge.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesProcessingInstructionBridge.hpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XercesProcessingInstructionBridge.hpp     2000/04/11 14:39:30     1.1
  +++ XercesProcessingInstructionBridge.hpp     2000/08/10 18:41:39     1.2
  @@ -425,6 +425,15 @@
        virtual void
        setPrefix(const XalanDOMString& prefix);
   
  +     virtual bool
  +     isIndexed() const;
  +
  +     virtual unsigned long
  +     getIndex() const;
  +
  +     virtual XalanDOMString
  +     getXSLTData() const;
  +
        //@}
   
        // These interfaces are inherited from XalanProcessingInstruction...
  
  
  
  1.2       +36 -0     xml-xalan/c/src/XercesParserLiaison/XercesTextBridge.cpp
  
  Index: XercesTextBridge.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesTextBridge.cpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XercesTextBridge.cpp      2000/04/11 14:39:30     1.1
  +++ XercesTextBridge.cpp      2000/08/10 18:41:39     1.2
  @@ -62,6 +62,10 @@
   
   
   
  +#include <DOMSupport/DOMServices.hpp>
  +
  +
  +
   #include "XercesBridgeNavigator.hpp"
   #include "XercesDOMException.hpp"
   #include "XercesDocumentBridge.hpp"
  @@ -324,6 +328,30 @@
   
   
   
  +bool
  +XercesTextBridge::isIndexed() const
  +{
  +     return m_navigator.getOwnerDocument()->isIndexed();
  +}
  +
  +
  +
  +unsigned long
  +XercesTextBridge::getIndex() const
  +{
  +     return m_navigator.getIndex();
  +}
  +
  +
  +
  +XalanDOMString
  +XercesTextBridge::getXSLTData() const
  +{
  +     return DOMServices::getNodeData(*this);
  +}
  +
  +
  +
   XalanDOMString
   XercesTextBridge::getData() const
   {
  @@ -428,4 +456,12 @@
   XercesTextBridge::splitText(unsigned int     offset)
   {
        return m_navigator.splitText(m_xercesNode, offset);
  +}
  +
  +
  +
  +bool
  +XercesTextBridge::isIgnorableWhitespace() const
  +{
  +     return isWhiteSpace(m_xercesNode.getData());
   }
  
  
  
  1.2       +13 -0     xml-xalan/c/src/XercesParserLiaison/XercesTextBridge.hpp
  
  Index: XercesTextBridge.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesTextBridge.hpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XercesTextBridge.hpp      2000/04/11 14:39:30     1.1
  +++ XercesTextBridge.hpp      2000/08/10 18:41:39     1.2
  @@ -422,6 +422,15 @@
        virtual void
        setPrefix(const XalanDOMString&         prefix);
   
  +     virtual bool
  +     isIndexed() const;
  +
  +     virtual unsigned long
  +     getIndex() const;
  +
  +     virtual XalanDOMString
  +     getXSLTData() const;
  +
        //@}
   
        // These interfaces are inherited from XalanCDATASection...
  @@ -579,6 +588,10 @@
        splitText(unsigned int  offset);
   
       //@}
  +
  +     virtual bool
  +     isIgnorableWhitespace() const;
  +
   private:
   
        // Not implemented...
  
  
  
  1.4       +46 -59    
xml-xalan/c/src/XercesParserLiaison/XercesToXalanNodeMap.cpp
  
  Index: XercesToXalanNodeMap.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesToXalanNodeMap.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XercesToXalanNodeMap.cpp  2000/07/21 19:27:44     1.3
  +++ XercesToXalanNodeMap.cpp  2000/08/10 18:41:39     1.4
  @@ -60,6 +60,7 @@
   
   #include <algorithm>
   #include <cassert>
  +#include <functional>
   
   
   
  @@ -74,8 +75,7 @@
   
   XercesToXalanNodeMap::XercesToXalanNodeMap() :
        m_xalanMap(),
  -     m_xercesMap(),
  -     m_counter(0)
  +     m_xercesMap()
   {
   }
   
  @@ -90,40 +90,18 @@
   void
   XercesToXalanNodeMap::addAssociation(
                        const DOM_Node&         theXercesNode,
  -                     XalanNode*                      theXalanNode,
  -                     bool                            fAssignIndex)
  +                     XalanNode*                      theXalanNode)
   {
  -     // Space the indices, just in case nodes are
  -     // added.  With any luck, we may not need to
  -     // reindex the nodes.
  -     const unsigned long             theIncrement = 5;
  -
        NodeImpl* const         theImpl = 
XercesDOM_NodeHack::getImpl(theXercesNode);
   
        m_xercesMap.insert(XercesNodeMapType::value_type(theImpl, 
theXalanNode));
   
  +     // Keeping two-way indexes is very memory consumptive, and we don't
  +     // need it now...
  +#if defined(XERCES_PARSER_LIASON_FAST_TWO_WAY_MAPPING)
        try
        {
  -             // Unindexed nodes are assigned an index of 0.
  -             unsigned long   theIndex = 0;
  -
  -             // Have we been told to assign an index?
  -             if (fAssignIndex == true)
  -             {
  -                     // Never index attribute nodes or their childern...
  -                     if (theXalanNode->getNodeType() != 
XalanNode::ATTRIBUTE_NODE)
  -                     {
  -                             const XalanNode* const  theParent =
  -                                     theXalanNode->getParentNode();
  -
  -                             if (theParent == 0 || theParent->getNodeType() 
!= XalanNode::ATTRIBUTE_NODE)
  -                             {
  -                                     theIndex = m_counter += theIncrement;
  -                             }
  -                     }
  -             }
  -
  -             m_xalanMap.insert(XalanNodeMapType::value_type(theXalanNode, 
XalanNodeMapEntryType(theImpl, theIndex)));
  +             m_xalanMap.insert(XalanNodeMapType::value_type(theXalanNode, 
theImpl));
        }
        catch(...)
        {
  @@ -131,6 +109,7 @@
   
                throw;
        }
  +#endif
   }
   
   
  @@ -140,47 +119,55 @@
   {
        m_xalanMap.clear();
        m_xercesMap.clear();
  -
  -     m_counter = 0;
   }
   
   
  +
  +#if !defined(XERCES_PARSER_LIASON_FAST_TWO_WAY_MAPPING)
   
  -bool
  -XercesToXalanNodeMap::isNodeAfter(
  -                     const XalanNode*        theFirstXalanNode,
  -                     const XalanNode*        theSecondXalanNode) const
  +// I should be able to make this out of a
  +// bunch of compose<> and select2nd<> adapters...
  +
  +class NameMapEqualsFunctor
   {
  -     assert(theFirstXalanNode != 0);
  -     assert(theSecondXalanNode != 0);
  -     assert(theFirstXalanNode->getOwnerDocument() == 
theSecondXalanNode->getOwnerDocument());
  +public:
  +
  +     NameMapEqualsFunctor(const XalanNode*   theXalanNode) :
  +             m_value(theXalanNode)
  +     {
  +     }
  +
  +     bool
  +     operator()(const XercesToXalanNodeMap::XercesNodeMapType::value_type&   
thePair) const
  +     {
  +             return m_value == thePair.second;
  +     }
  +
  +private:
  +
  +     const XalanNode*        m_value;
  +};
  +
   
  -     bool fResult = false;
   
  -     const XalanNodeMapType::const_iterator  i =
  -                     m_xalanMap.find(theFirstXalanNode);
  +NodeImpl*
  +XercesToXalanNodeMap::getNodeImpl(const XalanNode*   theXalanNode) const
  +{
  +     using std::find_if;
  +
  +     const XercesNodeMapType::const_iterator         i =
  +             find_if(m_xercesMap.begin(),
  +                             m_xercesMap.end(),
  +                             NameMapEqualsFunctor(theXalanNode));
   
  -     if (i == m_xalanMap.end())
  +     if (i != m_xercesMap.end())
        {
  -             throw 
XalanDOMException(XalanDOMException::HIERARCHY_REQUEST_ERR);
  +             return (*i).first;
        }
        else
        {
  -             const XalanNodeMapType::const_iterator  j =
  -                     m_xalanMap.find(theSecondXalanNode);
  -
  -             if (i == m_xalanMap.end())
  -             {
  -                     throw 
XalanDOMException(XalanDOMException::HIERARCHY_REQUEST_ERR);
  -             }
  -             else
  -             {
  -                     if (i->second.m_index > j->second.m_index)
  -                     {
  -                             fResult = true;
  -                     }
  -             }
  +             return 0;
        }
  -
  -     return fResult;
   }
  +
  +#endif
  
  
  
  1.4       +19 -32    
xml-xalan/c/src/XercesParserLiaison/XercesToXalanNodeMap.hpp
  
  Index: XercesToXalanNodeMap.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XercesParserLiaison/XercesToXalanNodeMap.hpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XercesToXalanNodeMap.hpp  2000/05/11 19:04:31     1.3
  +++ XercesToXalanNodeMap.hpp  2000/08/10 18:41:39     1.4
  @@ -91,8 +91,7 @@
        void
        addAssociation(
                        const DOM_Node&         theXercesNode,
  -                     XalanNode*                      theXalanNode,
  -                     bool                            fAssignIndex);
  +                     XalanNode*                      theXalanNode);
   
        void
        clear();
  @@ -104,7 +103,7 @@
        }
   
        XalanNode*
  -     getNode(const NodeImpl*         theXercesNodeImpl) const
  +     getNode(NodeImpl*       theXercesNodeImpl) const
        {
                const XercesNodeMapType::const_iterator         i =
                                m_xercesMap.find(theXercesNodeImpl);
  @@ -115,7 +114,7 @@
                }
                else
                {
  -                     return i->second;
  +                     return (*i).second;
                }
        }
   
  @@ -125,6 +124,8 @@
                return XercesDOM_NodeHack(getNodeImpl(theXalanNode));
        }
   
  +#if defined(XERCES_PARSER_LIASON_FAST_TWO_WAY_MAPPING)
  +
        NodeImpl*
        getNodeImpl(const XalanNode*    theXalanNode) const
        {
  @@ -137,51 +138,37 @@
                }
                else
                {
  -                     return i->second.m_xercesNode;
  +                     return (*i).second;
                }
        }
   
  +#else
  +
        NodeImpl*
  +     getNodeImpl(const XalanNode*    theXalanNode) const;
  +
  +#endif
  +
  +     NodeImpl*
        getNodeImpl(const DOM_Node&             theXercesNode) const
        {
                return XercesDOM_NodeHack::getImpl(theXercesNode);
        }
   
  -     bool
  -     isNodeAfter(
  -                     const XalanNode*        theFirstXercesNode,
  -                     const XalanNode*        theSecondXercesNode) const;
  -
  -private:
  -
  -     struct XalanNodeMapEntryType
  -     {
  -             XalanNodeMapEntryType(
  -                     NodeImpl*               theXercesNode = 0,
  -                     unsigned long   theIndex = 0) :
  -                     m_xercesNode(theXercesNode),
  -                     m_index(theIndex)
  -             {
  -             }
  -
  -             NodeImpl*               m_xercesNode;
  -             unsigned long   m_index;
  -     };
  -
   #if defined(XALAN_NO_NAMESPACES)
  -     typedef map<const XalanNode*, XalanNodeMapEntryType>            
XalanNodeMapType;
  +     typedef map<XalanNode*, NodeImpl*, less<XalanNode*> >   
XalanNodeMapType;
   
  -     typedef map<const NodeImpl*, XalanNode*>                                
        XercesNodeMapType;
  +     typedef map<NodeImpl*, XalanNode*, less<NodeImpl*> >    
XercesNodeMapType;
   #else
  -     typedef std::map<const XalanNode*, XalanNodeMapEntryType>       
XalanNodeMapType;
  +     typedef std::map<XalanNode*, NodeImpl*> XalanNodeMapType;
   
  -     typedef std::map<const NodeImpl*, XalanNode*>                           
XercesNodeMapType;
  +     typedef std::map<NodeImpl*, XalanNode*> XercesNodeMapType;
   #endif
   
  +private:
  +
        XalanNodeMapType        m_xalanMap;
        XercesNodeMapType       m_xercesMap;
  -
  -     unsigned long           m_counter;
   };
   
   
  
  
  

Reply via email to