1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
package com.jclark.xsl.expr;
import com.jclark.xsl.om.*;
public class CloneableNodeIteratorImpl implements CloneableNodeIterator {
static class NodeList {
final NodeIterator iter;
Node[] nodes = null;
int len = 0;
NodeList(NodeIterator iter) {
this.iter = iter;
}
Node nodeAt(int i) throws XSLException {
if (i >= len) {
if (nodes == null)
nodes = new Node[i + 4];
else if (i >= nodes.length) {
Node[] oldNodes = nodes;
nodes = new Node[oldNodes.length*2];
System.arraycopy(oldNodes, 0, nodes, 0, oldNodes.length);
}
// Have i < nodes.length
for (; len <= i; len++) {
if ((nodes[len] = iter.next()) == null)
return null;
}
// Have i < len
}
return nodes[i];
}
}
private final NodeList list;
private int i;
public Object clone() {
return new CloneableNodeIteratorImpl(list, i);
}
public CloneableNodeIteratorImpl(NodeIterator iter) {
list = new NodeList(iter);
i = 0;
}
private CloneableNodeIteratorImpl(NodeList list, int i) {
this.list = list;
this.i = i;
}
public Node next() throws XSLException {
Node tem = list.nodeAt(i);
if (tem != null)
i++;
return tem;
}
}
|