/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdi.internal;


import com.sun.jdi.PrimitiveType;

/**
 * this class implements the corresponding interfaces
 * declared by the JDI specification. See the com.sun.jdi package
 * for more information.
 *
 */
public abstract class PrimitiveTypeImpl extends TypeImpl implements PrimitiveType {
	/**
	 * Creates new instance.
	 */
	public PrimitiveTypeImpl(String description, VirtualMachineImpl vmImpl, String name, String signature) {
		super(description, vmImpl, name, signature);
	}
	
	/**
	 * Creates new instance based on primitive signature.
	 */
	public static PrimitiveTypeImpl create(VirtualMachineImpl vmImpl, String signature) {
		// Notice that Primitive Types are not stored or cached because they don't 'remember' any information.

		// See JNI 1.1 Specification, Table 3-2 Java VM Type Signatures.
		switch (signature.charAt(0)) {
			case 'Z': return new BooleanTypeImpl(vmImpl);
			case 'B': return new ByteTypeImpl(vmImpl);
			case 'C': return new CharTypeImpl(vmImpl);
			case 'S': return new ShortTypeImpl(vmImpl);
			case 'I': return new IntegerTypeImpl(vmImpl);
			case 'J': return new LongTypeImpl(vmImpl);
			case 'F': return new FloatTypeImpl(vmImpl);
			case 'D': return new DoubleTypeImpl(vmImpl);
		}
		throw new InternalError(JDIMessages.PrimitiveTypeImpl_Invalid_primitive_signature____1 + signature + JDIMessages.PrimitiveTypeImpl___2); // 
	}
	
	/**
	 * @returns primitive type tag.
	 */
	public abstract byte tag();

	/**
	 * @return Returns modifier bits.
	 */
	public int modifiers() {
		throw new InternalError(JDIMessages.PrimitiveTypeImpl_A_PrimitiveType_does_not_have_modifiers_3); 
	}
	
	/* (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    public boolean equals(Object obj) {
        return obj instanceof PrimitiveTypeImpl
          && tag() == ((PrimitiveTypeImpl)obj).tag()
          && virtualMachine().equals(((PrimitiveTypeImpl)obj).virtualMachine());
    }
}
