blob: d4976ca074a0ec0495a3196a8db98c673e8e4823 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.core.internal.registry;
/**
* Essentially a map String -> String[] for small number of keys.
*
* For Maps containing a small number of objects hashing often reduces performance.
* This implementation uses two parallel arrays, one for keys, one for
* values, and grows them as necessary.
*/
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) { // need to resize
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];
}
/* package */String[] getKeys() {
return keyArray;
}
/* package */String[][] getValues() {
return valueArray;
}
/* package */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;
}
}