/* * [The "BSD license"] * Copyright (c) 2010 Terence Parr * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.antlr.misc; import java.util.AbstractList; /** An ArrayList based upon int members. Not quite a real implementation of a * modifiable list as I don't do, for example, add(index,element). * TODO: unused? */ public class IntArrayList extends AbstractList implements Cloneable { private static final int DEFAULT_CAPACITY = 10; protected int n = 0; protected int[] elements = null; public IntArrayList() { this(DEFAULT_CAPACITY); } public IntArrayList(int initialCapacity) { elements = new int[initialCapacity]; } /** Set the ith element. Like ArrayList, this does NOT affect size. */ public int set(int i, int newValue) { if ( i>=n ) { setSize(i); // unlike definition of set in ArrayList, set size } int v = elements[i]; elements[i] = newValue; return v; } public boolean add(int o) { if ( n>=elements.length ) { grow(); } elements[n] = o; n++; return true; } public void setSize(int newSize) { if ( newSize>=elements.length ) { ensureCapacity(newSize); } n = newSize; } protected void grow() { ensureCapacity((elements.length * 3)/2 + 1); } public boolean contains(int v) { for (int i = 0; i < n; i++) { int element = elements[i]; if ( element == v ) { return true; } } return false; } public void ensureCapacity(int newCapacity) { int oldCapacity = elements.length; if (n>=oldCapacity) { int oldData[] = elements; elements = new int[newCapacity]; System.arraycopy(oldData, 0, elements, 0, n); } } public Object get(int i) { return Utils.integer(element(i)); } public int element(int i) { return elements[i]; } public int[] elements() { int[] a = new int[n]; System.arraycopy(elements, 0, a, 0, n); return a; } public int size() { return n; } public int capacity() { return elements.length; } public boolean equals(Object o) { if ( o==null ) { return false; } IntArrayList other = (IntArrayList)o; if ( this.size()!=other.size() ) { return false; } for (int i = 0; i < n; i++) { if ( elements[i] != other.elements[i] ) { return false; } } return true; } public Object clone() throws CloneNotSupportedException { IntArrayList a = (IntArrayList)super.clone(); a.n = this.n; System.arraycopy(this.elements, 0, a.elements, 0, this.elements.length); return a; } public String toString() { StringBuffer buf = new StringBuffer(); for (int i = 0; i < n; i++) { if ( i>0 ) { buf.append(", "); } buf.append(elements[i]); } return buf.toString(); } }