FrameSimplifier.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.morph.MorphicVector;
import edu.udel.cis.vsl.tass.morph.MorphicVectorFactory;
import edu.udel.cis.vsl.tass.state.IF.FrameIF;
import edu.udel.cis.vsl.tass.state.IF.ScopeStateIF;
public class FrameSimplifier implements MorphicSimplifierIF<FrameIF> {
private DynamicFactoryIF dynamicFactory;
private FrameFactory frameFactory;
private ScopeStateFactory scopeStateFactory;
private ScopeStateSimplifier scopeStateSimplifier;
private MorphicVectorFactory<ScopeStateIF> scopeStateVectorFactory;
private MorphicSimplifierIF<MorphicVector<ScopeStateIF>> scopeStateVectorSimplifier;
public FrameSimplifier(FrameFactory frameFactory) {
this.frameFactory = frameFactory;
this.dynamicFactory = frameFactory.dynamicFactory();
this.scopeStateFactory = frameFactory.scopeStateFactory();
this.scopeStateSimplifier = scopeStateFactory.simplifier();
this.scopeStateVectorFactory = frameFactory.scopeStateVectorFactory();
this.scopeStateVectorSimplifier = dynamicFactory.newVectorSimplifier(
scopeStateVectorFactory, scopeStateSimplifier);
}
@Override
public FrameIF simplify(DynamicSimplifierIF dynamicSimplifier, FrameIF frame)
throws DynamicException {
frame = frameFactory.canonic(frame);
FrameIF result = (FrameIF) dynamicSimplifier.getCachedResult(frame);
if (result != null)
return result;
MorphicVector<ScopeStateIF> oldScopeStates = frame.scopeStates();
MorphicVector<ScopeStateIF> newScopeStates = scopeStateVectorSimplifier
.simplify(dynamicSimplifier, oldScopeStates);
if (newScopeStates == oldScopeStates) {
result = frame;
} else {
result = frameFactory.frame(frame.location(), newScopeStates);
result = frameFactory.canonic(result);
}
dynamicSimplifier.cacheResult(frame, result);
return result;
}
}