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...@locus.apache.org on 2000/11/27 20:48:27 UTC
cvs commit: xml-xalan/c/src/XPath MutableNodeRefList.cpp
dbertoni 00/11/27 11:48:25
Modified: c/src/XPath MutableNodeRefList.cpp
Log:
Changed code that required that vector iterators be implemented as pointers.
Revision Changes Path
1.16 +34 -21 xml-xalan/c/src/XPath/MutableNodeRefList.cpp
Index: MutableNodeRefList.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XPath/MutableNodeRefList.cpp,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- MutableNodeRefList.cpp 2000/08/10 18:37:29 1.15
+++ MutableNodeRefList.cpp 2000/11/27 19:48:16 1.16
@@ -320,27 +320,28 @@
-MutableNodeRefList::NodeListIteratorType
+bool
findInsertionPointBinarySearch(
XalanNode* node,
MutableNodeRefList::NodeListIteratorType begin,
- MutableNodeRefList::NodeListIteratorType end)
+ MutableNodeRefList::NodeListIteratorType end,
+ MutableNodeRefList::NodeListIteratorType& insertionPoint)
{
assert(node != 0);
assert(node->getNodeType() == XalanNode::DOCUMENT_NODE ||
(node->getOwnerDocument() != 0 && node->getOwnerDocument()->isIndexed() == true));
-
- typedef MutableNodeRefList::NodeListIteratorType NodeListIteratorType;
- NodeListIteratorType insertionPoint = 0;
+ bool fInsert = true;
// At this point, we are guaranteed that the range is only for this
// document, and that the range is indexed...
const unsigned long theIndex = node->getIndex();
+ typedef MutableNodeRefList::NodeListIteratorType NodeListIteratorType;
+
// End points to one past the last valid point,
// so subtract 1.
- NodeListIteratorType last = end - 1;
+ NodeListIteratorType last(end - 1);
assert(*last != 0);
// Do a quick check to see if we just need to append...
@@ -351,8 +352,8 @@
else
{
// Do a binary search for the insertion point...
- NodeListIteratorType first = begin;
- NodeListIteratorType current = 0;
+ NodeListIteratorType first(begin);
+ NodeListIteratorType current(end);
unsigned long theCurrentIndex = 0;
@@ -374,13 +375,15 @@
else if (theIndex == theCurrentIndex)
{
// Duplicate, don't insert...
+ fInsert = false;
+
break;
}
}
if (theIndex != theCurrentIndex)
{
- if (current == 0 || first == end)
+ if (current == end || first == end)
{
// We either didn't search, or we're
// at the end...
@@ -406,24 +409,27 @@
}
}
- return insertionPoint;
+ return fInsert;
}
template<class PredicateType>
-MutableNodeRefList::NodeListIteratorType
+bool
findInsertionPointLinearSearch(
XalanNode* node,
MutableNodeRefList::NodeListIteratorType begin,
MutableNodeRefList::NodeListIteratorType end,
- const PredicateType& isNodeAfterPredicate)
+ MutableNodeRefList::NodeListIteratorType& insertionPoint,
+ const PredicateType isNodeAfterPredicate)
{
assert(node != 0);
+ bool fInsert = true;
+
typedef MutableNodeRefList::NodeListIteratorType NodeListIteratorType;
- NodeListIteratorType current = begin;
+ NodeListIteratorType current(begin);
// Loop, looking for the node, or for a
// node that's before the one we're adding...
@@ -435,7 +441,7 @@
if(child == node)
{
// Duplicate, don't insert...
- current = 0;
+ fInsert = false;
break;
}
@@ -449,8 +455,10 @@
++current;
}
}
+
+ insertionPoint = current;
- return current;
+ return fInsert;
}
@@ -551,8 +559,10 @@
// Is it a duplicate?
if (theLastNode != node)
{
- NodeListIteratorType insertionPoint = 0;
+ bool fInsert = false;
+ NodeListIteratorType insertionPoint;
+
const XalanNode* const theFirstNode = m_nodeList.front();
assert(theFirstNode != 0);
@@ -579,33 +589,36 @@
// much we can do except a linear search...
if (theFirstNodeOwner == theLastNodeOwner)
{
- insertionPoint =
+ fInsert =
findInsertionPointBinarySearch(
node,
m_nodeList.begin(),
- m_nodeList.end());
+ m_nodeList.end(),
+ insertionPoint);
}
else
{
- insertionPoint =
+ fInsert =
findInsertionPointLinearSearch(
node,
m_nodeList.begin(),
m_nodeList.end(),
+ insertionPoint,
IndexPredicate());
}
}
else
{
- insertionPoint =
+ fInsert =
findInsertionPointLinearSearch(
node,
m_nodeList.begin(),
m_nodeList.end(),
+ insertionPoint,
ExecutionContextPredicate(executionContext));
}
- if (insertionPoint != 0)
+ if (fInsert == true)
{
m_nodeList.insert(insertionPoint, node);
}