/*******************************************************************************
* Copyright (c) 2009-2013 CWI
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* * Arnold Lankamp - Arnold.Lankamp@cwi.nl
*******************************************************************************/
package org.rascalmpl.parser.gtd.util;
@SuppressWarnings("unchecked")
public class IntegerObjectList<V>{
private final static int DEFAULT_SIZE = 8;
private int[] keys;
private V[] values;
private int size;
public IntegerObjectList(){
super();
keys = new int[DEFAULT_SIZE];
values = (V[]) new Object[DEFAULT_SIZE];
}
public IntegerObjectList(int size){
super();
keys = new int[size];
values = (V[]) new Object[size];
}
public IntegerObjectList(IntegerObjectList<V> original){
super();
int[] oldKeys = original.keys;
V[] oldValues = original.values;
int length = oldKeys.length;
size = original.size;
keys = new int[length];
System.arraycopy(oldKeys, 0, keys, 0, size);
values = (V[]) new Object[length];
System.arraycopy(oldValues, 0, values, 0, size);
}
public void enlarge(){
int[] oldKeys = keys;
keys = new int[size << 1];
System.arraycopy(oldKeys, 0, keys, 0, size);
V[] oldValues = values;
values = (V[]) new Object[size << 1];
System.arraycopy(oldValues, 0, values, 0, size);
}
public void add(int key, V value){
while(size >= keys.length){
enlarge();
}
keys[size] = key;
values[size++] = value;
}
public int getKey(int index){
return keys[index];
}
public V getValue(int index){
return values[index];
}
public int findKey(int key){
for(int i = size - 1; i >= 0; --i){
if(keys[i] == key){
return i;
}
}
return -1;
}
public int findKeyBefore(int key, int index){
for(int i = index - 1; i >= 0; --i){
if(keys[i] == key){
return i;
}
}
return -1;
}
public V findValue(int key){
for(int i = size - 1; i >= 0; --i){
if(keys[i] == key){
return values[i];
}
}
return null;
}
public V findValueBefore(int key, int index){
for(int i = index - 1; i >= 0; --i){
if(keys[i] == key){
return values[i];
}
}
return null;
}
public int size(){
return size;
}
public void clear(){
int length = keys.length;
keys = new int[length];
values = (V[]) new Object[length];
size = 0;
}
public void dirtyClear(){
size = 0;
}
}