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;
	}

}