package wnlt.morph;
import java.util.Arrays;
public class CharMap {
private char[] itemsKeys = null;
private FSMState[] itemsObjs = null;
private char[] adjitemsKeys = null;
private FSMState[] adjitemsObjs = null;
/**
* resize the containers by one leavaing empty elemant at position 'index'
*/
private void resizeCHILD(int index) {
int newsz = itemsKeys.length + 1;
char[] tempKeys = new char[newsz];
FSMState[] tempObjs = new FSMState[newsz];
int i;
for (i = 0; i < index; i++) {
tempKeys[i] = itemsKeys[i];
tempObjs[i] = itemsObjs[i];
}
for (i = index + 1; i < newsz; i++) {
tempKeys[i] = itemsKeys[i - 1];
tempObjs[i] = itemsObjs[i - 1];
}
itemsKeys = tempKeys;
itemsObjs = tempObjs;
} // resize
/**
* resize the containers by one leavaing empty elemant at position 'index'
*/
private void resizeADJ(int index) {
int newsz = adjitemsKeys.length + 1;
char[] tempKeys = new char[newsz];
FSMState[] tempObjs = new FSMState[newsz];
int i;
for (i = 0; i < index; i++) {
tempKeys[i] = adjitemsKeys[i];
tempObjs[i] = adjitemsObjs[i];
}
for (i = index + 1; i < newsz; i++) {
tempKeys[i] = adjitemsKeys[i - 1];
tempObjs[i] = adjitemsObjs[i - 1];
}
adjitemsKeys = tempKeys;
adjitemsObjs = tempObjs;
} // resize
/**
* get the object from the map using the char key
*/
public FSMState get(char key, byte type) {
if(type == FSMState.CHILD_STATE) {
if (itemsKeys == null)
return null;
int index = Arrays.binarySearch(itemsKeys, key);
if (index < 0)
return null;
return itemsObjs[index];
} else {
if (adjitemsKeys == null)
return null;
int index = Arrays.binarySearch(adjitemsKeys, key);
if (index < 0)
return null;
return adjitemsObjs[index];
}
}
/**
* put the object into the char map using the chat as the key
*/
public FSMState put(char key, FSMState value, byte type) {
if(type == FSMState.CHILD_STATE) {
if (itemsKeys == null) {
itemsKeys = new char[1];
itemsKeys[0] = key;
itemsObjs = new FSMState[1];
itemsObjs[0] = value;
return value;
}// if first time
int index = Arrays.binarySearch(itemsKeys, key);
if (index < 0) {
index = ~index;
resizeCHILD(index);
itemsKeys[index] = key;
itemsObjs[index] = value;
}
return itemsObjs[index];
} else {
if (adjitemsKeys == null) {
adjitemsKeys = new char[1];
adjitemsKeys[0] = key;
adjitemsObjs = new FSMState[1];
adjitemsObjs[0] = value;
return value;
}// if first time
int index = Arrays.binarySearch(adjitemsKeys, key);
if (index < 0) {
index = ~index;
resizeADJ(index);
adjitemsKeys[index] = key;
adjitemsObjs[index] = value;
}
return adjitemsObjs[index];
}
} // put
public char[] getItemsKeys() {
return itemsKeys;
}
public char[] getAdjitemsKeys() {
return adjitemsKeys;
}
}