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/05/10 19:46:39 UTC

cvs commit: xml-xalan/c/src/Include XalanObjectCache.hpp

dbertoni    01/05/10 10:46:38

  Modified:    c/src/Include XalanObjectCache.hpp
  Log:
  Add #ifdef to avoid tracking objects.
  
  Revision  Changes    Path
  1.4       +201 -37   xml-xalan/c/src/Include/XalanObjectCache.hpp
  
  Index: XalanObjectCache.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/Include/XalanObjectCache.hpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XalanObjectCache.hpp	2001/04/30 21:21:09	1.3
  +++ XalanObjectCache.hpp	2001/05/10 17:46:34	1.4
  @@ -70,6 +70,59 @@
   
   
   template<class ObjectType>
  +class DefaultCacheCreateFunctor
  +{
  +public:
  +
  +	ObjectType*
  +	operator()() const
  +	{
  +		return new ObjectType;
  +	}
  +};
  +
  +
  +
  +template<class ObjectType>
  +class DefaultCacheResetFunctor
  +{
  +public:
  +
  +	void
  +	operator()(ObjectType*) const
  +	{
  +	}
  +};
  +
  +
  +
  +template<class ObjectType>
  +class ClearCacheResetFunctor
  +{
  +public:
  +
  +	void
  +	operator()(ObjectType*	theInstance) const
  +	{
  +		theInstance->clear();
  +	}
  +};
  +
  +
  +
  +#if defined(XALAN_OBJECT_CACHE_KEEP_BUSY_LIST)
  +
  +template<
  +class ObjectType,
  +#if defined(XALAN_NO_DEFAULT_TEMPLATE_ARGUMENTS)
  +class CreateFunctorType,
  +class DeleteFunctorType,
  +class ResetFunctorType>
  +#else
  +class CreateFunctorType = DefaultCacheCreateFunctor<ObjectType>,
  +class DeleteFunctorType = DeleteFunctor<ObjectType>,
  +class ResetFunctorType = DefaultCacheResetFunctor<ObjectType> >
  +#endif
   class XalanObjectCache
   {
   public:
  @@ -80,14 +133,18 @@
   	typedef std::vector<ObjectType*>	VectorType;
   #endif
   
  +	typedef ObjectType	CacheObjectType;
  +
   	explicit
  -	XalanObjectCache() :
  +	XalanObjectCache(unsigned int	initialListSize = 0) :
   		m_availableList(),
   		m_busyList()
   	{
  +		m_availableList.reserve(initialListSize);
  +
  +		m_busyList.reserve(initialListSize);
   	}
   
  -	virtual
   	~XalanObjectCache()
   	{
   		reset();
  @@ -97,9 +154,9 @@
   #endif
   
   		for_each(
  -			m_availableList.begin(),
  -			m_availableList.end(),
  -			DeleteFunctor<ObjectType>());
  +				m_availableList.begin(),
  +				m_availableList.end(),
  +				m_deleteFunctor);
   	}
   
   	ObjectType*
  @@ -109,11 +166,11 @@
   		// that's the cheapest thing.
   		if (m_availableList.size() == 0)
   		{
  -			XalanAutoPtr<ObjectType>	theNewObject(create());
  +			ObjectType* const	theNewObject = m_createFunctor();
   
  -			m_busyList.push_back(theNewObject.get());
  +			m_busyList.push_back(theNewObject);
   
  -			return theNewObject.release();
  +			return theNewObject;
   		}
   		else
   		{
  @@ -148,6 +205,8 @@
   		}
   		else
   		{
  +			m_resetFunctor(theInstance);
  +
   			m_availableList.push_back(theInstance);
   
   			m_busyList.erase(i);
  @@ -156,14 +215,14 @@
   		}
   	}
   
  -	virtual void
  +	void
   	reset()
   	{
   		while (m_busyList.size() != 0)
   		{
   			ObjectType* const	theInstance = m_busyList.back();
   
  -			resetInstance(theInstance);
  +			m_resetFunctor(theInstance);
   
   			m_availableList.push_back(theInstance);
   
  @@ -171,40 +230,146 @@
   		}
   	}
   
  -protected:
  +	// Functors for various operations...
  +	CreateFunctorType	m_createFunctor;
   
  -	virtual ObjectType*
  -	create() = 0;
  +	DeleteFunctorType	m_deleteFunctor;
   
  -	virtual void
  -	resetInstance(ObjectType*	/* theInstance */)
  -	{
  -	}
  +	ResetFunctorType	m_resetFunctor;
   
   private:
   
   	// There are not defined...
  -	XalanObjectCache(const XalanObjectCache<ObjectType>&	theRHS);
  +	XalanObjectCache(const XalanObjectCache<ObjectType, CreateFunctorType, DeleteFunctorType, ResetFunctorType>&	theRHS);
   
  -	XalanObjectCache<ObjectType>&
  -	operator=(const XalanObjectCache<ObjectType>&	theRHS);
  +	XalanObjectCache<ObjectType, CreateFunctorType, DeleteFunctorType, ResetFunctorType>&
  +	operator=(const XalanObjectCache<ObjectType, CreateFunctorType, DeleteFunctorType, ResetFunctorType>&	theRHS);
   
   
  -	// Data members
  -	VectorType	m_availableList;
  +	// Data members...
  +	VectorType			m_availableList;
   
  -	VectorType	m_busyList;
  +	VectorType			m_busyList;
   };
   
   
  -template<class ObjectType>
  +
  +#else
  +
  +
  +
  +template<
  +class ObjectType,
  +#if defined(XALAN_NO_DEFAULT_TEMPLATE_ARGUMENTS)
  +class CreateFunctorType,
  +class DeleteFunctorType,
  +class ResetFunctorType>
  +#else
  +class CreateFunctorType = DefaultCacheCreateFunctor<ObjectType>,
  +class DeleteFunctorType = DeleteFunctor<ObjectType>,
  +class ResetFunctorType = DefaultCacheResetFunctor<ObjectType> >
  +#endif
  +class XalanObjectCache
  +{
  +public:
  +
  +#if defined(XALAN_NO_NAMESPACES)
  +	typedef vector<ObjectType*>			VectorType;
  +#else
  +	typedef std::vector<ObjectType*>	VectorType;
  +#endif
  +
  +	typedef ObjectType	CacheObjectType;
  +
  +	explicit
  +	XalanObjectCache(unsigned int	initialListSize = 0) :
  +		m_availableList()
  +	{
  +		m_availableList.reserve(initialListSize);
  +	}
  +
  +	~XalanObjectCache()
  +	{
  +		reset();
  +
  +#if !defined(XALAN_NO_NAMESPACES)
  +		using std::for_each;
  +#endif
  +
  +		for_each(
  +				m_availableList.begin(),
  +				m_availableList.end(),
  +				m_deleteFunctor);
  +	}
  +
  +	ObjectType*
  +	get()
  +	{
  +		// We'll always return the back of the free list, since
  +		// that's the cheapest thing.
  +		if (m_availableList.size() == 0)
  +		{
  +			return m_createFunctor();
  +		}
  +		else
  +		{
  +			ObjectType* const	theObject = m_availableList.back();
  +
  +			m_availableList.pop_back();
  +
  +			return theObject;
  +		}
  +	}
  +
  +	bool
  +	release(ObjectType*		theInstance)
  +	{
  +		m_resetFunctor(theInstance);
  +
  +		m_availableList.push_back(theInstance);
  +
  +		return true;
  +	}
  +
  +	void
  +	reset()
  +	{
  +	}
  +
  +	// Functors for various operations...
  +	CreateFunctorType	m_createFunctor;
  +
  +	DeleteFunctorType	m_deleteFunctor;
  +
  +	ResetFunctorType	m_resetFunctor;
  +
  +private:
  +
  +	// These are not defined...
  +	XalanObjectCache(const XalanObjectCache<ObjectType, CreateFunctorType, DeleteFunctorType, ResetFunctorType>&	theRHS);
  +
  +	XalanObjectCache<ObjectType, CreateFunctorType, DeleteFunctorType, ResetFunctorType>&
  +	operator=(const XalanObjectCache<ObjectType, CreateFunctorType, DeleteFunctorType, ResetFunctorType>&	theRHS);
  +
  +
  +	// Data members...
  +	VectorType			m_availableList;
  +};
  +
  +
  +
  +#endif
  +
  +
  +
  +template<class XalanObjectCacheType>
   class GetReleaseCachedObject
   {
   public:
   
  -	typedef XalanObjectCache<ObjectType>	CacheType;
  +	typedef typename XalanObjectCacheType::CacheObjectType	CacheObjectType;
   
  -	GetReleaseCachedObject(CacheType&	theCache) :
  +	GetReleaseCachedObject(XalanObjectCacheType&	theCache) :
   		m_cache(theCache),
   		m_cachedObject(theCache.get())
   	{
  @@ -215,7 +380,7 @@
   		m_cache.release(m_cachedObject);
   	}
   
  -	ObjectType*
  +	CacheObjectType*
   	get() const
   	{
   		return m_cachedObject;
  @@ -224,30 +389,29 @@
   private:
   
   	// Not implemented...
  -	GetReleaseCachedObject(const GetReleaseCachedObject<ObjectType>&);
  +	GetReleaseCachedObject(const GetReleaseCachedObject<XalanObjectCacheType>&);
   
   
   	// Data members...
  -	CacheType&			m_cache;
  +	XalanObjectCacheType&	m_cache;
   
  -	ObjectType* const	m_cachedObject;
  +	CacheObjectType* const	m_cachedObject;
   };
   
   
  +
   template<class ObjectType>
  -class XalanObjectCacheDefault : public XalanObjectCache<ObjectType>
  +class XalanObjectCacheDefault : public XalanObjectCache<ObjectType, DefaultCacheCreateFunctor<ObjectType>, DeleteFunctor<ObjectType>, DefaultCacheResetFunctor<ObjectType> >
   {
   public:
   
  -protected:
  +	typedef XalanObjectCache<ObjectType, DefaultCacheCreateFunctor<ObjectType>, DeleteFunctor<ObjectType>, DefaultCacheResetFunctor<ObjectType> >		BaseClassType;
   
  -	virtual ObjectType*
  -	create()
  +	explicit
  +	XalanObjectCacheDefault(unsigned int	initialListSize = 0) :
  +		BaseClassType(initialListSize)
   	{
  -		return new ObjectType;
   	}
  -
  -private:
   };
   
   
  
  
  

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