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/04/11 04:36:23 UTC
cvs commit: xml-xalan/c/src/XSLT ElemTemplateElement.cpp StylesheetExecutionContext.cpp StylesheetExecutionContext.hpp StylesheetExecutionContextDefault.cpp StylesheetExecutionContextDefault.hpp StylesheetRoot.cpp
dbertoni 01/04/10 19:36:23
Modified: c/src/XSLT ElemTemplateElement.cpp
StylesheetExecutionContext.cpp
StylesheetExecutionContext.hpp
StylesheetExecutionContextDefault.cpp
StylesheetExecutionContextDefault.hpp
StylesheetRoot.cpp
Log:
Changes to allow for caching of FormatterToText instances.
Revision Changes Path
1.53 +13 -4 xml-xalan/c/src/XSLT/ElemTemplateElement.cpp
Index: ElemTemplateElement.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemTemplateElement.cpp,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -r1.52 -r1.53
--- ElemTemplateElement.cpp 2001/03/29 22:24:25 1.52
+++ ElemTemplateElement.cpp 2001/04/11 02:36:21 1.53
@@ -327,16 +327,25 @@
// a string.
DOMStringPrintWriter thePrintWriter(result);
- // Create a FormatterToText, and don't normalize CR/LF, since we don't want
- // this text to be normalized. Finally, handle any ignorable whitespace events.
- FormatterToText theFormatter(thePrintWriter, false, true);
+ // Borrow a FormatterToText, and don't normalize CR/LF, since we don't want
+ // this text to be normalized. Finally, have the formatter handle any ignorable
+ // whitespace events.
+ StylesheetExecutionContext::BorrowReturnFormatterToText theFormatter(
+ executionContext,
+ thePrintWriter,
+ false,
+ true);
// Create an object to set and restore the execution state.
StylesheetExecutionContext::OutputContextPushPop theOutputContextPushPop(
executionContext,
- &theFormatter);
+ theFormatter.get());
+ theFormatter->startDocument();
+
executeChildren(executionContext);
+
+ theFormatter->endDocument();
}
1.7 +22 -0 xml-xalan/c/src/XSLT/StylesheetExecutionContext.cpp
Index: StylesheetExecutionContext.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContext.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- StylesheetExecutionContext.cpp 2001/03/06 21:22:59 1.6
+++ StylesheetExecutionContext.cpp 2001/04/11 02:36:21 1.7
@@ -59,6 +59,10 @@
+#include <XMLSupport/FormatterToText.hpp>
+
+
+
#include "ElemTemplateElement.hpp"
@@ -104,4 +108,22 @@
m_executionContext.popContextMarker();
m_executionContext.setCurrentStackFrameIndex(m_savedStackFrameIndex);
+}
+
+
+
+StylesheetExecutionContext::BorrowReturnFormatterToText::BorrowReturnFormatterToText(
+ StylesheetExecutionContext& executionContext,
+ Writer& writer,
+ bool normalizeLinefeed,
+ bool handleIgnorableWhitespace) :
+ m_executionContext(executionContext),
+ m_formatter(executionContext.borrowFormatterToText())
+{
+ assert(m_formatter != 0);
+
+ m_formatter->setNormalizeLinefeed(normalizeLinefeed);
+ m_formatter->setHandleIgnorableWhitespace(handleIgnorableWhitespace);
+ m_formatter->clearEncoding();
+ m_formatter->setWriter(&writer);
}
1.51 +63 -0 xml-xalan/c/src/XSLT/StylesheetExecutionContext.hpp
Index: StylesheetExecutionContext.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContext.hpp,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -r1.50 -r1.51
--- StylesheetExecutionContext.hpp 2001/03/29 22:24:26 1.50
+++ StylesheetExecutionContext.hpp 2001/04/11 02:36:21 1.51
@@ -1162,6 +1162,69 @@
Writer& writer,
const XalanDOMString& encoding) = 0;
+ /**
+ * Borrow a cached FormatterToText instance.
+ *
+ * @return A pointer to the instance.
+ */
+ virtual FormatterToText*
+ borrowFormatterToText() = 0;
+
+ /**
+ * Return a previously borrowed FormatterToText instance.
+ *
+ * @param theFormatter A pointer the to previously borrowed instance.
+ * @return true if the formatter was borrowed (at therefore, destroyed), false if not.
+ */
+ virtual bool
+ returnFormatterToText(FormatterToText* theFormatter) = 0;
+
+ class BorrowReturnFormatterToText
+ {
+ public:
+
+ BorrowReturnFormatterToText(
+ StylesheetExecutionContext& executionContext,
+ Writer& writer,
+ bool normalizeLinefeed = true,
+ bool handleIgnorableWhitespace = true);
+
+ ~BorrowReturnFormatterToText()
+ {
+ assert(m_formatter != 0);
+
+ m_executionContext.returnFormatterToText(m_formatter);
+ }
+
+ FormatterToText&
+ operator*() const
+ {
+ assert(m_formatter != 0);
+
+ return *m_formatter;
+ }
+
+ FormatterToText*
+ get() const
+ {
+ assert(m_formatter != 0);
+
+ return m_formatter;
+ }
+
+ FormatterToText*
+ operator->() const
+ {
+ return get();
+ }
+
+ private:
+
+ StylesheetExecutionContext& m_executionContext;
+
+ FormatterToText* m_formatter;
+ };
+
typedef XalanAutoPtr<XalanNumberFormat> XalanNumberFormatAutoPtr;
1.61 +72 -2 xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.cpp
Index: StylesheetExecutionContextDefault.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.cpp,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -r1.60 -r1.61
--- StylesheetExecutionContextDefault.cpp 2001/03/29 22:24:26 1.60
+++ StylesheetExecutionContextDefault.cpp 2001/04/11 02:36:22 1.61
@@ -148,7 +148,9 @@
m_useDOMResultTreeFactory(false),
m_ignoreHTMLElementNamespaces(false),
m_sourceTreeResultTreeFactory(),
- m_mode(0)
+ m_mode(0),
+ m_availableCachedFormattersToText(),
+ m_busyCachedFormattersToText()
{
}
@@ -179,7 +181,9 @@
m_useDOMResultTreeFactory(false),
m_ignoreHTMLElementNamespaces(false),
m_sourceTreeResultTreeFactory(),
- m_mode(0)
+ m_mode(0),
+ m_availableCachedFormattersToText(),
+ m_busyCachedFormattersToText()
{
}
@@ -188,6 +192,15 @@
StylesheetExecutionContextDefault::~StylesheetExecutionContextDefault()
{
reset();
+
+#if !defined(XALAN_NO_NAMESPACES)
+ using std::for_each;
+#endif
+
+ for_each(
+ m_availableCachedFormattersToText.begin(),
+ m_availableCachedFormattersToText.end(),
+ DeleteFunctor<FormatterToText>());
}
@@ -1202,6 +1215,56 @@
+FormatterToText*
+StylesheetExecutionContextDefault::borrowFormatterToText()
+{
+ // We'll always return the back of the free list, since
+ // that's the cheapest thing.
+ if (m_availableCachedFormattersToText.size() == 0)
+ {
+ m_busyCachedFormattersToText.push_back(new FormatterToText);
+ }
+ else
+ {
+ m_busyCachedFormattersToText.push_back(m_availableCachedFormattersToText.back());
+
+ m_availableCachedFormattersToText.pop_back();
+ }
+
+ return m_busyCachedFormattersToText.back();
+}
+
+
+
+bool
+StylesheetExecutionContextDefault::returnFormatterToText(FormatterToText* theFormatter)
+{
+#if !defined(XALAN_NO_NAMESPACES)
+ using std::find;
+#endif
+
+ const FormatterToTextCacheType::iterator i =
+ find(
+ m_busyCachedFormattersToText.begin(),
+ m_busyCachedFormattersToText.end(),
+ theFormatter);
+
+ if (i == m_busyCachedFormattersToText.end())
+ {
+ return false;
+ }
+ else
+ {
+ m_availableCachedFormattersToText.push_back(theFormatter);
+
+ m_busyCachedFormattersToText.erase(i);
+
+ return true;
+ }
+}
+
+
+
StylesheetExecutionContextDefault::XalanNumberFormatAutoPtr
StylesheetExecutionContextDefault::createXalanNumberFormat()
{
@@ -1430,6 +1493,13 @@
}
m_mode = 0;
+
+ while (m_busyCachedFormattersToText.size() != 0)
+ {
+ m_availableCachedFormattersToText.push_back(m_busyCachedFormattersToText.back());
+
+ m_busyCachedFormattersToText.pop_back();
+ }
// Just in case endDocument() was not called,
// clean things up...
1.55 +12 -0 xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.hpp
Index: StylesheetExecutionContextDefault.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.hpp,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -r1.54 -r1.55
--- StylesheetExecutionContextDefault.hpp 2001/03/30 19:30:47 1.54
+++ StylesheetExecutionContextDefault.hpp 2001/04/11 02:36:22 1.55
@@ -118,6 +118,7 @@
typedef map<XalanDOMString,
XPathCacheEntry,
less<XalanDOMString> > XPathCacheMapType;
+ typedef vector<FormatterToText*> FormatterToTextCacheType;
#else
typedef std::deque<const ElemTemplateElement*> ElementRecursionStackType;
typedef std::set<FormatterListener*> FormatterListenerSetType;
@@ -126,6 +127,7 @@
typedef std::set<const KeyDeclaration*> KeyDeclarationSetType;
typedef std::pair<const XPath*, clock_t> XPathCacheEntry;
typedef std::map<XalanDOMString, XPathCacheEntry> XPathCacheMapType;
+ typedef std::vector<FormatterToText*> FormatterToTextCacheType;
#endif
typedef Stylesheet::KeyTablesTableType KeyTablesTableType;
@@ -563,6 +565,12 @@
Writer& writer,
const XalanDOMString& encoding);
+ virtual FormatterToText*
+ borrowFormatterToText();
+
+ virtual bool
+ returnFormatterToText(FormatterToText* theFormatter);
+
virtual XalanNumberFormatAutoPtr
createXalanNumberFormat();
@@ -1020,6 +1028,10 @@
// Holds the current mode.
const QName* m_mode;
+
+ FormatterToTextCacheType m_availableCachedFormattersToText;
+
+ FormatterToTextCacheType m_busyCachedFormattersToText;
/**
* The factory that will be used to create result tree fragments based on our
1.41 +1 -1 xml-xalan/c/src/XSLT/StylesheetRoot.cpp
Index: StylesheetRoot.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetRoot.cpp,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -r1.40 -r1.41
--- StylesheetRoot.cpp 2001/03/29 22:24:26 1.40
+++ StylesheetRoot.cpp 2001/04/11 02:36:22 1.41
@@ -119,7 +119,7 @@
-//#define XALAN_VQ_SPECIAL_TRACE
+#define XALAN_VQ_SPECIAL_TRACE
#if defined(XALAN_VQ_SPECIAL_TRACE)
#include "d:/Rational/Quantify/pure.h"
#endif
---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org