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/01/17 17:57:43 UTC

cvs commit: xml-xalan/c/src/XPath XNodeSet.cpp XNodeSet.hpp XObjectFactoryDefault.cpp XObjectFactoryDefault.hpp XPathExecutionContext.hpp

dbertoni    01/01/17 08:57:42

  Modified:    c/src/XPath XNodeSet.cpp XNodeSet.hpp
                        XObjectFactoryDefault.cpp XObjectFactoryDefault.hpp
                        XPathExecutionContext.hpp
  Log:
  Enable caching and re-use of XNodeSet instances.
  
  Revision  Changes    Path
  1.21      +28 -2     xml-xalan/c/src/XPath/XNodeSet.cpp
  
  Index: XNodeSet.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XNodeSet.cpp,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- XNodeSet.cpp	2001/01/16 02:32:39	1.20
  +++ XNodeSet.cpp	2001/01/17 16:57:32	1.21
  @@ -79,12 +79,16 @@
   
   
   
  +const double	theBogusNumberValue = 123456789;
  +
  +
  +
   XNodeSet::XNodeSet(BorrowReturnMutableNodeRefList&	value) :
   	XObject(eTypeNodeSet),
   	m_value(value),
   	m_resultTreeFrag(),
   	m_cachedStringValue(),
  -	m_cachedNumberValue(0.0)	
  +	m_cachedNumberValue(theBogusNumberValue)
   {
   }
   
  @@ -133,7 +137,7 @@
   double
   XNodeSet::num() const
   {
  -	if (m_cachedNumberValue == 0.0)
  +	if (DoubleSupport::equal(m_cachedNumberValue, theBogusNumberValue) == true)
   	{
   #if defined(XALAN_NO_MUTABLE)
   		((XNodeSet*)this)->m_cachedNumberValue = DoubleSupport::toDouble(str());
  @@ -228,4 +232,26 @@
   {
   	theCallbackObject.NodeSet(*this,
   							  nodeset());
  +}
  +
  +
  +
  +void
  +XNodeSet::release()
  +{
  +	m_value.release();
  +
  +	m_cachedNumberValue = theBogusNumberValue;
  +
  +	clear(m_cachedStringValue);
  +}
  +
  +
  +
  +void
  +XNodeSet::set(BorrowReturnMutableNodeRefList&	value)
  +{
  +	release();
  +
  +	m_value = value;
   }
  
  
  
  1.18      +15 -1     xml-xalan/c/src/XPath/XNodeSet.hpp
  
  Index: XNodeSet.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XNodeSet.hpp,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- XNodeSet.hpp	2001/01/16 02:32:39	1.17
  +++ XNodeSet.hpp	2001/01/17 16:57:34	1.18
  @@ -147,6 +147,20 @@
   	virtual void
   	ProcessXObjectTypeCallback(XObjectTypeCallback&		theCallbackObject) const;
   
  +	/**
  +	 * Release the node set held by the instance.
  +	 */
  +	void
  +	release();
  +
  +	/**
  +	 * Change the value of an XNodeSet
  +	 *
  +	 * @param theValue The new value.
  +	 */
  +	void
  +	set(BorrowReturnMutableNodeRefList&		value);
  +
   private:
   
   	// Not implemented...
  @@ -156,7 +170,7 @@
   	// Data members...
   
   
  -	const BorrowReturnMutableNodeRefList		m_value;
  +	BorrowReturnMutableNodeRefList				m_value;
   
   	mutable XalanAutoPtr<ResultTreeFragBase>	m_resultTreeFrag;
   
  
  
  
  1.20      +34 -5     xml-xalan/c/src/XPath/XObjectFactoryDefault.cpp
  
  Index: XObjectFactoryDefault.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XObjectFactoryDefault.cpp,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- XObjectFactoryDefault.cpp	2001/01/16 02:34:45	1.19
  +++ XObjectFactoryDefault.cpp	2001/01/17 16:57:35	1.20
  @@ -100,6 +100,7 @@
   	m_xtokenStringAdapterAllocator(theXStringBlockSize),
   	m_xobjects(),
   	m_xnumberCache(),
  +	m_xnodesetCache(),
   	m_XNull(new XNull)
   {
   }
  @@ -234,14 +235,25 @@
   
   	case XObject::eTypeNodeSet:
   		{
  -			XNodeSet* const	theXNodeSet =
  +			XNodeSet* const		theXNodeSet =
   #if defined(XALAN_OLD_STYLE_CASTS)
   				(XNodeSet*)theXObject;
   #else
   				static_cast<XNodeSet*>(theXObject);
   #endif
   
  -			bStatus = m_xnodesetAllocator.destroy(theXNodeSet);
  +			if (m_xnodesetCache.size() < eXNodeSetCacheMax)
  +			{
  +				theXNodeSet->release();
  +
  +				m_xnodesetCache.push_back(theXNodeSet);
  +
  +				bStatus = true;
  +			}
  +			else
  +			{
  +				bStatus = m_xnodesetAllocator.destroy(theXNodeSet);
  +			}
   		}
   		break;
   
  @@ -370,11 +382,26 @@
   const XObjectPtr
   XObjectFactoryDefault::createNodeSet(BorrowReturnMutableNodeRefList&	theValue)
   {
  -	XNodeSet* const		theXNodeSet = m_xnodesetAllocator.createNodeSet(theValue);
  +	if (m_xnodesetCache.size() > 0)
  +	{
  +		XNodeSet* const		theXObject = m_xnodesetCache.back();
   
  -	theXNodeSet->setFactory(this);
  +		m_xnodesetCache.pop_back();
   
  -	return XObjectPtr(theXNodeSet);
  +		theXObject->set(theValue);
  +
  +		return XObjectPtr(theXObject);
  +	}
  +	else
  +	{
  +		m_xnodesetCache.reserve(eXNodeSetCacheMax);
  +
  +		XNodeSet* const		theXObject = m_xnodesetAllocator.createNodeSet(theValue);
  +
  +		theXObject->setFactory(this);
  +
  +		return XObjectPtr(theXObject);
  +	}
   }
   
   
  @@ -503,4 +530,6 @@
   	m_xobjects.clear();
   
   	m_xnumberCache.clear();
  +
  +	m_xnodesetCache.clear();
   }
  
  
  
  1.19      +11 -7     xml-xalan/c/src/XPath/XObjectFactoryDefault.hpp
  
  Index: XObjectFactoryDefault.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XObjectFactoryDefault.hpp,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- XObjectFactoryDefault.hpp	2001/01/16 02:34:45	1.18
  +++ XObjectFactoryDefault.hpp	2001/01/17 16:57:36	1.19
  @@ -114,7 +114,9 @@
   		eDefaultXStringBlockSize = 10,
   		eDefaultXNumberBlockSize = 10,
   		eDefaultXNodeSetBlockSize = 10,
  -		eDefaultXResultTreeFragBlockSize = 10
  +		eDefaultXResultTreeFragBlockSize = 10,
  +		eXNumberCacheMax = 40,
  +		eXNodeSetCacheMax = 40
   	};
   	
   	/**
  @@ -188,11 +190,13 @@
   	createSpan(BorrowReturnMutableNodeRefList&	theValue);
   
   #if defined(XALAN_NO_NAMESPACES)
  -	typedef set<XObject*, less<XObject*> >		CollectionType;
  -	typedef vector<XNumber*>, less<XNumber*> >	XNumberCacheType;
  +	typedef set<XObject*, less<XObject*> >	CollectionType;
  +	typedef vector<XNumber*>				XNumberCacheType;
  +	typedef vector<XNodeSet*>				XNodeSetCacheType;
   #else
  -	typedef std::set<XObject*>					CollectionType;
  -	typedef std::vector<XNumber*>				XNumberCacheType;
  +	typedef std::set<XObject*>			CollectionType;
  +	typedef std::vector<XNumber*>		XNumberCacheType;
  +	typedef std::vector<XNodeSet*>		XNodeSetCacheType;
   #endif
   
   protected:
  @@ -204,8 +208,6 @@
   
   private:
   
  -	enum { eXNumberCacheMax = 40 };
  -
   	// Not implemented...
   	XObjectFactoryDefault(const XObjectFactoryDefault&);
   
  @@ -241,6 +243,8 @@
   	CollectionType					m_xobjects;
   
   	XNumberCacheType				m_xnumberCache;
  +
  +	XNodeSetCacheType				m_xnodesetCache;
   
   	const XalanAutoPtr<XNull>		m_XNull;
   };
  
  
  
  1.35      +36 -7     xml-xalan/c/src/XPath/XPathExecutionContext.hpp
  
  Index: XPathExecutionContext.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathExecutionContext.hpp,v
  retrieving revision 1.34
  retrieving revision 1.35
  diff -u -r1.34 -r1.35
  --- XPathExecutionContext.hpp	2001/01/16 02:34:46	1.34
  +++ XPathExecutionContext.hpp	2001/01/17 16:57:37	1.35
  @@ -353,7 +353,7 @@
   	public:
   
   		BorrowReturnMutableNodeRefList(XPathExecutionContext&	executionContext) :
  -			m_xpathExecutionContext(executionContext),
  +			m_xpathExecutionContext(&executionContext),
   			m_mutableNodeRefList(executionContext.borrowMutableNodeRefList())
   		{
   			assert(m_mutableNodeRefList != 0);
  @@ -371,15 +371,14 @@
   
   		~BorrowReturnMutableNodeRefList()
   		{
  -			if (m_mutableNodeRefList != 0)
  -			{
  -				m_xpathExecutionContext.returnMutableNodeRefList(m_mutableNodeRefList);
  -			}
  +			release();
   		}
   
   		MutableNodeRefList&
   		operator*() const
   		{
  +			assert(m_mutableNodeRefList != 0);
  +
   			return *m_mutableNodeRefList;
   		}
   
  @@ -395,19 +394,49 @@
   			return get();
   		}
   
  +		void
  +		release()
  +		{
  +			assert(m_xpathExecutionContext != 0);
  +
  +			if (m_mutableNodeRefList != 0)
  +			{
  +				m_xpathExecutionContext->returnMutableNodeRefList(m_mutableNodeRefList);
  +
  +				m_mutableNodeRefList = 0;
  +			}
  +		}
  +
   		BorrowReturnMutableNodeRefList
   		clone() const
   		{
  -			BorrowReturnMutableNodeRefList	theResult(m_xpathExecutionContext);
  +			assert(m_xpathExecutionContext != 0);
  +
  +			BorrowReturnMutableNodeRefList	theResult(*m_xpathExecutionContext);
   
   			*theResult = *m_mutableNodeRefList;
   
   			return theResult;
   		}
   
  +		// N.B. Non-const assignment operator semantics.
  +		BorrowReturnMutableNodeRefList&
  +		operator=(BorrowReturnMutableNodeRefList&	theRHS)
  +		{
  +			release();
  +
  +			m_xpathExecutionContext = theRHS.m_xpathExecutionContext;
  +
  +			m_mutableNodeRefList = theRHS.m_mutableNodeRefList;
  +
  +			theRHS.m_mutableNodeRefList = 0;
  +
  +			return *this;
  +		}
  +
   	private:
   
  -		XPathExecutionContext&	m_xpathExecutionContext;
  +		XPathExecutionContext*	m_xpathExecutionContext;
   
   		MutableNodeRefList*		m_mutableNodeRefList;
   	};