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 2001/04/27 21:19:27 UTC

cvs commit: xml-xalan/c/src/PlatformSupport XalanDOMStringPool.cpp XalanDOMStringPool.hpp

dbertoni    01/04/27 12:19:27

  Modified:    c/src/PlatformSupport XalanDOMStringPool.cpp
                        XalanDOMStringPool.hpp
  Log:
  Improve insertion speed of keys.
  
  Revision  Changes    Path
  1.8       +18 -10    xml-xalan/c/src/PlatformSupport/XalanDOMStringPool.cpp
  
  Index: XalanDOMStringPool.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/PlatformSupport/XalanDOMStringPool.cpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- XalanDOMStringPool.cpp	2001/04/13 01:48:05	1.7
  +++ XalanDOMStringPool.cpp	2001/04/27 19:19:26	1.8
  @@ -166,14 +166,24 @@
   	{
   		const unsigned int	theActualLength = theLength == unsigned(-1) ? length(theString) : theLength;
   
  -		// Find the string...
  -		const IndexMapType::const_iterator	i =
  -			m_index.find(IndexMapType::key_type(theString, theActualLength));
  +#if defined(XALAN_NO_NAMESPACES)
  +		typedef pair<IndexMapType::iterator, bool>			InsertPairType;
  +#else
  +		typedef std::pair<IndexMapType::iterator, bool>		InsertPairType;
  +#endif
   
  -		if (i != m_index.end())
  +		// Insert an entry into the index map.
  +		InsertPairType	i =
  +			m_index.insert(
  +				IndexMapType::value_type(
  +					IndexMapType::key_type(theString, theActualLength),
  +					0));
  +
  +		// Was it added?
  +		if (i.second == false)
   		{
   			// Already there, so return it...
  -			return *(*i).second;
  +			return *(*(i.first)).second;
   		}
   		else
   		{
  @@ -187,11 +197,9 @@
   
   			assert(theActualLength == length(theNewString));
   
  -			// Add an index entry...
  -			m_index.insert(
  -				IndexMapType::value_type(
  -					IndexMapType::key_type(toCharArray(theNewString), theActualLength),
  -					&theNewString));
  +			// Update the index entry that we just inserted...
  +			(*(i.first)).second = &theNewString;
  +			(*(i.first)).first.changePointer(toCharArray(theNewString));
   
   			assert(m_strings.size() == m_index.size());
   
  
  
  
  1.7       +29 -2     xml-xalan/c/src/PlatformSupport/XalanDOMStringPool.hpp
  
  Index: XalanDOMStringPool.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/PlatformSupport/XalanDOMStringPool.hpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- XalanDOMStringPool.hpp	2001/04/11 02:14:08	1.6
  +++ XalanDOMStringPool.hpp	2001/04/27 19:19:26	1.7
  @@ -99,11 +99,38 @@
   		bool
   		operator<(const StringKey&	theRHS) const;
   
  +		/*
  +		 * OK, this is a really big hack.  The problem is that we index
  +		 * the strings in the pool by const XalanDOMChar* which are not
  +		 * necessarily null-terminated.  An added problem is that is too
  +		 * inefficient to search the map for the string, then add it if it
  +		 * wasn't found.  Instead, we want to insert a new entry in the
  +		 * map, then figure out from the result of the insert whether or
  +		 * not the entry was found.  This call allows us to change the
  +		 * pointer for the key to the persistent pointer from the new
  +		 * string that we created, instead of the pointer that was passed
  +		 * into the call, which is not persistent.  This won't screw up
  +		 * the map since the map is ordered on the _value_ of the string
  +		 * and not the pointer itself.
  +		 *
  +		 * @param theNewPointer The new pointer value to use for the key.
  +		 */
  +		void
  +		changePointer(const XalanDOMChar*	theNewPointer) const
  +		{
  +			assert(theNewPointer != 0 && equals(theNewPointer, m_string, m_length));
  +#if defined(XALAN_NO_MUTABLE)
  +			((StringKey*)this)->m_string = theNewPointer;
  +#else
  +			m_string = theNewPointer;
  +#endif
  +		}
  +
   	private:
   
  -		const XalanDOMChar*		m_string;
  +		mutable const XalanDOMChar*		m_string;
   
  -		unsigned int			m_length;
  +		unsigned int					m_length;
   	};
   
   #if defined(XALAN_NO_NAMESPACES)
  
  
  

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