File: CloneableNodeIteratorImpl.java

package info (click to toggle)
lib-xt-java 0.19990725-1
  • links: PTS
  • area: main
  • in suites: potato
  • size: 1,224 kB
  • ctags: 2,133
  • sloc: java: 9,665; makefile: 54; xml: 28
file content (56 lines) | stat: -rw-r--r-- 1,272 bytes parent folder | download
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;
  }
}