auriemma 00/10/13 14:21:01
Modified: c/src/XPath XObjectFactory.hpp XObjectFactoryDefault.cpp
XObjectFactoryDefault.hpp XPathFactory.hpp
XPathFactoryDefault.cpp XPathFactoryDefault.hpp
Log:
Integrated block allocator support for XNumber, XNodeSet, XString and
XResultTreeFrag.
Revision Changes Path
1.13 +14 -31 xml-xalan/c/src/XPath/XObjectFactory.hpp
Index: XObjectFactory.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XPath/XObjectFactory.hpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- XObjectFactory.hpp 2000/09/19 14:56:31 1.12
+++ XObjectFactory.hpp 2000/10/13 21:20:50 1.13
@@ -129,98 +129,81 @@
/**
* Create a boolean XObject from a boolean value.
*
- * @param theValue value used to create object
- * @param fOptimize true to use static objects rather than creating new
- * instances, default true
+ * @param theValue value used to create object
* @return pointer to new object
*/
virtual XObject*
createBoolean(
- bool theValue,
- bool fOptimize = true) = 0;
+ bool theValue) = 0;
/**
* Create a node set XObject from a node list.
*
* @param theValue value used to create object. theValue will be
owned by the new XObject.
- * @param fOptimize not used
* @return pointer to new object
*/
virtual XObject*
createNodeSet(
- BorrowReturnMutableNodeRefList& theValue,
- bool
fOptimize = true) = 0;
+ BorrowReturnMutableNodeRefList& theValue) = 0;
/**
* Create a null XObject.
*
- * @param theValue value used to create object
- * @param fOptimize true to use static objects rather than creating new
- * instances, default true
+ * @param theValue value used to create object
* @return pointer to new object
*/
virtual XObject*
- createNull(bool fOptimize = true) = 0;
+ createNull() = 0;
/**
* Create a numeric XObject from a number.
*
- * @param theValue value used to create object
- * @param fOptimize not used
+ * @param theValue value used to create object
* @return pointer to new object
*/
virtual XObject*
createNumber(
- double theValue,
- bool fOptimize = true) = 0;
+ double theValue) = 0;
/**
* Create a string XObject from a string.
*
- * @param theValue value used to create object
- * @param fOptimize not used
+ * @param theValue value used to create object
* @return pointer to new object
*/
virtual XObject*
createString(
- const XalanDOMString& theValue,
- bool fOptimize =
true) = 0;
+ const XalanDOMString& theValue) = 0;
/**
* Create an "unknown" XObject from a string.
*
- * @param theValue value used to create object
- * @param fOptimize not used
+ * @param theValue value used to create object
* @return pointer to new object
*/
virtual XObject*
createUnknown(
- const XalanDOMString& theValue,
- bool fOptimize =
true) = 0;
+ const XalanDOMString& theValue) = 0;
/**
* Create a result tree fragment XObject from a result tree fragment.
*
- * @param theValue value used to create object. theValue will be
owned by the new XObject.
- * @param fOptimize not used
+ * @param theValue value used to create object. theValue will be
owned by the new XObject.
* @return pointer to new object
*/
virtual XObject*
createResultTreeFrag(
- ResultTreeFragBase* theValue,
- bool fOptimize =
true) = 0;
+ ResultTreeFragBase* theValue) = 0;
/**
* Create a span XObject from a node list.
*
* @param theValue value used to create object. The new object will
own the pointer.
- * @param fOptimize not used
* @return pointer to new object
*/
virtual XObject*
createSpan(
- BorrowReturnMutableNodeRefList& theValue,
- bool
fOptimize = true) = 0;
+ BorrowReturnMutableNodeRefList& theValue) = 0;
/**
*
1.15 +171 -134 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.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- XObjectFactoryDefault.cpp 2000/09/19 14:56:33 1.14
+++ XObjectFactoryDefault.cpp 2000/10/13 21:20:51 1.15
@@ -80,20 +80,18 @@
-XObjectFactoryDefault::XObjectFactoryDefault() :
+XObjectFactoryDefault::XObjectFactoryDefault(
+ unsigned int theXStringBlockSize,
+ unsigned int theXNumberBlockSize,
+ unsigned int theXNodeSetBlockSize,
+ unsigned int theXResultTreeFragBlockSize) :
XObjectFactory(),
m_xobjects(),
- m_XNull(new XNull)
-#if !defined(NDEBUG)
- , m_totalBooleanInstanceCount(0),
- m_totalNodeSetInstanceCount(0),
- m_totalNullInstanceCount(1),
- m_totalNumberInstanceCount(0),
- m_totalStringInstanceCount(0),
- m_totalUnknownInstanceCount(0),
- m_totalResultTreeFragInstanceCount(0),
- m_totalSpanInstanceCount(0)
-#endif
+ m_XNull(new XNull),
+ m_xstringAllocator(theXStringBlockSize),
+ m_xnumberAllocator(theXNumberBlockSize),
+ m_xnodesetAllocator(theXNodeSetBlockSize),
+ m_xresultTreeFragAllocator(theXResultTreeFragBlockSize)
{
}
@@ -113,33 +111,86 @@
{
assert(theXObject != 0);
- if (theXObject == &theTrueBoolean ||
- theXObject == &theFalseBoolean ||
- theXObject == m_XNull.get())
- {
- return true;
- }
- else
+ bool bStatus = false;
+
+ const XObject::eObjectType theType = theXObject->getType();
+
+ switch(theType)
{
- const CollectionType::iterator i =
- m_xobjects.find(theXObject);
+ case XObject::eTypeBoolean:
+ case XObject::eTypeNull:
+ {
+ bStatus = true;
+ }
+ case XObject::eTypeString:
+ {
+ XString* const theXString =
+#if defined(XALAN_OLD_STYLE_CASTS)
+ (XString*)theXObject;
+#else
+
static_cast<XString*>(const_cast<XObject*>(theXObject));
+#endif
- if (i != m_xobjects.end())
+ bStatus = m_xstringAllocator.destroy(theXString);
+ }
+ break;
+ case XObject::eTypeNumber:
{
- if (fInReset == false)
- {
- m_xobjects.erase(i);
- }
+ XNumber* const theXNumber =
+#if defined(XALAN_OLD_STYLE_CASTS)
+ (XNumber*)theXObject;
+#else
+
static_cast<XNumber*>(const_cast<XObject*>(theXObject));
+#endif
+
+ bStatus = m_xnumberAllocator.destroy(theXNumber);
+ }
+ break;
+ case XObject::eTypeNodeSet:
+ {
+ XNodeSet* const theXNodeSet =
+#if defined(XALAN_OLD_STYLE_CASTS)
+ (XNodeSet*)theXObject;
+#else
+
static_cast<XNodeSet*>(const_cast<XObject*>(theXObject));
+#endif
- deleteObject(theXObject);
+ bStatus = m_xnodesetAllocator.destroy(theXNodeSet);
+ }
+ break;
+ case XObject::eTypeResultTreeFrag:
+ {
+ XResultTreeFrag* const theXResultTreeFrag =
+#if defined(XALAN_OLD_STYLE_CASTS)
+ (XResultTreeFrag*)theXObject;
+#else
+
static_cast<XResultTreeFrag*>(const_cast<XObject*>(theXObject));
+#endif
- return true;
+ bStatus =
m_xresultTreeFragAllocator.destroy(theXResultTreeFrag);
}
- else
+ break;
+ default:
{
- return false;
+ const CollectionType::iterator i =
+ m_xobjects.find(theXObject);
+
+ if (i != m_xobjects.end())
+ {
+ if (fInReset == false)
+ {
+ m_xobjects.erase(i);
+ }
+
+ deleteObject(theXObject);
+
+ bStatus = true;
+ }
}
+ break;
}
+
+ return bStatus;
}
@@ -147,181 +198,159 @@
XObject*
XObjectFactoryDefault::clone(const XObject& theXObject)
{
+ XObject* theClone = 0;
+
if (&theXObject == &theTrueBoolean)
{
- return &theTrueBoolean;
+ theClone = &theTrueBoolean;
}
else if (&theXObject == &theFalseBoolean)
{
- return &theFalseBoolean;
+ theClone = &theFalseBoolean;
}
else if (&theXObject == m_XNull.get())
{
- return m_XNull.get();
+ theClone = m_XNull.get();
}
else
{
- XObject* const theClone = theXObject.clone();
-
- m_xobjects.insert(theClone);
+ const XObject::eObjectType theType = theXObject.getType();
- return theClone;
- }
-}
+ switch(theType)
+ {
+
+ case XObject::eTypeString:
+ theClone = m_xstringAllocator.clone(
+#if defined(XALAN_OLD_STYLE_CASTS)
+ (const XString&)theXObject);
+#else
+ static_cast<const XString&>(theXObject));
+#endif
+ break;
+ case XObject::eTypeNumber:
+ theClone = m_xnumberAllocator.clone(
+#if defined(XALAN_OLD_STYLE_CASTS)
+ (const XNumber&)theXObject);
+#else
+ static_cast<const XNumber&>(theXObject));
+#endif
+ break;
+ case XObject::eTypeNodeSet:
+ theClone = m_xnodesetAllocator.clone(
+#if defined(XALAN_OLD_STYLE_CASTS)
+ (const XNodeSet&)theXObject);
+#else
+ static_cast<const XNodeSet&>(theXObject));
+#endif
-XObject*
-XObjectFactoryDefault::createBoolean(
- bool theValue,
- bool fOptimize)
-{
- if (fOptimize == true)
- {
- return theValue == true ? &theTrueBoolean : &theFalseBoolean;
- }
- else
- {
- XBoolean* const theBoolean = new XBoolean(theValue);
+ break;
+ case XObject::eTypeResultTreeFrag:
+ theClone = m_xresultTreeFragAllocator.clone(
+#if defined(XALAN_OLD_STYLE_CASTS)
+ (const XResultTreeFrag&)theXObject);
+#else
+ static_cast<const XResultTreeFrag&>(theXObject));
+#endif
- m_xobjects.insert(theBoolean);
+ break;
+ default:
+ XObject* const theClone = theXObject.clone();
-#if !defined(NDEBUG)
- ++m_totalBooleanInstanceCount;
-#endif
- return theBoolean;
+ m_xobjects.insert(theClone);
+ break;
+ }
}
+
+ return theClone;
}
XObject*
-XObjectFactoryDefault::createNodeSet(
- BorrowReturnMutableNodeRefList& theValue,
- bool
/* fOptimize */)
+XObjectFactoryDefault::createBoolean(
+ bool theValue)
{
- XNodeSet* const theXNodeSet = new XNodeSet(theValue);
+ return theValue == true ? &theTrueBoolean : &theFalseBoolean;
+}
- m_xobjects.insert(theXNodeSet);
-#if !defined(NDEBUG)
- ++m_totalNodeSetInstanceCount;
-#endif
- return theXNodeSet;
+XObject*
+XObjectFactoryDefault::createNull()
+{
+ return m_XNull.get();
}
XObject*
-XObjectFactoryDefault::createNull(bool fOptimize)
+XObjectFactoryDefault::createUnknown(
+ const XalanDOMString& theValue)
{
- if (fOptimize == true)
- {
- return m_XNull.get();
- }
- else
- {
- XNull* const theXNull = new XNull();
-
- m_xobjects.insert(theXNull);
+ XUnknown* const theXUnknown = new XUnknown(theValue);
-#if !defined(NDEBUG)
- ++m_totalNullInstanceCount;
-#endif
+ m_xobjects.insert(theXUnknown);
- return theXNull;
- }
+ return theXUnknown;
}
XObject*
-XObjectFactoryDefault::createNumber(
- double theValue,
- bool /* fOptimize */)
+XObjectFactoryDefault::createSpan(
+ BorrowReturnMutableNodeRefList& theValue)
{
- XNumber* theXNumber = new XNumber(theValue);
-
- m_xobjects.insert(theXNumber);
+ XSpan* const theXSpan = new XSpan(theValue);
-#if !defined(NDEBUG)
- ++m_totalNumberInstanceCount;
-#endif
+ m_xobjects.insert(theXSpan);
- return theXNumber;
+ return theXSpan;
}
XObject*
-XObjectFactoryDefault::createString(
- const XalanDOMString& theValue,
- bool /* fOptimize */)
+XObjectFactoryDefault::createNumber(
+ double theValue)
{
- XString* const theXString = new XString(theValue);
-
- m_xobjects.insert(theXString);
+ XNumber* theXNumber = m_xnumberAllocator.createNumber(theValue);
-#if !defined(NDEBUG)
- ++m_totalStringInstanceCount;
-#endif
-
- return theXString;
+ return theXNumber;
}
XObject*
-XObjectFactoryDefault::createUnknown(
- const XalanDOMString& theValue,
- bool /* fOptimize */)
+XObjectFactoryDefault::createNodeSet(
+ BorrowReturnMutableNodeRefList& theValue)
{
- XUnknown* const theXUnknown = new XUnknown(theValue);
+ XNodeSet* const theXNodeSet =
m_xnodesetAllocator.createNodeSet(theValue);
- m_xobjects.insert(theXUnknown);
-
-#if !defined(NDEBUG)
- ++m_totalUnknownInstanceCount;
-#endif
-
- return theXUnknown;
+ return theXNodeSet;
}
XObject*
-XObjectFactoryDefault::createResultTreeFrag(
- ResultTreeFragBase* theValue,
- bool /* fOptimize */)
+XObjectFactoryDefault::createString(
+ const XalanDOMString& theValue)
{
- XResultTreeFrag* const theResultTreeFrag = new
XResultTreeFrag(theValue);
-
- m_xobjects.insert(theResultTreeFrag);
-
-#if !defined(NDEBUG)
- ++m_totalResultTreeFragInstanceCount;
-#endif
+ XString* const theXString = m_xstringAllocator.createString(theValue);
- return theResultTreeFrag;
+ return theXString;
}
XObject*
-XObjectFactoryDefault::createSpan(
- BorrowReturnMutableNodeRefList& theValue,
- bool
/* fOptimize */)
+XObjectFactoryDefault::createResultTreeFrag(
+ ResultTreeFragBase* theValue)
{
- XSpan* const theXSpan = new XSpan(theValue);
-
- m_xobjects.insert(theXSpan);
-
-#if !defined(NDEBUG)
- ++m_totalSpanInstanceCount;
-#endif
+ XResultTreeFrag* const theResultTreeFrag =
m_xresultTreeFragAllocator.create(theValue);
- return theXSpan;
+ return theResultTreeFrag;
}
@@ -332,6 +361,14 @@
#if !defined(XALAN_NO_NAMESPACES)
using std::for_each;
#endif
+
+ m_xstringAllocator.reset();
+
+ m_xnumberAllocator.reset();
+
+ m_xnodesetAllocator.reset();
+
+ m_xresultTreeFragAllocator.reset();
for_each(m_xobjects.begin(),
m_xobjects.end(),
1.13 +38 -97 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.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- XObjectFactoryDefault.hpp 2000/08/22 20:20:47 1.12
+++ XObjectFactoryDefault.hpp 2000/10/13 21:20:52 1.13
@@ -73,6 +73,13 @@
+#include <XPath/XStringAllocator.hpp>
+#include <XPath/XNumberAllocator.hpp>
+#include <XPath/XNodeSetAllocator.hpp>
+#include <XPath/XResultTreeFragAllocator.hpp>
+
+
+
#if defined(XALAN_AUTO_PTR_REQUIRES_DEFINITION)
#include <XPath/XNull.hpp>
#endif
@@ -94,16 +101,32 @@
{
public:
+ // Default block size for strings.
+ enum
+ {
+ eDefaultXStringBlockSize = 10,
+ eDefaultXNumberBlockSize = 10,
+ eDefaultXNodeSetBlockSize = 10,
+ eDefaultXResultTreeFragBlockSize = 10
+ };
+
/**
* Construct a factory for creating XObjects.
+ *
+ * @param theXStringBlockSize allacation block size
+ * @param theXNumberBlockSize allacation block size
+ * @param theXNodeSetBlockSize allacation block size
*/
explicit
- XObjectFactoryDefault();
+ XObjectFactoryDefault(
+ unsigned int theXStringBlockSize =
eDefaultXStringBlockSize,
+ unsigned int theXNumberBlockSize =
eDefaultXNumberBlockSize,
+ unsigned int theXNodeSetBlockSize =
eDefaultXNodeSetBlockSize,
+ unsigned int theXResultTreeFragBlockSize =
eDefaultXResultTreeFragBlockSize);
virtual
~XObjectFactoryDefault();
-
// These methods are inherited from XObjectFactory ...
virtual void
@@ -114,41 +137,34 @@
virtual XObject*
createBoolean(
- bool theValue,
- bool fOptimize = true);
+ bool theValue);
virtual XObject*
createNodeSet(
- BorrowReturnMutableNodeRefList& theValue,
- bool
fOptimize = true);
+ BorrowReturnMutableNodeRefList& theValue);
virtual XObject*
- createNull(bool fOptimize = true);
+ createNull();
virtual XObject*
createNumber(
- double theValue,
- bool fOptimize = true);
+ double theValue);
virtual XObject*
createString(
- const XalanDOMString& theValue,
- bool fOptimize =
true);
+ const XalanDOMString& theValue);
virtual XObject*
createUnknown(
- const XalanDOMString& theValue,
- bool fOptimize =
true);
+ const XalanDOMString& theValue);
virtual XObject*
createResultTreeFrag(
- ResultTreeFragBase* theValue,
- bool fOptimize =
true);
+ ResultTreeFragBase* theValue);
virtual XObject*
createSpan(
- BorrowReturnMutableNodeRefList& theValue,
- bool
fOptimize = true);
+ BorrowReturnMutableNodeRefList& theValue);
#if defined(XALAN_NO_NAMESPACES)
typedef set<const XObject*, less<const XObject*> > CollectionType;
@@ -156,69 +172,6 @@
typedef std::set<const XObject*> CollectionType;
#endif
- /**
- * Retrieve the number of instances in existence
- *
- * @return number of objects
- */
- CollectionType::size_type
- instanceCount() const
- {
- return m_xobjects.size();
- }
-
-#if !defined(NDEBUG)
-
- unsigned long
- getTotalBooleanInstanceCount() const
- {
- return m_totalBooleanInstanceCount;
- }
-
- unsigned long
- getTotalNodeSetInstanceCount() const
- {
- return m_totalNodeSetInstanceCount;
- }
-
- unsigned long
- getTotalNullInstanceCount() const
- {
- return m_totalNullInstanceCount;
- }
-
- unsigned long
- getTotalNumberInstanceCount() const
- {
- return m_totalNumberInstanceCount;
- }
-
- unsigned long
- getTotalStringInstanceCount() const
- {
- return m_totalStringInstanceCount;
- }
-
- unsigned long
- getTotalUnknownInstanceCount() const
- {
- return m_totalUnknownInstanceCount;
- }
-
- unsigned long
- getTotalResultTreeFragInstanceCount() const
- {
- return m_totalResultTreeFragInstanceCount;
- }
-
- unsigned long
- getTotalSpanInstanceCount() const
- {
- return m_totalSpanInstanceCount;
- }
-
-#endif
-
protected:
// These methods are inherited from Factory ...
@@ -244,26 +197,14 @@
CollectionType m_xobjects;
const XalanAutoPtr<XNull> m_XNull;
-
-#if !defined(NDEBUG)
-
- unsigned long m_totalBooleanInstanceCount;
-
- unsigned long m_totalNodeSetInstanceCount;
-
- unsigned long m_totalNullInstanceCount;
- unsigned long m_totalNumberInstanceCount;
+ XStringAllocator m_xstringAllocator;
+
+ XNumberAllocator m_xnumberAllocator;
- unsigned long m_totalStringInstanceCount;
+ XNodeSetAllocator m_xnodesetAllocator;
- unsigned long m_totalUnknownInstanceCount;
-
- unsigned long m_totalResultTreeFragInstanceCount;
-
- unsigned long m_totalSpanInstanceCount;
-
-#endif
+ XResultTreeFragAllocator m_xresultTreeFragAllocator;
};
1.9 +1 -2 xml-xalan/c/src/XPath/XPathFactory.hpp
Index: XPathFactory.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathFactory.hpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- XPathFactory.hpp 2000/09/19 14:56:39 1.8
+++ XPathFactory.hpp 2000/10/13 21:20:52 1.9
@@ -106,10 +106,9 @@
* Create an XPath. The XPath instance is owned by the factory, and
should
* not be deleted. The factory will manage the lifetime.
*
- * @param fOptimize true to optimize management of objects
*/
virtual XPath*
- create(bool fOptimize = true) = 0;
+ create() = 0;
/**
*
1.9 +1 -1 xml-xalan/c/src/XPath/XPathFactoryDefault.cpp
Index: XPathFactoryDefault.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathFactoryDefault.cpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- XPathFactoryDefault.cpp 2000/09/19 14:56:40 1.8
+++ XPathFactoryDefault.cpp 2000/10/13 21:20:53 1.9
@@ -133,7 +133,7 @@
XPath*
-XPathFactoryDefault::create(bool /* fOptimize */)
+XPathFactoryDefault::create()
{
XPath* const theXPath = new XPath;
1.9 +1 -1 xml-xalan/c/src/XPath/XPathFactoryDefault.hpp
Index: XPathFactoryDefault.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathFactoryDefault.hpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- XPathFactoryDefault.hpp 2000/08/15 19:43:19 1.8
+++ XPathFactoryDefault.hpp 2000/10/13 21:20:53 1.9
@@ -92,7 +92,7 @@
// Inherited from XPathFactory...
virtual XPath*
- create(bool fOptimize = true);
+ create();
#if defined(XALAN_NO_NAMESPACES)