CommonEnumType.java

package edu.udel.cis.vsl.civl.model.common.type;

import java.math.BigInteger;
import java.util.Map;

import edu.udel.cis.vsl.civl.model.IF.CIVLInternalException;
import edu.udel.cis.vsl.civl.model.IF.CIVLSource;
import edu.udel.cis.vsl.civl.model.IF.type.CIVLEnumType;
import edu.udel.cis.vsl.civl.model.IF.type.CIVLPrimitiveType;
import edu.udel.cis.vsl.civl.model.IF.type.CIVLType;
import edu.udel.cis.vsl.sarl.IF.SymbolicUniverse;
import edu.udel.cis.vsl.sarl.IF.type.SymbolicType;

public class CommonEnumType extends CommonType implements CIVLEnumType {

	private String name;
	private Map<String, BigInteger> valueMap;

	public CommonEnumType(String name, Map<String, BigInteger> valueMap,
			SymbolicType dynamicType) {
		this.name = name;
		this.dynamicType = dynamicType;
		this.valueMap = valueMap;
	}

	@Override
	public boolean hasState() {
		return false;
	}

	@Override
	public SymbolicType getDynamicType(SymbolicUniverse universe) {
		if (dynamicType == null)
			throw new CIVLInternalException(
					"no dynamic type specified for primitive enum " + name,
					(CIVLSource) null);
		return dynamicType;
	}

	@Override
	public String name() {
		return this.name;
	}

	@Override
	public BigInteger valueOf(String member) {
		if (!valueMap.containsKey(member))
			throw new CIVLInternalException("no enumerator " + member
					+ " defined in the enumeration type " + name,
					(CIVLSource) null);
		return valueMap.get(member);
	}

	@Override
	public boolean isEnumerationType() {
		return true;
	}

	@Override
	public String toString() {
		String result = "enum ";

		if (name != null)
			result += (name + " ");
		result += "{";
		for (String member : valueMap.keySet()) {
			result += (member + "=" + valueMap.get(member) + ", ");
		}
		result = result.substring(0, result.length() - 2);
		result += "}";
		return result;
	}

	@Override
	public TypeKind typeKind() {
		return TypeKind.ENUM;
	}

	@Override
	public BigInteger firstValue() {
		for (String key : this.valueMap.keySet()) {
			return this.valueMap.get(key);
		}
		return BigInteger.ZERO;
	}

	@Override
	public CIVLType copyAs(CIVLPrimitiveType type, SymbolicUniverse universe) {
		return type;
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof CIVLEnumType)
			return true;
		return false;
	}

	@Override
	public boolean isScalar() {
		return true;
	}

}