forked from jasder/antlr
wasn't chked out
[git-p4: depot-paths = "//depot/code/antlr4/main/": change = 8868]
This commit is contained in:
parent
7a109d29d5
commit
c3f5bbed37
|
@ -35,9 +35,17 @@ import java.util.*;
|
||||||
public class ElementList<E> extends ArrayList<E> {
|
public class ElementList<E> extends ArrayList<E> {
|
||||||
protected TreeAdaptor adaptor;
|
protected TreeAdaptor adaptor;
|
||||||
|
|
||||||
|
/** Once a node / subtree has been used in a stream, it must be dup'd
|
||||||
|
* from then on.
|
||||||
|
*/
|
||||||
|
protected HashSet<Integer> used = new HashSet<Integer>();
|
||||||
|
|
||||||
public class ElementListIterator implements Iterator<E> {
|
public class ElementListIterator implements Iterator<E> {
|
||||||
int cursor = 0;
|
int cursor = 0;
|
||||||
|
|
||||||
|
/** If just 1 element, we still track cursor; next() will dup if
|
||||||
|
* cursor beyond 1 element.
|
||||||
|
*/
|
||||||
public boolean hasNext() {
|
public boolean hasNext() {
|
||||||
int n = size();
|
int n = size();
|
||||||
return (n==1 && cursor<1) || (n>1 && cursor<n);
|
return (n==1 && cursor<1) || (n>1 && cursor<n);
|
||||||
|
@ -72,6 +80,16 @@ public class ElementList<E> extends ArrayList<E> {
|
||||||
this.adaptor = adaptor;
|
this.adaptor = adaptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public E get(int index) {
|
||||||
|
E o = super.get(index);
|
||||||
|
if ( used.contains(index) ) {
|
||||||
|
return (E)adaptor.dupTree( o );
|
||||||
|
}
|
||||||
|
used.add(index); // any subsequent ref must be dup'd
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Iterator<E> iterator() {
|
public Iterator<E> iterator() {
|
||||||
return new ElementListIterator();
|
return new ElementListIterator();
|
||||||
|
|
Loading…
Reference in New Issue