CommonExecutionCharacter.java

package edu.udel.cis.vsl.abc.token.common;

import java.util.Arrays;

import edu.udel.cis.vsl.abc.token.IF.ExecutionCharacter;

public class CommonExecutionCharacter implements ExecutionCharacter {

	private final static int classCode = CommonExecutionCharacter.class
			.hashCode();

	private CharacterKind kind;

	private int codePoint;

	private char[] characters;

	public CommonExecutionCharacter(CharacterKind kind, int codePoint,
			char[] characters) {
		assert kind != null;
		assert characters != null;
		this.kind = kind;
		this.codePoint = codePoint;
		this.characters = characters;
	}

	@Override
	public CharacterKind getCharacterKind() {
		return kind;
	}

	@Override
	public int getCodePoint() {
		return codePoint;
	}

	@Override
	public char[] getCharacters() {
		return characters;
	}

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

			return kind == that.kind && codePoint == that.codePoint
					&& Arrays.equals(characters, that.characters);
		}
		return false;
	}

	@Override
	public int hashCode() {
		return classCode + kind.hashCode() + codePoint
				+ Arrays.hashCode(characters);
	}

	@Override
	public String rawString() {
		int length = characters.length;

		if (length == 1) {
			char c = characters[0];

			switch (c) {
			case 0:
				return "\\0";
			case '\'':
				return "\\\'";
			case '\b':
				return "\\b";
			case '\f':
				return "\\f";
			case '\n':
				return "\\n";
			case '\r':
				return "\\r";
			case '\t':
				return "\\t";
			case '\013':
				return "\\v";
			case ' ':
				return " ";
			case '\007':
				return "\\a";
			default:
			}
			return Character.toString(c);
		} else {
			return "'" + Integer.toHexString(codePoint) + "'";
		}
	}

	@Override
	public String toString() {
		int length = characters.length;

		if (length == 1) {
			char c = characters[0];

			switch (c) {
			case 0:
				return "'\\0'";
			case '\'':
				return "'\\\''";
			case '\b':
				return "'\\b'";
			case '\f':
				return "'\\f'";
			case '\n':
				return "'\\n'";
			case '\r':
				return "'\\r'";
			case '\t':
				return "'\\t'";
			case '\013':
				return "'\\v'";
			case ' ':
				return "' '";
			case '\007':
				return "'\\a'";
			default:
			}
			return Character.toString(c);
		} else {
			return "'" + Integer.toHexString(codePoint) + "'";
		}
	}

}