ArraySimplifier.java
package edu.udel.cis.vsl.tass.dynamic.impl.simplify;
import edu.udel.cis.vsl.tass.dynamic.IF.DynamicException;
import edu.udel.cis.vsl.tass.dynamic.IF.simplify.DynamicSimplifierIF;
import edu.udel.cis.vsl.tass.dynamic.IF.simplify.MorphicSimplifierIF;
import edu.udel.cis.vsl.tass.morph.Morphic;
import edu.udel.cis.vsl.tass.morph.MorphicArray;
import edu.udel.cis.vsl.tass.morph.MorphicArrayFactory;
public class ArraySimplifier<T extends Morphic> implements
MorphicSimplifierIF<MorphicArray<T>> {
private MorphicArrayFactory<T> arrayFactory;
private MorphicSimplifierIF<? super T> elementSimplifier;
public ArraySimplifier(MorphicArrayFactory<T> arrayFactory,
MorphicSimplifierIF<? super T> elementSimplifier) {
this.arrayFactory = arrayFactory;
this.elementSimplifier = elementSimplifier;
}
@SuppressWarnings("unchecked")
@Override
public MorphicArray<T> simplify(DynamicSimplifierIF dynamicSimplifier,
MorphicArray<T> array) throws DynamicException {
MorphicArray<T> newArray;
array = arrayFactory.canonic(array);
newArray = (MorphicArray<T>) dynamicSimplifier.getCachedResult(array);
if (newArray != null)
return newArray;
int length = array.length();
for (int i = 0; i < length; i++) {
T oldValue = array.get(i);
if (oldValue != null) {
T newValue = (T) elementSimplifier.simplify(dynamicSimplifier,
oldValue);
if (newValue != oldValue) {
if (newArray == null) {
newArray = arrayFactory.newArray(length);
for (int j = 0; j < i; j++)
newArray.set(j, array.get(j));
}
newArray.set(i, newValue);
} else if (newArray != null) {
newArray.set(i, oldValue);
}
}
}
if (newArray != null) {
newArray = arrayFactory.canonic(newArray);
} else {
newArray = array;
}
dynamicSimplifier.cacheResult(array, newArray);
return newArray;
}
}