- From: Miles Sabin <msabin@cromwellmedia.co.uk>
- Date: Fri, 13 Nov 1998 16:46:09 -0000
- To: "'John Cowan'" <cowan@locke.ccil.org>, "'DOM list'" <www-dom@w3.org>
John Cowan wrote,
> Miles Sabin wrote:
>
> > OK, I agree that this check is O(1). However, that's only
> > because the granularity of the check is so coarse: a single
> > document-level timestamp will cause a lot of unnecessary
> > invalidation ...
>
> Agreed. But this isn't so important if there are few active
> iterators (= iterators that will ever be resumed), which was my
> point.
>
> > I suspect that it would make the performance
> > of modifying a document via iterators unacceptably poor.
>
> Here I think the JDK 1.2 java.util.Iterator class is useful: it has
> a "remove" method which removes the last element iterated to
> in a safe way, or raises an exception if the underlying
> container is read-only.
Hmm ... I'm afraid I don't think this will be good enough.
Sure it solves the following problem,
Iterator i = element.???();
while(i.hasMore())
{
Node node = (Node)i.next();
node.getParentNode().removeChild(node); // correct, but invalidates
// iterator, so poor
performance
}
but that's only one way we might want to use iterators to
modify the structure of a document. How about something like
this,
Iterator i = elementA.???();
Iterator j = elementB.???();
while(i.hasMore() && j.hasMore())
{
Node nodeA = i.next();
Node nodeB = j.next();
if(nodeA.getNodeType() == Node.ELEMENT_NODE &&
nodeB.getNodeType() == Node.ELEMENT_NODE)
{
Element elementA = (Element)nodeA;
Element elementB = (Element)nodeB;
if(elementA.getAttribute("foo").equals(elementB.getAttribute("foo"
))
elementB.getParentNode().removeChild(elementB);
}
(run through the iterators and remove corresponding elements
with duplicated foo attributes ... OK, a bit artificial I
know, but I'm sure someone can come up with a more
realistic case).
Even with a remove() operation on the iterator class, this
will still cause serious problems, because i will be
invalidated every time a node is removed via j.
Cheers,
Miles
--
Miles Sabin Cromwell Media
Internet Systems Architect 5/6 Glenthorne Mews
+44 (0)181 410 2230 London, W6 0LJ
msabin@cromwellmedia.co.uk England
Received on Friday, 13 November 1998 11:48:13 UTC