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/08/15 02:44:01 UTC

cvs commit: xml-xalan/c/src/ICUBridge ICUBridgeCollationCompareFunctorImpl.cpp ICUBridgeCollationCompareFunctorImpl.hpp

dbertoni    2002/08/14 17:44:01

  Modified:    c/src/ICUBridge ICUBridgeCollationCompareFunctorImpl.cpp
                        ICUBridgeCollationCompareFunctorImpl.hpp
  Log:
  Vastly simplified cache.
  
  Revision  Changes    Path
  1.4       +19 -38    xml-xalan/c/src/ICUBridge/ICUBridgeCollationCompareFunctorImpl.cpp
  
  Index: ICUBridgeCollationCompareFunctorImpl.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/ICUBridge/ICUBridgeCollationCompareFunctorImpl.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ICUBridgeCollationCompareFunctorImpl.cpp	12 Aug 2002 03:54:43 -0000	1.3
  +++ ICUBridgeCollationCompareFunctorImpl.cpp	15 Aug 2002 00:44:01 -0000	1.4
  @@ -434,14 +434,14 @@
   	using std::find_if;
   #endif
   
  -	CollatorCacheDequeType&		theNonConstCache =
  +	CollatorCacheListType&		theNonConstCache =
   #if defined(XALAN_NO_MUTABLE)
  -		(CollatorCacheDequeType*)m_collatorCache;
  +		(CollatorCacheListType*)m_collatorCache;
   #else
   		m_collatorCache;
   #endif
   
  -	CollatorCacheDequeType::iterator	i =
  +	CollatorCacheListType::iterator	i =
   		find_if(
   			theNonConstCache.begin(),
   			theNonConstCache.end(),
  @@ -456,7 +456,7 @@
   		// Let's do a quick check to see if we found the first entry.
   		// If so, we don't have to update the cache, so just return the
   		// appropriate value...
  -		const CollatorCacheDequeType::iterator	theBegin =
  +		const CollatorCacheListType::iterator	theBegin =
   			theNonConstCache.begin();
   
   		if (i == theBegin)
  @@ -465,35 +465,14 @@
   		}
   		else
   		{
  -			// Make a new instance for the cache, then swap it with
  -			// the one we found.
  -			CollatorCacheDequeType::value_type	theEntry;
  -
  -			theEntry.swap(*i);
  -
  -			// Protect the collator instance, since what we're doing
  -			// might throw an exception...
  -			XalanAutoPtr<CollatorType>	theCollator(theEntry.m_collator);
  -
  -			// OK, now swap everything from i down to begin()...
  -			
  -			CollatorCacheDequeType::iterator	theOther(i);
  -
  -			do
  -			{
  -				--theOther;
  -
  -				(*i).swap(*theOther);
  -
  -				--i;
  -			}
  -			while(i != theBegin);
  -
  -			// Now, swap the latest one into the front...
  -			theEntry.swap(*theBegin);
  -			
  -			// Everything's OK, so release to return the value...
  -			return theCollator.release();
  +			// Save the collator, because splice() may invalidate
  +			// i.
  +			CollatorType* const		theCollator = (*i).m_collator;
  +
  +			// Move the entry to the beginning the cache
  +			theNonConstCache.splice(theBegin, theNonConstCache, i);
  +
  +			return theCollator;
   		}
   	}
   }
  @@ -508,23 +487,25 @@
   	assert(theCollator != 0);
   	assert(theLocale != 0);
   
  -	CollatorCacheDequeType&		theNonConstCache =
  +	CollatorCacheListType&		theNonConstCache =
   #if defined(XALAN_NO_MUTABLE)
  -		(CollatorCacheDequeType*)m_collatorCache;
  +		(CollatorCacheListType*)m_collatorCache;
   #else
   		m_collatorCache;
   #endif
   
  +	// Is the cache full?
   	if (theNonConstCache.size() == eCacheMax)
   	{
  -		delete theNonConstCache.back().m_collator;
  +		// Yes, so guard the collator instance, in case pop_back() throws...
  +		XalanAutoPtr<CollatorType>	theCollatorGuard(theNonConstCache.back().m_collator);
   
   		theNonConstCache.pop_back();
   	}
   
  -	theNonConstCache.push_front(CollatorCacheDequeType::value_type());
  +	theNonConstCache.push_front(CollatorCacheListType::value_type());
   
  -	CollatorCacheDequeType::value_type&		theEntry = 
  +	CollatorCacheListType::value_type&		theEntry = 
   		theNonConstCache.front();
   
   	// Set the locale first, since that might throw an exception...
  
  
  
  1.4       +4 -4      xml-xalan/c/src/ICUBridge/ICUBridgeCollationCompareFunctorImpl.hpp
  
  Index: ICUBridgeCollationCompareFunctorImpl.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/ICUBridge/ICUBridgeCollationCompareFunctorImpl.hpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ICUBridgeCollationCompareFunctorImpl.hpp	12 Aug 2002 03:54:43 -0000	1.3
  +++ ICUBridgeCollationCompareFunctorImpl.hpp	15 Aug 2002 00:44:01 -0000	1.4
  @@ -64,7 +64,7 @@
   
   
   
  -#include <deque>
  +#include <list>
   
   
   
  @@ -177,9 +177,9 @@
   	};
   
   #if defined(XALAN_NO_NAMESPACES)
  -	typedef deque<CollationCacheStruct>			CollatorCacheDequeType;
  +	typedef list<CollationCacheStruct>			CollatorCacheListType;
   #else
  -	typedef std::deque<CollationCacheStruct>	CollatorCacheDequeType;
  +	typedef std::list<CollationCacheStruct>		CollatorCacheListType;
   #endif
   
   	enum { eCacheMax = 10 };
  @@ -236,7 +236,7 @@
   
   	bool							m_cacheCollators;
   
  -	mutable CollatorCacheDequeType	m_collatorCache;
  +	mutable CollatorCacheListType	m_collatorCache;
   
   	const static StylesheetExecutionContextDefault::DefaultCollationCompareFunctor	s_defaultFunctor;
   };
  
  
  

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