CommonSetType.java

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

import edu.udel.cis.vsl.civl.model.IF.CIVLUnimplementedFeatureException;
import edu.udel.cis.vsl.civl.model.IF.type.CIVLPrimitiveType;
import edu.udel.cis.vsl.civl.model.IF.type.CIVLSetType;
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 CommonSetType extends CommonType implements CIVLSetType {

	private CIVLType elementType;

	public CommonSetType(CIVLType elementType) {
		super();
		this.elementType = elementType;
		assert elementType.typeKind() != TypeKind.SET;
	}

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

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

	@Override
	public SymbolicType getDynamicType(SymbolicUniverse universe) {
		throw new CIVLUnimplementedFeatureException(
				"Dynamic type of CIVLSetType");
	}

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

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj instanceof CIVLSetType) {
			CIVLSetType that = (CIVLSetType) obj;

			return this.elementType().equals(that.elementType());
		}
		return false;
	}

	@Override
	public CIVLType elementType() {
		return elementType;
	}

	@Override
	public boolean isSetTypeOf(CIVLType element) {
		return elementType.equals(element);
	}

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

	@Override
	public boolean isSuperTypeOf(CIVLType subtype) {
		return this.elementType.equals(subtype);
	}

	@Override
	public String toString() {
		return "set-of-(" + elementType.toString() + ")";
	}
}