dbertoni 2002/10/04 15:29:44
Modified: c/src/XSLT XResultTreeFrag.cpp XResultTreeFrag.hpp
Log:
Better optimization of single-text-child RTFs.
Revision Changes Path
1.8 +34 -13 xml-xalan/c/src/XSLT/XResultTreeFrag.cpp
Index: XResultTreeFrag.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/XResultTreeFrag.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- XResultTreeFrag.cpp 4 Oct 2002 07:51:38 -0000 1.7
+++ XResultTreeFrag.cpp 4 Oct 2002 22:29:44 -0000 1.8
@@ -84,8 +84,8 @@
-inline bool
-hasSingleTextChild(const ResultTreeFragBase& theRTreeFrag)
+inline const XalanDOMString*
+getSingleTextChildValue(const ResultTreeFragBase& theRTreeFrag)
{
const XalanNode* const theFirstChild = theRTreeFrag.getFirstChild();
@@ -93,11 +93,11 @@
theFirstChild->getNodeType() == XalanNode::TEXT_NODE &&
theFirstChild->getNextSibling() == 0)
{
- return true;
+ return &theFirstChild->getNodeValue();
}
else
{
- return false;
+ return 0;
}
}
@@ -106,7 +106,7 @@
XResultTreeFrag::XResultTreeFrag(ResultTreeFragBase& value) :
XObject(eTypeResultTreeFrag),
m_value(&value),
- m_hasSingleTextChild(hasSingleTextChild(value)),
+ m_singleTextChildValue(getSingleTextChildValue(value)),
m_executionContext(0),
m_cachedStringValue(),
m_cachedNumberValue(0.0)
@@ -120,7 +120,7 @@
bool /* deepClone
*/) :
XObject(source),
m_value(source.m_value),
- m_hasSingleTextChild(source.m_hasSingleTextChild),
+ m_singleTextChildValue(source.m_singleTextChildValue),
m_executionContext(0),
m_cachedStringValue(source.m_cachedStringValue),
m_cachedNumberValue(source.m_cachedNumberValue)
@@ -185,12 +185,12 @@
const XalanDOMString&
XResultTreeFrag::str() const
{
- if (m_hasSingleTextChild == true)
+ if (m_singleTextChildValue != 0)
{
assert(m_value->getFirstChild() != 0 &&
m_value->getFirstChild()->getNodeType() ==
XalanNode::TEXT_NODE);
- return m_value->getFirstChild()->getNodeValue();
+ return *m_singleTextChildValue;
}
else if (isEmpty(m_cachedStringValue) == true)
{
@@ -211,7 +211,16 @@
FormatterListener& formatterListener,
MemberFunctionPtr function) const
{
- if (isEmpty(m_cachedStringValue) == false)
+ if (m_singleTextChildValue != 0)
+ {
+ assert(m_value->getFirstChild() != 0 &&
+ m_value->getFirstChild()->getNodeType() ==
XalanNode::TEXT_NODE);
+
+ assert(length(*m_singleTextChildValue) ==
FormatterListener::size_type(length(*m_singleTextChildValue)));
+
+ (formatterListener.*function)(c_wstr(*m_singleTextChildValue),
FormatterListener::size_type(length(*m_singleTextChildValue)));
+ }
+ else if (isEmpty(m_cachedStringValue) == false)
{
assert(length(m_cachedStringValue) ==
FormatterListener::size_type(length(m_cachedStringValue)));
@@ -228,7 +237,11 @@
void
XResultTreeFrag::str(XalanDOMString& theBuffer) const
{
- if (isEmpty(m_cachedStringValue) == false)
+ if (m_singleTextChildValue != 0)
+ {
+ append(theBuffer, *m_singleTextChildValue);
+ }
+ else if (isEmpty(m_cachedStringValue) == false)
{
append(theBuffer, m_cachedStringValue);
}
@@ -243,7 +256,11 @@
double
XResultTreeFrag::stringLength() const
{
- if (isEmpty(m_cachedStringValue) == false)
+ if (m_singleTextChildValue != 0)
+ {
+ return m_singleTextChildValue->length();
+ }
+ else if (isEmpty(m_cachedStringValue) == false)
{
return length(m_cachedStringValue);
}
@@ -298,6 +315,8 @@
ResultTreeFragBase*
XResultTreeFrag::release()
{
+ m_singleTextChildValue = 0;
+
clear(m_cachedStringValue);
m_cachedNumberValue = 0.0;
@@ -312,11 +331,13 @@
void
-XResultTreeFrag::set(ResultTreeFragBase* theValue)
+XResultTreeFrag::set(ResultTreeFragBase& theValue)
{
release();
- m_value = theValue;
+ m_value = &theValue;
+
+ m_singleTextChildValue = getSingleTextChildValue(*m_value);
}
1.6 +2 -2 xml-xalan/c/src/XSLT/XResultTreeFrag.hpp
Index: XResultTreeFrag.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/XResultTreeFrag.hpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- XResultTreeFrag.hpp 4 Oct 2002 07:51:38 -0000 1.5
+++ XResultTreeFrag.hpp 4 Oct 2002 22:29:44 -0000 1.6
@@ -182,7 +182,7 @@
* @param theValue The new value.
*/
void
- set(ResultTreeFragBase* theValue);
+ set(ResultTreeFragBase& theValue);
protected:
@@ -194,7 +194,7 @@
// Data members...
ResultTreeFragBase* m_value;
- const bool
m_hasSingleTextChild;
+ const XalanDOMString* m_singleTextChildValue;
StylesheetExecutionContext* m_executionContext;
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]