ArrayValueType.java
package edu.udel.cis.vsl.tass.dynamic.impl.type;
import edu.udel.cis.vsl.tass.dynamic.IF.type.ArrayValueTypeIF;
import edu.udel.cis.vsl.tass.dynamic.IF.type.ValueTypeIF;
import edu.udel.cis.vsl.tass.dynamic.IF.value.ArrayValueIF;
import edu.udel.cis.vsl.tass.dynamic.IF.value.ValueIF;
import edu.udel.cis.vsl.tass.dynamic.impl.value.Value;
import edu.udel.cis.vsl.tass.morph.Morphic;
public class ArrayValueType extends ValueType implements ArrayValueTypeIF {
private int dimension;
// TODO: if lengths is null, you don't know dimension! assume 1.
public ArrayValueType(int instanceId, ValueTypeIF baseType, ValueIF lengths) {
super(instanceId, true, new Morphic[] { (ValueType) baseType,
(Value) lengths });
this.dimension = (lengths == null || lengths.valueType().isInteger() ? 1
: ((ArrayValueIF) lengths).valueType().dimension() + 1);
}
/** To be called only in the case dimension = 1, i.e., rectangular array. */
private String dimString(String initString) {
String result = initString
+ (extent() == null ? "[]" : "[" + extent() + "]");
ValueTypeIF elementType = baseType();
if (elementType instanceof ArrayValueType
&& ((ArrayValueType) elementType).dimension == 1) {
result = ((ArrayValueType) baseType()).dimString(result);
} else {
result = elementType.toString() + result;
}
return result;
}
@Override
String stringRecursive() {
if (getFlag())
return "...";
setFlag(true);
if (dimension > 1) {
return baseType() + "<" + dimension + "," + lengthVector() + ">";
} else {
return dimString("");
}
}
@Override
public ValueTypeIF baseType() {
return (ValueTypeIF) getChild(0);
}
@Override
public int dimension() {
return dimension;
}
@Override
public ValueIF extent() {
return (dimension == 1 ? lengthVector()
: ((ArrayValueTypeIF) lengthVector().valueType()).extent());
}
@Override
public ValueIF lengthVector() {
return (ValueIF) getChild(1);
}
}