You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by db...@locus.apache.org on 2000/08/10 20:41:47 UTC

cvs commit: xml-xalan/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

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;
   };