package jqian.util;
import java.util.AbstractSet;
import java.util.Collection;
import java.util.Iterator;
import java.util.NoSuchElementException;
/** Holding small number of elements. Compact representation, no delete support. */
class ArraySet extends AbstractSet<Object>{
static int increase;
private int numElements;
private Object[] elements;
public ArraySet( int size ){
elements = new Object[size];
numElements = 0;
}
final public void clear(){
numElements = 0;
}
final public boolean contains(Object obj){
for(int i = 0; i < numElements; i++)
if(elements[i].equals(obj))
return true;
return false;
}
final public boolean add(Object e){
if(contains(e))
return false;
if(numElements == elements.length)
incrCapacity();
elements[numElements++] = e;
return true;
}
final public boolean addAll(Collection<?> s) {
boolean ret = false;
if( !(s instanceof ArraySet) )
return super.addAll(s);
ArraySet as = (ArraySet) s;
int size = as.numElements;
Object[] asElmts = as.elements;
for(int i=0; i<size; i++){
ret = add(asElmts[i]) | ret;
}
return ret;
}
final public int size(){
return numElements;
}
final public Iterator<Object> iterator(){
return new ArrayIterator<Object>();
}
private class ArrayIterator<V> implements Iterator<V>{
int nextIndex;
final public boolean hasNext(){
return nextIndex < numElements;
}
@SuppressWarnings("unchecked")
final public V next() throws NoSuchElementException{
if(!(nextIndex < numElements))
throw new NoSuchElementException();
return (V) elements[nextIndex++];
}
final public void remove() throws NoSuchElementException{
throw new RuntimeException();
}
}
final private void incrCapacity(){
increase++;
int newSize = elements.length + 5;
Object[] newElements = new Object[newSize];
System.arraycopy(elements, 0, newElements, 0, numElements);
elements = newElements;
}
final public Object[] toArray(){
Object[] array = new Object[numElements];
System.arraycopy(elements, 0, array, 0, numElements);
return array;
}
@SuppressWarnings("unchecked")
final public Object[] toArray(Object[] array ){
System.arraycopy(elements, 0, array, 0, numElements);
return array;
}
}