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 2002/10/11 04:02:27 UTC
cvs commit: xml-xalan/c/src/XSLT ResultNamespacesStack.cpp ResultNamespacesStack.hpp
dbertoni 2002/10/10 19:02:27
Modified: c/src/XSLT ResultNamespacesStack.cpp
ResultNamespacesStack.hpp
Log:
Experimental functionality.
Revision Changes Path
1.9 +67 -8 xml-xalan/c/src/XSLT/ResultNamespacesStack.cpp
Index: ResultNamespacesStack.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ResultNamespacesStack.cpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- ResultNamespacesStack.cpp 21 Sep 2002 01:24:41 -0000 1.8
+++ ResultNamespacesStack.cpp 11 Oct 2002 02:02:27 -0000 1.9
@@ -2,7 +2,7 @@
* The Apache Software License, Version 1.1
*
*
- * Copyright (c) 1999-2000 The Apache Software Foundation. All rights
+ * Copyright (c) 1999-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -61,9 +61,15 @@
ResultNamespacesStack::ResultNamespacesStack() :
- m_resultNamespaces(),
+ m_resultNamespaces(1),
+ m_stackBegin(m_resultNamespaces.begin()),
+ m_stackPosition(m_stackBegin),
m_createNewContextStack()
{
+ // m_resultNamespaces is initialized to a size of
+ // 1, so we always have a dummy entry at the
+ // beginning. This makes the implementation
+ // much simpler.
}
@@ -86,12 +92,20 @@
// Check to see if we need to create a new context and do so if necessary...
if (m_createNewContextStack.back() == true)
{
- m_resultNamespaces.resize(m_resultNamespaces.size() + 1);
+ ++m_stackPosition;
+
+ if (m_stackPosition == m_resultNamespaces.end())
+ {
+ m_resultNamespaces.resize(m_resultNamespaces.size() + 1);
+
+ m_stackPosition = m_resultNamespaces.end() - 1;
+ m_stackBegin = m_resultNamespaces.begin();
+ }
m_createNewContextStack.back() = false;
}
- NamespaceVectorType& theCurrentNamespaces = m_resultNamespaces.back();
+ NamespaceVectorType& theCurrentNamespaces = *m_stackPosition;
// Add a new namespace at the end of the current namespaces.
theCurrentNamespaces.resize(theCurrentNamespaces.size() + 1);
@@ -125,9 +139,12 @@
if (m_createNewContextStack.back() == false)
{
- assert(m_resultNamespaces.empty() == false);
+ assert(m_resultNamespaces.empty() == false &&
+ m_stackPosition != m_resultNamespaces.begin());
- m_resultNamespaces.pop_back();
+ (*m_stackPosition).clear();
+
+ --m_stackPosition;
}
m_createNewContextStack.pop_back();
@@ -135,6 +152,42 @@
+const XalanDOMString*
+ResultNamespacesStack::getNamespaceForPrefix(const XalanDOMString& thePrefix) const
+{
+ if (m_stackPosition == m_stackBegin)
+ {
+ return 0;
+ }
+ else
+ {
+ return XalanQName::getNamespaceForPrefix(
+ m_stackBegin,
+ m_stackPosition + 1,
+ thePrefix);
+ }
+}
+
+
+
+const XalanDOMString*
+ResultNamespacesStack::getPrefixForNamespace(const XalanDOMString& theNamespaceURI) const
+{
+ if (m_stackPosition == m_stackBegin)
+ {
+ return 0;
+ }
+ else
+ {
+ return XalanQName::getPrefixForNamespace(
+ m_stackBegin,
+ m_stackPosition + 1,
+ theNamespaceURI);
+ }
+}
+
+
+
bool
ResultNamespacesStack::prefixIsPresentLocal(const XalanDOMString& thePrefix)
{
@@ -145,7 +198,7 @@
if (m_createNewContextStack.back() == false)
{
const NamespaceVectorType& theNamespaces =
- m_resultNamespaces.back();
+ *m_stackPosition;
NamespaceVectorType::const_iterator i = theNamespaces.begin();
const NamespaceVectorType::const_iterator theEnd = theNamespaces.end();
@@ -175,7 +228,13 @@
void
ResultNamespacesStack::clear()
{
- m_resultNamespaces.clear();
+ // Since we always keep one dummy entry at the beginning,
+ // swap with an OutputContextStackType instance of size 1.
+ NamespacesStackType(1).swap(m_resultNamespaces);
+
+ m_stackBegin = m_resultNamespaces.begin();
+
+ m_stackPosition = m_stackBegin;
m_createNewContextStack.clear();
}
1.8 +12 -17 xml-xalan/c/src/XSLT/ResultNamespacesStack.hpp
Index: ResultNamespacesStack.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ResultNamespacesStack.hpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- ResultNamespacesStack.hpp 21 Sep 2002 01:24:41 -0000 1.7
+++ ResultNamespacesStack.hpp 11 Oct 2002 02:02:27 -0000 1.8
@@ -2,7 +2,7 @@
* The Apache Software License, Version 1.1
*
*
- * Copyright (c) 1999-2000 The Apache Software Foundation. All rights
+ * Copyright (c) 1999-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -132,19 +132,10 @@
popContext();
const XalanDOMString*
- getNamespaceForPrefix(const XalanDOMString& thePrefix) const
- {
- // Search vector from first element back
- return XalanQName::getNamespaceForPrefix(m_resultNamespaces, thePrefix, true);
- }
+ getNamespaceForPrefix(const XalanDOMString& thePrefix) const;
const XalanDOMString*
- getPrefixForNamespace(const XalanDOMString& theNamespaceURI) const
- {
- // Search vector from first element back
- return XalanQName::getPrefixForNamespace(m_resultNamespaces, theNamespaceURI, true);
- }
-
+ getPrefixForNamespace(const XalanDOMString& theNamespaceURI) const;
/**
* See if the prefix has been mapped to a namespace in the current
@@ -159,13 +150,13 @@
size_type
size() const
{
- return m_resultNamespaces.size();
+ return m_resultNamespaces.size() - 1;
}
bool
empty() const
{
- return m_resultNamespaces.empty();
+ return NamespacesStackType::const_iterator(m_stackPosition) == m_resultNamespaces.begin() ? true : false;
}
private:
@@ -179,14 +170,18 @@
ResultNamespacesStack&
operator=(const ResultNamespacesStack&);
- enum { eDefaultCreateNewContextStackSize = 100 };
+ enum { eDefaultCreateNewContextStackSize = 25 };
/**
* A stack to keep track of the result tree namespaces.
*/
- NamespacesStackType m_resultNamespaces;
+ NamespacesStackType m_resultNamespaces;
+
+ NamespacesStackType::iterator m_stackBegin;
+
+ NamespacesStackType::iterator m_stackPosition;
- BoolVectorType m_createNewContextStack;
+ BoolVectorType m_createNewContextStack;
};
---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org