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...@apache.org on 2002/11/13 03:29:44 UTC

cvs commit: xml-xalan/c/src/XSLT NamespacesHandler.cpp NamespacesHandler.hpp

dbertoni    2002/11/12 18:29:44

  Modified:    c/src/XSLT NamespacesHandler.cpp NamespacesHandler.hpp
  Log:
  Changed implementation from map to vector.
  
  Revision  Changes    Path
  1.25      +264 -104  xml-xalan/c/src/XSLT/NamespacesHandler.cpp
  
  Index: NamespacesHandler.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/NamespacesHandler.cpp,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- NamespacesHandler.cpp	12 Nov 2002 02:32:29 -0000	1.24
  +++ NamespacesHandler.cpp	13 Nov 2002 02:29:44 -0000	1.25
  @@ -79,6 +79,208 @@
   
   
   
  +template<class VectorType>
  +const VectorType::value_type*
  +findByPrefix(
  +			const VectorType&		theVector,
  +			const XalanDOMString&	thePrefix)
  +{
  +	const VectorType::const_iterator	theEnd(theVector.end());
  +	VectorType::const_iterator	theCurrent(theVector.begin());
  +
  +	while(theCurrent != theEnd)
  +	{
  +		if ((*theCurrent).getPrefix() == thePrefix)
  +		{
  +			return &*theCurrent;
  +		}
  +		else
  +		{
  +			++theCurrent;
  +		}
  +	}
  +
  +	return 0;
  +}
  +
  +
  +
  +#if defined(_MSC_VER)
  +
  +template<class VectorType>
  +VectorType::value_type*
  +findByPrefixNonConst(
  +			VectorType&				theVector,
  +			const XalanDOMString&	thePrefix)
  +{
  +	const VectorType::iterator	theEnd(theVector.end());
  +	VectorType::iterator		theCurrent(theVector.begin());
  +
  +	while(theCurrent != theEnd)
  +	{
  +		if ((*theCurrent).getPrefix() == thePrefix)
  +		{
  +			return &*theCurrent;
  +		}
  +		else
  +		{
  +			++theCurrent;
  +		}
  +	}
  +
  +	return 0;
  +}
  +
  +#else
  +
  +template<class VectorType>
  +VectorType::value_type*
  +findByPrefix(
  +			VectorType&				theVector,
  +			const XalanDOMString&	thePrefix)
  +{
  +	const VectorType::const_iterator	theEnd(theVector.end());
  +	VectorType::const_iterator	theCurrent(theVector.begin());
  +
  +	while(theCurrent != theEnd)
  +	{
  +		if ((*theCurrent).getPrefix() == thePrefix)
  +		{
  +			return &*theCurrent;
  +		}
  +		else
  +		{
  +			++theCurrent;
  +		}
  +	}
  +
  +	return 0;
  +}
  +
  +template<class VectorType>
  +VectorType::value_type*
  +findByPrefixNonConst(
  +			VectorType&				theVector,
  +			const XalanDOMString&	thePrefix)
  +{
  +	return findByPrefix(theVector, thePrefix);
  +}
  +
  +#endif
  +
  +
  +template<class VectorType>
  +const VectorType::value_type*
  +findByURI(
  +			const VectorType&		theVector,
  +			const XalanDOMString&	theNamespaceURI)
  +{
  +	const VectorType::const_iterator	theEnd(theVector.end());
  +	VectorType::const_iterator			theCurrent(theVector.begin());
  +
  +	while(theCurrent != theEnd)
  +	{
  +		if ((*theCurrent).getURI() == theNamespaceURI)
  +		{
  +			return &*theCurrent;
  +		}
  +		else
  +		{
  +			++theCurrent;
  +		}
  +	}
  +
  +	return 0;
  +}
  +
  +
  +
  +template<class VectorType>
  +bool
  +addByPrefix(
  +			StylesheetConstructionContext&	theConstructionContext,
  +			VectorType&						theVector,
  +			const XalanDOMString&			thePrefix,
  +			const XalanDOMString&			theURI)
  +{
  +	const VectorType::value_type* const		theEntry =
  +		findByPrefix(theVector, thePrefix);
  +
  +	if (theEntry != 0)
  +	{
  +		return false;
  +	}
  +	else
  +	{
  +		theVector.push_back(
  +			VectorType::value_type(
  +				theConstructionContext.getPooledString(thePrefix),
  +				theConstructionContext.getPooledString(theURI)));
  +
  +		return true;
  +	}
  +}
  +
  +
  +
  +template<class VectorType>
  +bool
  +addOrUpdateByPrefix(
  +			StylesheetConstructionContext&	theConstructionContext,
  +			VectorType&						theVector,
  +			const XalanDOMString&			thePrefix,
  +			const XalanDOMString&			theURI)
  +{
  +	VectorType::value_type* const	theEntry =
  +		findByPrefixNonConst(theVector, thePrefix);
  +
  +	if (theEntry == 0)
  +	{
  +		theVector.push_back(
  +			VectorType::value_type(
  +				theConstructionContext.getPooledString(thePrefix),
  +				theConstructionContext.getPooledString(theURI)));
  +
  +		return true;
  +	}
  +	else
  +	{
  +		if (theEntry->getURI() == theURI)
  +		{
  +			return false;
  +		}
  +		else
  +		{
  +			theEntry->setURI(theConstructionContext.getPooledString(theURI));
  +
  +			return true;
  +		}
  +	}
  +}
  +
  +
  +
  +template<class VectorType>
  +const XalanDOMString*
  +findNamespace(
  +			const VectorType&		theVector,
  +			const XalanDOMString&	thePrefix)
  +{
  +	const VectorType::value_type* const		theEntry =
  +		findByPrefix(theVector, thePrefix);
  +
  +	if (theEntry == 0)
  +	{
  +		return 0;
  +	}
  +	else
  +	{
  +		return &theEntry->getURI();
  +	}
  +}
  +
  +
  +
   const XalanDOMString		NamespacesHandler::Namespace::s_emptyString;
   
   
  @@ -143,22 +345,22 @@
   					theXSLTNamespaceURI,
   					theURI) == false)
   			{
  -				if (m_namespaceDeclarations.count(&thePrefix) == 0)
  -				{
  -					m_namespaceDeclarations.insert(
  -						NamespacesMapType::value_type(
  -							&theConstructionContext.getPooledString(thePrefix),
  -							Namespace(
  -								theConstructionContext.getPooledString(theNamespace.getPrefix()),
  -								theConstructionContext.getPooledString(theNamespace.getURI()))));
  -				}
  +				addByPrefix(
  +					theConstructionContext,
  +					m_namespaceDeclarations,
  +					thePrefix,
  +					theURI);
   			}
   			else
   			{
  -				m_excludedResultPrefixes.insert(
  -					ExcludedResultPrefixesMapType::value_type(
  -						&theConstructionContext.getPooledString(thePrefix),
  -						&theConstructionContext.getPooledString(theURI)));
  +				addByPrefix(
  +					theConstructionContext,
  +					m_excludedResultPrefixes,
  +					thePrefix,
  +					theURI);
  +
  +				assert(findByPrefix(m_excludedResultPrefixes, thePrefix) != 0 &&
  +					   findByPrefix(m_excludedResultPrefixes, thePrefix)->getURI() == theURI);
   			}
   		}
   	}
  @@ -185,28 +387,16 @@
   const XalanDOMString*
   NamespacesHandler::getNamespace(const XalanDOMString&	thePrefix) const
   {
  -	// Check the excluded result prefixes first...
  -	const ExcludedResultPrefixesMapType::const_iterator		i =
  -			m_excludedResultPrefixes.find(&thePrefix);
  +	const NamespacesVectorType::value_type*		theNamespace =
  +		findByPrefix(m_excludedResultPrefixes, thePrefix);
   
  -	if (i != m_excludedResultPrefixes.end())
  +	if (theNamespace != 0)
   	{
  -		return (*i).second;
  +		return &theNamespace->getURI();
   	}
   	else
   	{
  -		// Not found, so check the namespace declarations...
  -		const NamespacesMapType::const_iterator		i =
  -				m_namespaceDeclarations.find(&thePrefix);
  -
  -		if (i != m_namespaceDeclarations.end())
  -		{
  -			return &(*i).second.getURI();
  -		}
  -		else
  -		{
  -			return 0;
  -		}
  +		return findNamespace(m_namespaceDeclarations, thePrefix);
   	}
   }
   
  @@ -282,16 +472,22 @@
   			::clear(thePrefix);
   		}
   
  -		const XalanDOMString* const		theNamespace =
  +		const XalanDOMString* const		theNamespaceURI =
   			XalanQName::getNamespaceForPrefix(theCurrentNamespaces, thePrefix);
   
  -		if(theNamespace == 0)
  +		if(theNamespaceURI == 0)
   		{
   			theConstructionContext.error("Undeclared prefix in exclude-result-prefixes");
   		}
   
  -		m_excludedResultPrefixes[&theConstructionContext.getPooledString(thePrefix)] =
  -			&theConstructionContext.getPooledString(*theNamespace);
  +		addOrUpdateByPrefix(
  +			theConstructionContext,
  +			m_excludedResultPrefixes,
  +			thePrefix,
  +			*theNamespaceURI);
  +
  +		assert(findByPrefix(m_excludedResultPrefixes, thePrefix) != 0 &&
  +			   findByPrefix(m_excludedResultPrefixes, thePrefix)->getURI() == *theNamespaceURI);
       }
   }
   
  @@ -436,17 +632,17 @@
   	// Write out the namespace declarations...
   	if (m_namespaceDeclarations.empty() == false)
   	{
  -		const NamespacesMapType::const_iterator	theEnd =
  +		const NamespaceExtendedVectorType::const_iterator	theEnd =
   				m_namespaceDeclarations.end();
   
  -		NamespacesMapType::const_iterator	i =
  +		NamespaceExtendedVectorType::const_iterator	i =
   				m_namespaceDeclarations.begin();
   
   		for(; i != theEnd; ++i)
   		{
  -			const Namespace&		theNamespace = (*i).second;
  +			const NamespaceExtended&	theNamespace = *i;
   
  -			const XalanDOMString&	thePrefix = theNamespace.getPrefix();
  +			const XalanDOMString&		thePrefix = theNamespace.getPrefix();
   
   			// If we're not supposed to suppress the default namespace, or
   			// there's a prefix (so it's not the default), we can continue
  @@ -474,7 +670,7 @@
   }
   
   
  -
  +#if 0
   bool
   NamespacesHandler::shouldExcludeResultNamespaceNode(
   			const XalanDOMString&		theXSLTNamespaceURI,
  @@ -492,33 +688,13 @@
   		return stylesheetNamespacesHandler.isExcludedNamespaceURI(theURI);
   	}
   }
  -
  +#endif
   
   
   bool
   NamespacesHandler::isExcludedNamespaceURI(const XalanDOMString&		theNamespaceURI) const
   {
  -	ExcludedResultPrefixesMapType::const_iterator		i =
  -			m_excludedResultPrefixes.begin();
  -
  -	const ExcludedResultPrefixesMapType::const_iterator		theEnd =
  -			m_excludedResultPrefixes.end();
  -
  -	while(i != theEnd)
  -	{
  -		assert((*i).second != 0);
  -
  -		if (equals(*(*i).second, theNamespaceURI) == true)
  -		{
  -			return true;
  -		}
  -		else
  -		{
  -			++i;
  -		}
  -	}
  -
  -	return false;
  +	return findByURI(m_excludedResultPrefixes, theNamespaceURI) != 0 ? true : false; 
   }
   
   
  @@ -586,17 +762,17 @@
   	// This is more efficient if the stylesheet is used multiple times.
   	if (m_namespaceDeclarations.empty() == false)
   	{
  -		const NamespacesMapType::iterator	theEnd =
  +		const NamespaceExtendedVectorType::iterator	theEnd =
   				m_namespaceDeclarations.end();
   
  -		NamespacesMapType::iterator		i =
  +		NamespaceExtendedVectorType::iterator		i =
   				m_namespaceDeclarations.begin();
   
   		XalanDOMString	theName;
   
   		for(; i != theEnd; ++i)
   		{
  -			Namespace&				theNamespace = (*i).second;
  +			NamespaceExtended&		theNamespace = *i;
   
   			const XalanDOMString&	thePrefix = theNamespace.getPrefix();
   
  @@ -631,27 +807,13 @@
   {
   	if (m_excludedResultPrefixes.empty() == false)
   	{
  -#if defined(XALAN_NO_NAMESPACES)
  -	typedef vector<NamespacesMapType::iterator> 		IteratorVectorType;
  -#else
  -	typedef std::vector<NamespacesMapType::iterator> 	IteratorVectorType;
  -#endif
  -
  -		// This vector will hold all of the iterators that we need to erase...
  -		IteratorVectorType	theDeadEntries;
  -
  -		theDeadEntries.reserve(m_excludedResultPrefixes.size());
  -
  -		const NamespacesMapType::iterator	theEnd =
  -				m_namespaceDeclarations.end();
  -
  -		NamespacesMapType::iterator		i =
  +		NamespaceExtendedVectorType::iterator		i =
   				m_namespaceDeclarations.begin();
   
   		// Check for any result prefixes we should exclude...
  -		while(i != theEnd)
  +		while(i != m_namespaceDeclarations.end())
   		{
  -			const Namespace&		theNamespace = (*i).second;
  +			const Namespace&		theNamespace = *i;
   
   			const XalanDOMString&	thePrefix = theNamespace.getPrefix();
   			const XalanDOMString&	theURI = theNamespace.getURI();
  @@ -663,24 +825,19 @@
   				(isExcludedNamespaceURI(theURI) == true ||
   				 isExtensionNamespaceURI(theURI) == true))
   			{
  -				// It's excluded, so remove it...
  -				theDeadEntries.push_back(i);
  -
   				// Add it to the excluded prefixes, in case we need it later...
  -				m_excludedResultPrefixes.insert(
  -						ExcludedResultPrefixesMapType::value_type(
  -							&theConstructionContext.getPooledString(thePrefix),
  -							&theConstructionContext.getPooledString(theURI)));
  -			}
  -
  -			++i;
  -		}
  +				m_excludedResultPrefixes.push_back(
  +						NamespacesVectorType::value_type(
  +							theConstructionContext.getPooledString(thePrefix),
  +							theConstructionContext.getPooledString(theURI)));
   
  -		while(theDeadEntries.empty() == false)
  -		{
  -			m_namespaceDeclarations.erase(theDeadEntries.back());
  -
  -			theDeadEntries.pop_back();
  +				// It's excluded, so remove it...
  +				i = m_namespaceDeclarations.erase(i);
  +			}
  +			else
  +			{
  +				++i;
  +			}
   		}
   	}
   }
  @@ -692,17 +849,17 @@
   {
   	if (m_namespaceDeclarations.empty() == false)
   	{
  -		const NamespacesMapType::iterator	theEnd =
  +		const NamespaceExtendedVectorType::iterator		theEnd =
   				m_namespaceDeclarations.end();
   
  -		NamespacesMapType::iterator		i =
  +		NamespaceExtendedVectorType::iterator	i =
   				m_namespaceDeclarations.begin();
   
   		// Look at everyone of my namespaces for an alias, and substitute the
   		// alias as appropriate...
   		for(; i != theEnd; ++i)
   		{
  -			Namespace&	theNamespace = (*i).second;
  +			Namespace&	theNamespace = *i;
   
   			const XalanDOMString&			theURI =
   						theNamespace.getURI();
  @@ -788,7 +945,7 @@
   
   
   void
  -NamespacesHandler::copyExcludeResultPrefixes(const ExcludedResultPrefixesMapType&	theExcludeResultPrefixes)
  +NamespacesHandler::copyExcludeResultPrefixes(const NamespacesVectorType&	theExcludeResultPrefixes)
   {
   	if (theExcludeResultPrefixes.empty() == false)
   	{
  @@ -798,16 +955,19 @@
   		}
   		else
   		{
  -			const ExcludedResultPrefixesMapType::const_iterator	theEnd =
  +			const NamespacesVectorType::const_iterator	theEnd =
   					theExcludeResultPrefixes.end();
   
  -			ExcludedResultPrefixesMapType::const_iterator	i =
  +			NamespacesVectorType::const_iterator	i =
   					theExcludeResultPrefixes.begin();
   
   			// Add them in...
   			while(i != theEnd)
   			{
  -				m_excludedResultPrefixes.insert(*i);
  +				if (findByPrefix(m_excludedResultPrefixes, (*i).getPrefix()) == 0)
  +				{
  +					m_excludedResultPrefixes.push_back(*i);
  +				}
   
   				++i;
   			}
  
  
  
  1.16      +47 -17    xml-xalan/c/src/XSLT/NamespacesHandler.hpp
  
  Index: NamespacesHandler.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/NamespacesHandler.hpp,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- NamespacesHandler.hpp	12 Nov 2002 02:32:29 -0000	1.15
  +++ NamespacesHandler.hpp	13 Nov 2002 02:29:44 -0000	1.16
  @@ -111,8 +111,7 @@
   
   		Namespace() :
   			m_prefix(&s_emptyString),
  -			m_uri(&s_emptyString),
  -			m_resultAttributeName(&s_emptyString)
  +			m_uri(&s_emptyString)
   		{
   		}
   
  @@ -120,8 +119,7 @@
   					const XalanDOMString&	prefix,
   					const XalanDOMString&	uri) :
   			m_prefix(&prefix),
  -			m_uri(&uri),
  -			m_resultAttributeName(&s_emptyString)
  +			m_uri(&uri)
   		{
   		}
   
  @@ -173,6 +171,35 @@
   			m_uri = &uri;
   		}
   
  +	protected:
  +
  +		static const XalanDOMString		s_emptyString;
  +
  +	private:
  +
  +		const XalanDOMString*	m_prefix;
  +
  +		const XalanDOMString*	m_uri;
  +	};
  +
  +	class NamespaceExtended : public Namespace
  +	{
  +	public:
  +
  +		NamespaceExtended() :
  +			Namespace(),
  +			m_resultAttributeName(&s_emptyString)
  +		{
  +		}
  +
  +		NamespaceExtended(
  +					const XalanDOMString&	prefix,
  +					const XalanDOMString&	uri) :
  +			Namespace(prefix, uri),
  +			m_resultAttributeName(&s_emptyString)
  +		{
  +		}
  +
   		/**
   		 * Retrieve the name of the result attribute.
   		 * 
  @@ -199,25 +226,23 @@
   
   	private:
   
  -		const XalanDOMString*	m_prefix;
  -
  -		const XalanDOMString*	m_uri;
  -
   		const XalanDOMString*	m_resultAttributeName;
  -
  -		static const XalanDOMString		s_emptyString;
   	};
   
   	typedef XalanQName::NamespaceVectorType				NamespaceVectorType;
   	typedef XalanQName::NamespacesStackType				NamespacesStackType;
   
   #if defined(XALAN_NO_NAMESPACES)
  +	typedef vector<Namespace>							NamespacesVectorType;
  +
  +	typedef vector<NamespaceExtended>					NamespaceExtendedVectorType;
  +
   	typedef map<const XalanDOMString*,
   				const XalanDOMString*,
   				DOMStringPointerLessThanFunction>		ExcludedResultPrefixesMapType;
   
   	typedef map<const XalanDOMString*,
  -				Namespace,
  +				NamespaceExtended,
   				DOMStringPointerLessThanFunction>		NamespacesMapType;
   
   	typedef map<const XalanDOMString*,
  @@ -226,12 +251,16 @@
   
   	typedef vector<const XalanDOMString*>				XalanDOMStringPointerVectorType;
   #else
  +	typedef std::vector<Namespace>						NamespacesVectorType;
  +
  +	typedef std::vector<NamespaceExtended>				NamespaceExtendedVectorType;
  +
   	typedef std::map<const XalanDOMString*,
   					 const XalanDOMString*,
   					 DOMStringPointerLessThanFunction>	ExcludedResultPrefixesMapType;
   
   	typedef std::map<const XalanDOMString*,
  -					 Namespace,
  +					 NamespaceExtended,
   					 DOMStringPointerLessThanFunction>	NamespacesMapType;
   
   	typedef std::map<const XalanDOMString*,
  @@ -449,12 +478,12 @@
   	copyExtensionNamespaceURIs(const XalanDOMStringPointerVectorType&	theExtensionNamespaceURIs);
   
   	/**
  -	 * Copy the contents of the supplied map
  +	 * Copy the contents of the supplied vector
   	 *
  -	 * @param theExcludeResultPrefixes The map to copy.
  +	 * @param theExcludeResultPrefixes The vector to copy.
   	 */
   	void
  -	copyExcludeResultPrefixes(const ExcludedResultPrefixesMapType&	theExcludeResultPrefixes);
  +	copyExcludeResultPrefixes(const NamespacesVectorType&	theExcludeResultPrefixes);
   
   	/**
   	 * Determine if a given namespace should be excluded.  For use during
  @@ -509,10 +538,11 @@
   	bool
   	operator==(const NamespacesHandler&) const;
   
  +
   	// Data members...
  -	ExcludedResultPrefixesMapType		m_excludedResultPrefixes;
  +	NamespacesVectorType				m_excludedResultPrefixes;
   
  -	NamespacesMapType					m_namespaceDeclarations;
  +	NamespaceExtendedVectorType			m_namespaceDeclarations;
   
   	XalanDOMStringPointerVectorType		m_extensionNamespaceURIs;
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org