package gov.nasa.jpf.vm.va;
import java.util.ArrayList;
import java.util.List;
import de.fosd.typechef.featureexpr.FeatureExpr;
public class StackHandlerFactory {
public enum SHFactory {
Default, Hybid, Buffered
}
public static List<Object> asParameter() {
List<Object> factorys = new ArrayList<>();
for (Object f : SHFactory.values()) {
factorys.add(f);
}
return factorys;
}
public static void setFactory(SHFactory factory) {
switch (factory) {
case Buffered:
activateBufferedStackHandler();
break;
case Default:
activateDefaultStackHandler();
break;
case Hybid:
activateHybridStackHandler();
break;
default:
throw new RuntimeException(factory + " not supported");
}
}
static Factory f = new HybridStackHandlerFactory();
public static Factory getCurrent() {
return f;
}
public static IStackHandler createStack(FeatureExpr ctx, int nLocals, int nOperands) {
return f.createStack(ctx, nLocals, nOperands);
}
public static IStackHandler createStack() {
return f.createStack();
}
public static void activateBufferedStackHandler() {
f = new BufferedStackHandlerFactory();
}
public static void activateOneStackHandler() {
f = new OneStackHandlerFactory();
}
public static void activateJPFStackHandler() {
f = new JPFStackHandlerFactory();
}
public static void activateHybridStackHandler() {
f = new HybridStackHandlerFactory();
}
public static void activateDefaultStackHandler() {
f = new DefaultStackHandlerFactory();
}
}
interface Factory {
IStackHandler createStack(FeatureExpr ctx, int nLocals, int nOperands);
IStackHandler createStack();
}
class OneStackHandlerFactory implements Factory {
@Override
public IStackHandler createStack(FeatureExpr ctx, int nLocals, int nOperands) {
return new OneStackHandler(ctx, nLocals, nOperands);
}
@Override
public IStackHandler createStack() {
return new OneStackHandler();
}
@Override
public String toString() {
return getClass().getSimpleName();
}
}
class JPFStackHandlerFactory implements Factory {
@Override
public IStackHandler createStack(FeatureExpr ctx, int nLocals, int nOperands) {
return new JPFStackHandler(ctx, nLocals, nOperands);
}
@Override
public IStackHandler createStack() {
return new JPFStackHandler();
}
@Override
public String toString() {
return getClass().getSimpleName();
}
}
class DefaultStackHandlerFactory implements Factory {
@Override
public IStackHandler createStack(FeatureExpr ctx, int nLocals, int nOperands) {
return new StackHandler(ctx, nLocals, nOperands);
}
@Override
public IStackHandler createStack() {
return new StackHandler();
}
@Override
public String toString() {
return StackHandler.class.getSimpleName();
}
}
class BufferedStackHandlerFactory implements Factory {
@Override
public IStackHandler createStack(FeatureExpr ctx, int nLocals, int nOperands) {
return new BufferedStackHandler(ctx, nLocals, nOperands);
}
@Override
public IStackHandler createStack() {
return new BufferedStackHandler();
}
}
class HybridStackHandlerFactory implements Factory {
@Override
public IStackHandler createStack(FeatureExpr ctx, int nLocals, int nOperands) {
return new HybridStackHandler(ctx, nLocals, nOperands);
}
@Override
public IStackHandler createStack() {
return new HybridStackHandler();
}
@Override
public String toString() {
return getClass().getSimpleName() + "(" +HybridStackHandler.normalStack + " -> " + HybridStackHandler.liftedStack + ")";
}
}