VectorSimplifier.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.MorphicVector;
import edu.udel.cis.vsl.tass.morph.MorphicVectorFactory;
public class VectorSimplifier<T extends Morphic> extends
MorphicSimplifier<MorphicVector<T>> {
private MorphicVectorFactory<T> vectorFactory;
private MorphicSimplifierIF<? super T> elementSimplifier;
public VectorSimplifier(MorphicVectorFactory<T> vectorFactory,
MorphicSimplifierIF<? super T> elementSimplifier) {
this.vectorFactory = vectorFactory;
this.elementSimplifier = elementSimplifier;
}
@SuppressWarnings("unchecked")
@Override
public MorphicVector<T> simplify(DynamicSimplifierIF dynamicSimplifier,
MorphicVector<T> vector) throws DynamicException {
MorphicVector<T> newVector;
vector = vectorFactory.canonic(vector);
newVector = (MorphicVector<T>) dynamicSimplifier
.getCachedResult(vector);
if (newVector != null)
return newVector;
int size = vector.size();
for (int i = 0; i < size; i++) {
T oldValue = vector.get(i);
if (oldValue != null) {
T newValue = (T) elementSimplifier.simplify(dynamicSimplifier,
oldValue);
if (newValue != oldValue) {
if (newVector == null) {
newVector = vectorFactory.newVector(size);
for (int j = 0; j < i; j++)
newVector.set(j, vector.get(j));
}
newVector.set(i, newValue);
} else if (newVector != null) {
newVector.set(i, oldValue);
}
}
}
if (newVector != null) {
newVector = vectorFactory.canonic(newVector);
} else {
newVector = vector;
}
dynamicSimplifier.cacheResult(vector, newVector);
return newVector;
}
}