ArrayFactory.java
package edu.udel.cis.vsl.tass.symbolic.array;
import java.util.HashMap;
import java.util.Map;
import edu.udel.cis.vsl.tass.symbolic.IF.tree.TreeExpressionIF;
import edu.udel.cis.vsl.tass.symbolic.IF.type.SymbolicCompleteArrayTypeIF;
import edu.udel.cis.vsl.tass.symbolic.concrete.ConcreteFactory;
import edu.udel.cis.vsl.tass.symbolic.expression.SymbolicExpression;
import edu.udel.cis.vsl.tass.symbolic.expression.SymbolicExpressionKey;
public class ArrayFactory {
private ConcreteFactory concreteFactory;
private Map<SymbolicExpressionKey<ArrayRead>, ArrayRead> arrayReadMap = new HashMap<SymbolicExpressionKey<ArrayRead>, ArrayRead>();
private Map<SymbolicExpressionKey<ArrayLength>, ArrayLength> arrayLengthMap = new HashMap<SymbolicExpressionKey<ArrayLength>, ArrayLength>();
private Map<SymbolicExpressionKey<ArrayWrite>, ArrayWrite> arrayWriteMap = new HashMap<SymbolicExpressionKey<ArrayWrite>, ArrayWrite>();
private Map<SymbolicExpressionKey<ArrayExpression>, ArrayExpression> arrayExpressionMap = new HashMap<SymbolicExpressionKey<ArrayExpression>, ArrayExpression>();
private Map<SymbolicExpressionKey<ArrayLambdaExpression>, ArrayLambdaExpression> arrayLambdaExpressionMap = new HashMap<SymbolicExpressionKey<ArrayLambdaExpression>, ArrayLambdaExpression>();
public ArrayFactory(ConcreteFactory concreteFactory) {
this.concreteFactory = concreteFactory;
}
public ArrayRead arrayRead(TreeExpressionIF array, TreeExpressionIF index) {
return SymbolicExpression.flyweight(arrayReadMap, new ArrayRead(array,
index));
}
public ArrayLength arrayLength(TreeExpressionIF array) {
return SymbolicExpression.flyweight(arrayLengthMap, new ArrayLength(
array, concreteFactory.typeFactory().integerType()));
}
public ArrayWrite arrayWrite(TreeExpressionIF array,
TreeExpressionIF index, TreeExpressionIF value) {
return SymbolicExpression.flyweight(arrayWriteMap, new ArrayWrite(
array, index, value));
}
public ArrayWrite arrayWrite(TreeExpressionIF array, int index,
TreeExpressionIF value) {
return arrayWrite(array, concreteFactory.concrete(index), value);
}
public ArrayRead arrayRead(TreeExpressionIF array, int index) {
return arrayRead(array, concreteFactory.concrete(index));
}
public ArrayExpression arrayExpression(TreeExpressionIF origin,
TreeExpressionIF[] elements) {
return SymbolicExpression.flyweight(arrayExpressionMap,
new ArrayExpression(origin, elements, this));
}
public ArrayLambdaExpression arrayLambdaExpression(
SymbolicCompleteArrayTypeIF arrayType, TreeExpressionIF function) {
return SymbolicExpression.flyweight(arrayLambdaExpressionMap,
new ArrayLambdaExpression(arrayType, function));
}
}