SetSimplifier.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.MorphicSet;
import edu.udel.cis.vsl.tass.morph.MorphicSetFactory;
public class SetSimplifier<T extends Morphic> extends
MorphicSimplifier<MorphicSet<T>> {
private MorphicSetFactory<T> setFactory;
private MorphicSimplifierIF<? super T> elementSimplifier;
public SetSimplifier(MorphicSetFactory<T> setFactory,
MorphicSimplifierIF<? super T> elementSimplifier) {
this.setFactory = setFactory;
this.elementSimplifier = elementSimplifier;
}
@SuppressWarnings("unchecked")
@Override
public MorphicSet<T> simplify(DynamicSimplifierIF dynamicSimplifier,
MorphicSet<T> set) throws DynamicException {
MorphicSet<T> newSet;
set = setFactory.canonic(set);
newSet = (MorphicSet<T>) dynamicSimplifier.getCachedResult(set);
if (newSet != null)
return newSet;
for (T oldElement : set) {
T newElement = (T) elementSimplifier.simplify(dynamicSimplifier,
oldElement);
if (newElement != oldElement) {
if (newSet == null) {
newSet = setFactory.newSet();
for (T x : set) {
if (x == oldElement)
break;
newSet.add(x);
}
}
newSet.add(newElement);
} else if (newSet != null) {
newSet.add(oldElement);
}
}
if (newSet != null) {
newSet = setFactory.canonic(newSet);
} else {
newSet = set;
}
dynamicSimplifier.cacheResult(set, newSet);
return newSet;
}
}