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

}