package org.eclipse.core.internal.registry;
public class DirectMap {
final private float growthFactor;
private String[] keyArray;
private String[][] valueArray;
private int size;
public DirectMap(int initialSize, float growthFactor) {
if (initialSize < 1)
throw new IllegalArgumentException();
if (growthFactor <= 0)
throw new IllegalArgumentException();
this.growthFactor = growthFactor;
keyArray = new String[initialSize];
valueArray = new String[initialSize][];
size = 0;
}
public synchronized void put(String key, String[] value) {
if (key == null)
throw new IllegalArgumentException();
int id = findKey(key);
if (id != -1)
throw new IllegalArgumentException();
if (size >= keyArray.length) {
int newSize = recalcSize(keyArray.length);
if (newSize <= size)
newSize = size + 1;
String[] newKeyArray = new String[newSize];
System.arraycopy(keyArray, 0, newKeyArray, 0, keyArray.length);
keyArray = newKeyArray;
String[][] newValueArray = new String[newSize][];
System.arraycopy(valueArray, 0, newValueArray, 0, valueArray.length);
valueArray = newValueArray;
}
keyArray[size] = key;
valueArray[size] = value;
size++;
}
public synchronized boolean containsKey(String key) {
if (key == null)
throw new IllegalArgumentException();
return (findKey(key) != -1);
}
public synchronized String[] get(String key) {
if (key == null)
throw new IllegalArgumentException();
int id = findKey(key);
if (id == -1)
return null;
return valueArray[id];
}
String[] getKeys() {
return keyArray;
}
String[][] getValues() {
return valueArray;
}
int getSzie() {
return size;
}
private int recalcSize(int currentSize) {
return (int) (currentSize * (1.0f + growthFactor));
}
private int findKey(String key) {
for (int i = 0; i < keyArray.length; i++) {
if (keyArray[i] == null)
continue;
if (keyArray[i].equals(key))
return i;
}
return -1;
}
}