SymbolicType.java

package edu.udel.cis.vsl.tass.symbolic.type;

import edu.udel.cis.vsl.tass.symbolic.IF.type.SymbolicTypeIF;

/**
 * Implementation of symbolic types using Flyweight Pattern. Note that the enum
 * SymbolicTypeKind is defined in
 * edu.udel.cis.vsl.tass.symbolic.IF.type.SymbolicTypeIF.
 */
public abstract class SymbolicType implements SymbolicTypeIF {

	private SymbolicTypeKind kind;

	private int id = -1;

	/**
	 * Constructs new SymbolicType object with given kind and ID number -1. The
	 * ID number is only used for canonical representatives of the equivalence
	 * class, which is determined only after the object is instantiated and
	 * looked up in a set to see if an equivalent one already exists. This is
	 * the Flyweight pattern.
	 */
	SymbolicType(SymbolicTypeKind kind) {
		assert kind != null;
		this.kind = kind;
	}

	boolean intrinsicEquals(SymbolicType that) {
		return kind == that.kind;
	}

	int intrinsicHashCode() {
		return kind.hashCode();
	}

	public int id() {
		return id;
	}

	void setId(int id) {
		this.id = id;
	}

	public SymbolicTypeKind kind() {
		return kind;
	}

	public boolean isInteger() {
		return kind == SymbolicTypeKind.INTEGER;
	}

	public boolean isBoolean() {
		return kind == SymbolicTypeKind.BOOLEAN;
	}

	public boolean isReal() {
		return kind == SymbolicTypeKind.REAL;
	}

	public boolean isNumeric() {
		return kind == SymbolicTypeKind.INTEGER
				|| kind == SymbolicTypeKind.REAL;
	}

}