ScopeStateSimplifier.java

package edu.udel.cis.vsl.tass.state.impl;

import edu.udel.cis.vsl.tass.dynamic.IF.DynamicException;
import edu.udel.cis.vsl.tass.dynamic.IF.DynamicFactoryIF;
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.dynamic.IF.value.ValueIF;
import edu.udel.cis.vsl.tass.morph.MorphicArray;
import edu.udel.cis.vsl.tass.state.IF.ScopeStateIF;

public class ScopeStateSimplifier implements MorphicSimplifierIF<ScopeStateIF> {

	private ScopeStateFactory scopeStateFactory;

	private DynamicFactoryIF dynamicFactory;

	public ScopeStateSimplifier(ScopeStateFactory scopeStateFactory) {
		this.scopeStateFactory = scopeStateFactory;
		this.dynamicFactory = scopeStateFactory.dynamicFactory();
	}

	@Override
	public ScopeStateIF simplify(DynamicSimplifierIF dynamicSimplifier,
			ScopeStateIF scopeState) throws DynamicException {
		scopeState = scopeStateFactory.canonic(scopeState);

		ScopeStateIF result = (ScopeStateIF) dynamicSimplifier
				.getCachedResult(scopeState);

		if (result != null)
			return result;

		MorphicArray<ValueIF> oldValues = scopeState.values();
		MorphicArray<ValueIF> newValues = dynamicFactory.simplifyValueArray(
				dynamicSimplifier, oldValues);

		if (newValues == oldValues) {
			result = scopeState;
		} else {
			result = scopeStateFactory
					.scopeState(scopeState.scope(), newValues);
			result = scopeStateFactory.canonic(result);
		}
		dynamicSimplifier.cacheResult(scopeState, result);
		return result;
	}
}