/*******************************************************************************
 * Copyright (c) 2000, 2015 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 java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

import com.sun.jdi.InternalException;
import com.sun.jdi.PrimitiveType;
import com.sun.jdi.PrimitiveValue;

/**
 * this class implements the corresponding interfaces declared by the JDI
 * specification. See the com.sun.jdi package for more information.
 *
 */
public abstract class PrimitiveValueImpl extends ValueImpl implements PrimitiveValue {
	/** Primitive value in wrapper. */
	Object fValue;

	/**
	 * Creates new ValueImpl.
	 */
	public PrimitiveValueImpl(String description, VirtualMachineImpl vmImpl,
			Object value) {
		super(description, vmImpl);
		fValue = value;
	}

	/**
	 * @return Returns Primitive Value converted to required type.
	 */
	@Override
	public boolean booleanValue() {
		if (fValue instanceof Boolean)
			return ((Boolean) fValue).booleanValue();
		else if (fValue instanceof Character)
			return ((Character) fValue).charValue() != 0;
		else
			return ((Number) fValue).doubleValue() != 0;
	}

	/**
	 * @return Returns Primitive Value converted to required type.
	 */
	@Override
	public char charValue() {
		if (fValue instanceof Boolean)
			return ((Boolean) fValue).booleanValue() ? (char) 1 : (char) 0;
		else if (fValue instanceof Character)
			return ((Character) fValue).charValue();
		else
			return (char) ((Number) fValue).intValue();
	}

	/**
	 * @return Returns Primitive Value converted to required type.
	 */
	@Override
	public byte byteValue() {
		if (fValue instanceof Boolean)
			return ((Boolean) fValue).booleanValue() ? (byte) 1 : (byte) 0;
		else if (fValue instanceof Character)
			return (byte) ((Character) fValue).charValue();
		else
			return ((Number) fValue).byteValue();
	}

	/**
	 * @return Returns Primitive Value converted to required type.
	 */
	@Override
	public double doubleValue() {
		if (fValue instanceof Boolean)
			return ((Boolean) fValue).booleanValue() ? (double) 1 : (double) 0;
		else if (fValue instanceof Character)
			return ((Character) fValue).charValue();
		else
			return ((Number) fValue).doubleValue();
	}

	/**
	 * @return Returns Primitive Value converted to required type.
	 */
	@Override
	public float floatValue() {
		if (fValue instanceof Boolean)
			return ((Boolean) fValue).booleanValue() ? (float) 1 : (float) 0;
		else if (fValue instanceof Character)
			return ((Character) fValue).charValue();
		else
			return ((Number) fValue).floatValue();
	}

	/**
	 * @return Returns Primitive Value converted to required type.
	 */
	@Override
	public int intValue() {
		if (fValue instanceof Boolean)
			return ((Boolean) fValue).booleanValue() ? (int) 1 : (int) 0;
		else if (fValue instanceof Character)
			return ((Character) fValue).charValue();
		else
			return ((Number) fValue).intValue();
	}

	/**
	 * @return Returns Primitive Value converted to required type.
	 */
	@Override
	public long longValue() {
		if (fValue instanceof Boolean)
			return ((Boolean) fValue).booleanValue() ? (long) 1 : (long) 0;
		else if (fValue instanceof Character)
			return ((Character) fValue).charValue();
		else
			return ((Number) fValue).longValue();
	}

	/**
	 * @return Returns Primitive Value converted to required type.
	 */
	@Override
	public short shortValue() {
		if (fValue instanceof Boolean)
			return ((Boolean) fValue).booleanValue() ? (short) 1 : (short) 0;
		else if (fValue instanceof Character)
			return (short) ((Character) fValue).charValue();
		else
			return ((Number) fValue).shortValue();
	}

	/**
	 * @return Returns true if two values are equal.
	 * @see java.lang.Object#equals(Object)
	 */
	@Override
	public boolean equals(Object object) {
		return object != null && object.getClass().equals(this.getClass())
				&& fValue.equals(((PrimitiveValueImpl) object).fValue);
	}

	/**
	 * @return Returns a has code for this object.
	 * @see java.lang.Object#hashCode
	 */
	@Override
	public int hashCode() {
		return fValue.hashCode();
	}

	/**
	 * @return Returns description of Mirror object.
	 */
	@Override
	public String toString() {
		return fValue.toString();
	}

	/**
	 * Writes value without value tag.
	 */
	@Override
	public abstract void write(MirrorImpl target, DataOutputStream out)
			throws IOException;

	/**
	 * @return Reads JDWP representation and returns new instance.
	 */
	public static PrimitiveValueImpl readWithoutTag(MirrorImpl target,
			PrimitiveType type, DataInputStream in) throws IOException {
		switch (((PrimitiveTypeImpl) type).tag()) {
		case 0:
			return null;
		case BooleanValueImpl.tag:
			return BooleanValueImpl.read(target, in);
		case ByteValueImpl.tag:
			return ByteValueImpl.read(target, in);
		case CharValueImpl.tag:
			return CharValueImpl.read(target, in);
		case DoubleValueImpl.tag:
			return DoubleValueImpl.read(target, in);
		case FloatValueImpl.tag:
			return FloatValueImpl.read(target, in);
		case IntegerValueImpl.tag:
			return IntegerValueImpl.read(target, in);
		case LongValueImpl.tag:
			return LongValueImpl.read(target, in);
		case ShortValueImpl.tag:
			return ShortValueImpl.read(target, in);
		}
		throw new InternalException(
				JDIMessages.PrimitiveValueImpl_Invalid_Primitive_Value_tag_encountered___2
						+ type);
	}
}
