/*
* This file is part of the X10 project (http://x10-lang.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.opensource.org/licenses/eclipse-1.0.php
*
* (C) Copyright IBM Corporation 2006-2011.
*/
package x10.rtt;
import x10.core.Any;
public class Types {
public static RuntimeType/*<?>*/ getRTT(Class<?> impl) {
return RuntimeType.make(impl);
}
public static RuntimeType/*<?>*/ getRTT(Object obj) {
RuntimeType<?> rtt = null;
if (obj instanceof Any) {
rtt = ((Any) obj).$getRTT();
} else if (obj != null) {
// rtt for raw Java classes
rtt = getRTT(obj.getClass());
}
return rtt;
}
public static Type<?> getParam(Object obj, int i) {
if (obj instanceof Any) {
return ((Any) obj).$getParam(i);
}
assert false;
return null;
}
// XTENLANG-2488
// get $RTT field from class using reflection
public static <T> RuntimeType<T> $RTT(Class<?> c) {
RuntimeType<T> rtt = null;
try {
java.lang.reflect.Field rttField = c.getField("$RTT");
if (rttField != null) {
rtt = (RuntimeType<T>) rttField.get(null);
}
} catch (Exception e) {
}
return rtt;
}
// Fast implementation of Any.typeName() without boxing
public static String typeName(Object obj) {
return getRTT(obj).typeName(obj);
}
public static String typeName(boolean value) {
return BOOLEAN.typeName();
}
public static String typeName(char value) {
return CHAR.typeName();
}
// N.B. typeName({byte,short,int,long}) are for signed types.
public static String typeName(byte value) {
return BYTE.typeName();
}
public static String typeName(short value) {
return SHORT.typeName();
}
public static String typeName(int value) {
return INT.typeName();
}
public static String typeName(long value) {
return LONG.typeName();
}
public static String typeName(float value) {
return FLOAT.typeName();
}
public static String typeName(double value) {
return DOUBLE.typeName();
}
// Fast implementation of Any.hashCode() without boxing
// N.B. hashCode for unsigned types are same as those for signed types
public static int hashCode(Object value) {
return value.hashCode();
}
public static int hashCode(boolean value) {
return value ? 1231 : 1237;
}
// public static int hashCode(char value) {
// return value;
// }
// public static int hashCode(byte value) {
// return value;
// }
// public static int hashCode(short value) {
// return value;
// }
public static int hashCode(int value) {
// for char, byte, short and int
return value;
}
public static int hashCode(long value) {
return (int)(value ^ (value >>> 32));
}
public static int hashCode(float value) {
return Float.floatToIntBits(value);
}
public static int hashCode(double value) {
long bits = Double.doubleToLongBits(value);
return (int)(bits ^ (bits >>> 32));
}
// Fast implementation of Any.toString() without boxing
public static String toString(Object value) {
return value.toString();
}
// not used because primitives has their own @Native and they are boxed when converted to Any
public static String toString(boolean value) {
return Boolean.toString(value);
}
public static String toString(char value) {
return Character.toString(value);
}
// public static String toString(byte value) {
// return Integer.toString(value);
// }
// public static String toString(short value) {
// return Integer.toString(value);
// }
public static String toString(int value) {
// for byte, short and int
return Integer.toString(value);
}
public static String toString(long value) {
return Long.toString(value);
}
public static String toString(float value) {
return Float.toString(value);
}
public static String toString(double value) {
return Double.toString(value);
}
// box java primitives to x10 boxed types
public static Object $box(Object o) {
if (o instanceof java.lang.Byte) {
return x10.core.Byte.$box(((java.lang.Byte) o).byteValue());
}
if (o instanceof java.lang.Short) {
return x10.core.Short.$box(((java.lang.Short) o).shortValue());
}
if (o instanceof java.lang.Integer) {
return x10.core.Int.$box(((java.lang.Integer) o).intValue());
}
if (o instanceof java.lang.Long) {
return x10.core.Long.$box(((java.lang.Long) o).longValue());
}
if (o instanceof java.lang.Float) {
return x10.core.Float.$box(((java.lang.Float) o).floatValue());
}
if (o instanceof java.lang.Double) {
return x10.core.Double.$box(((java.lang.Double) o).doubleValue());
}
if (o instanceof java.lang.Character) {
return x10.core.Char.$box(((java.lang.Character) o).charValue());
}
if (o instanceof java.lang.Boolean) {
return x10.core.Boolean.$box(((java.lang.Boolean) o).booleanValue());
}
return o;
}
public static x10.core.Byte $box(byte o) {
return x10.core.Byte.$box(o);
}
public static x10.core.Short $box(short o) {
return x10.core.Short.$box(o);
}
public static x10.core.Int $box(int o) {
return x10.core.Int.$box(o);
}
public static x10.core.Long $box(long o) {
return x10.core.Long.$box(o);
}
public static x10.core.Float $box(float o) {
return x10.core.Float.$box(o);
}
public static x10.core.Double $box(double o) {
return x10.core.Double.$box(o);
}
public static x10.core.Char $box(char o) {
return x10.core.Char.$box(o);
}
public static x10.core.Boolean $box(boolean o) {
return x10.core.Boolean.$box(o);
}
public static Object $boxu(Object o) {
if (o instanceof java.lang.Byte) {
return x10.core.UByte.$box(((java.lang.Byte) o).byteValue());
}
if (o instanceof java.lang.Short) {
return x10.core.UShort.$box(((java.lang.Short) o).shortValue());
}
if (o instanceof java.lang.Integer) {
return x10.core.UInt.$box(((java.lang.Integer) o).intValue());
}
if (o instanceof java.lang.Long) {
return x10.core.ULong.$box(((java.lang.Long) o).longValue());
}
assert !(o instanceof java.lang.Float);
assert !(o instanceof java.lang.Double);
assert !(o instanceof java.lang.Character);
assert !(o instanceof java.lang.Boolean);
assert !(o instanceof java.lang.String);
// if (o instanceof java.lang.Float) {
// return x10.core.Float.$box(((java.lang.Float) o).floatValue());
// }
// if (o instanceof java.lang.Double) {
// return x10.core.Double.$box(((java.lang.Double) o).doubleValue());
// }
// if (o instanceof java.lang.Character) {
// return x10.core.Char.$box(((java.lang.Character) o).charValue());
// }
// if (o instanceof java.lang.Boolean) {
// return x10.core.Boolean.$box(((java.lang.Boolean) o).booleanValue());
// }
// if (o instanceof java.lang.String) {
// return x10.core.String.$box((java.lang.String) o);
// }
return o;
}
public static x10.core.UByte $boxu(byte o) {
return x10.core.UByte.$box(o);
}
public static x10.core.UShort $boxu(short o) {
return x10.core.UShort.$box(o);
}
public static x10.core.UInt $boxu(int o) {
return x10.core.UInt.$box(o);
}
public static x10.core.ULong $boxu(long o) {
return x10.core.ULong.$box(o);
}
/*
* returns runtime type for known types.
* mainly for primitives, string and exceptions.
*/
public static RuntimeType/*<?>*/ getRTTForKnownType(Class<?> javaClass) {
if (java.lang.Object.class.equals(javaClass)) {
return ANY;
} else if (java.lang.String.class.equals(javaClass)) {
return STRING;
} else if (java.lang.Comparable.class.equals(javaClass)) {
return COMPARABLE;
} else if (javaClass.isPrimitive()) {
if (byte.class.equals(javaClass)) {
return BYTE;
} else if (short.class.equals(javaClass)) {
return SHORT;
} else if (int.class.equals(javaClass)) {
return INT;
} else if (long.class.equals(javaClass)) {
return LONG;
} else if (float.class.equals(javaClass)) {
return FLOAT;
} else if (double.class.equals(javaClass)) {
return DOUBLE;
} else if (char.class.equals(javaClass)) {
return CHAR;
} else if (boolean.class.equals(javaClass)) {
return BOOLEAN;
}
} else if (java.lang.Throwable.class.isAssignableFrom(javaClass)) {
if (java.lang.RuntimeException.class.isAssignableFrom(javaClass)) {
if (java.lang.NullPointerException.class.equals(javaClass)) {
return NULL_POINTER_EXCEPTION;
} else if (java.lang.ClassCastException.class.equals(javaClass)) {
return CLASS_CAST_EXCEPTION;
} else if (java.lang.ArithmeticException.class.equals(javaClass)) {
return ARITHMETIC_EXCEPTION;
} else if (java.lang.UnsupportedOperationException.class.equals(javaClass)) {
return UNSUPPORTED_OPERATION_EXCEPTION;
} else if (java.util.NoSuchElementException.class.equals(javaClass)) {
return NO_SUCH_ELEMENT_EXCEPTION;
} else if (java.lang.ArrayIndexOutOfBoundsException.class.equals(javaClass)) {
return ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION;
} else if (java.lang.StringIndexOutOfBoundsException.class.equals(javaClass)) {
return STRING_INDEX_OUT_OF_BOUNDS_EXCEPTION;
} else if (java.lang.IndexOutOfBoundsException.class.equals(javaClass)) {
return INDEX_OUT_OF_BOUNDS_EXCEPTION;
} else if (java.lang.NumberFormatException.class.equals(javaClass)) {
return NUMBER_FORMAT_EXCEPTION;
} else if (java.lang.IllegalArgumentException.class.equals(javaClass)) {
return ILLEGAL_ARGUMENT_EXCEPTION;
} else if (java.lang.IllegalStateException.class.equals(javaClass)) {
return ILLEGAL_STATE_EXCEPTION;
} else if (java.lang.RuntimeException.class.equals(javaClass)) {
return EXCEPTION;
}
} else if (java.lang.Exception.class.isAssignableFrom(javaClass)) {
if (java.lang.Exception.class.equals(javaClass)) {
return CHECKED_EXCEPTION;
}
} else if (java.lang.Error.class.isAssignableFrom(javaClass)) {
if (java.lang.InternalError.class.equals(javaClass)) {
return INTERNAL_ERROR;
} else if (java.lang.OutOfMemoryError.class.equals(javaClass)) {
return OUT_OF_MEMORY_ERROR;
} else if (java.lang.StackOverflowError.class.equals(javaClass)) {
return STACK_OVERFLOW_ERROR;
} else if (java.lang.AssertionError.class.equals(javaClass)) {
return ASSERTION_ERROR;
} else if (java.lang.Error.class.equals(javaClass)) {
return ERROR;
}
} else {
if (java.lang.Throwable.class.equals(javaClass)) {
return CHECKED_THROWABLE;
}
}
}
return null;
}
public static final RuntimeType<Object> ANY = new AnyType();
// Struct is not an X10 type, but it has RTT for runtime type checking such as instanceof
// create rtt of struct before all struct types (e.g. int)
public static final RuntimeType<x10.core.StructI> STRUCT = new StructType();
// create rtt of comparable before all types that implement comparable (e.g. int)
public static final RuntimeType<Comparable> COMPARABLE = new NamedType<Comparable>(
"x10.lang.Comparable",
Comparable.class,
RuntimeType.INVARIANTS(1),
null
) {
// make sure deserialized RTT object is not duplicated
private Object readResolve() throws java.io.ObjectStreamException {
return COMPARABLE;
}
};
public static final RuntimeType<java.lang.Throwable> CHECKED_THROWABLE = new NamedType<java.lang.Throwable>(
"x10.lang.CheckedThrowable",
java.lang.Throwable.class,
null,
new Type[] { ANY }
) {
// make sure deserialized RTT object is not duplicated
private Object readResolve() throws java.io.ObjectStreamException {
return CHECKED_THROWABLE;
}
};
public static final RuntimeType<java.lang.Exception> CHECKED_EXCEPTION = new NamedType<java.lang.Exception>(
"x10.lang.CheckedException",
java.lang.Exception.class,
null,
new Type[] { CHECKED_THROWABLE }
) {
// make sure deserialized RTT object is not duplicated
private Object readResolve() throws java.io.ObjectStreamException {
return CHECKED_EXCEPTION;
}
};
public static final RuntimeType<java.lang.RuntimeException> EXCEPTION = new NamedType<java.lang.RuntimeException>(
"x10.lang.Exception",
java.lang.RuntimeException.class,
null,
new Type[] { CHECKED_EXCEPTION }
) {
// make sure deserialized RTT object is not duplicated
private Object readResolve() throws java.io.ObjectStreamException {
return EXCEPTION;
}
};
public static final RuntimeType<java.lang.NullPointerException> NULL_POINTER_EXCEPTION = new NamedType<java.lang.NullPointerException>(
"x10.lang.NullPointerException",
java.lang.NullPointerException.class,
null,
new Type[] { EXCEPTION }
) {
// make sure deserialized RTT object is not duplicated
private Object readResolve() throws java.io.ObjectStreamException {
return NULL_POINTER_EXCEPTION;
}
};
public static final RuntimeType<java.lang.ClassCastException> CLASS_CAST_EXCEPTION = new NamedType<java.lang.ClassCastException>(
"x10.lang.ClassCastException",
java.lang.ClassCastException.class,
null,
new Type[] { EXCEPTION }
) {
// make sure deserialized RTT object is not duplicated
private Object readResolve() throws java.io.ObjectStreamException {
return CLASS_CAST_EXCEPTION;
}
};
public static final RuntimeType<java.lang.IndexOutOfBoundsException> INDEX_OUT_OF_BOUNDS_EXCEPTION = new NamedType<java.lang.IndexOutOfBoundsException>(
"x10.lang.IndexOutOfBoundsException",
java.lang.IndexOutOfBoundsException.class,
null,
new Type[] { EXCEPTION }
) {
// make sure deserialized RTT object is not duplicated
private Object readResolve() throws java.io.ObjectStreamException {
return INDEX_OUT_OF_BOUNDS_EXCEPTION;
}
};
public static final RuntimeType<java.lang.ArrayIndexOutOfBoundsException> ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION = new NamedType<java.lang.ArrayIndexOutOfBoundsException>(
"x10.lang.ArrayIndexOutOfBoundsException",
java.lang.ArrayIndexOutOfBoundsException.class,
null,
new Type[] { INDEX_OUT_OF_BOUNDS_EXCEPTION }
) {
// make sure deserialized RTT object is not duplicated
private Object readResolve() throws java.io.ObjectStreamException {
return ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION;
}
};
public static final RuntimeType<java.lang.StringIndexOutOfBoundsException> STRING_INDEX_OUT_OF_BOUNDS_EXCEPTION = new NamedType<java.lang.StringIndexOutOfBoundsException>(
"x10.lang.StringIndexOutOfBoundsException",
java.lang.StringIndexOutOfBoundsException.class,
null,
new Type[] { INDEX_OUT_OF_BOUNDS_EXCEPTION }
) {
// make sure deserialized RTT object is not duplicated
private Object readResolve() throws java.io.ObjectStreamException {
return STRING_INDEX_OUT_OF_BOUNDS_EXCEPTION;
}
};
public static final RuntimeType<java.lang.ArithmeticException> ARITHMETIC_EXCEPTION = new NamedType<java.lang.ArithmeticException>(
"x10.lang.ArithmeticException",
java.lang.ArithmeticException.class,
null,
new Type[] { EXCEPTION }
) {
// make sure deserialized RTT object is not duplicated
private Object readResolve() throws java.io.ObjectStreamException {
return ARITHMETIC_EXCEPTION;
}
};
public static final RuntimeType<java.lang.IllegalStateException> ILLEGAL_STATE_EXCEPTION = new NamedType<java.lang.IllegalStateException>(
"x10.lang.IllegalStateException",
java.lang.IllegalStateException.class,
null,
new Type[] { EXCEPTION }
) {
// make sure deserialized RTT object is not duplicated
private Object readResolve() throws java.io.ObjectStreamException {
return ILLEGAL_STATE_EXCEPTION;
}
};
public static final RuntimeType<java.lang.IllegalArgumentException> ILLEGAL_ARGUMENT_EXCEPTION = new NamedType<java.lang.IllegalArgumentException>(
"x10.lang.IllegalArgumentException",
java.lang.IllegalArgumentException.class,
null,
new Type[] { EXCEPTION }
) {
// make sure deserialized RTT object is not duplicated
private Object readResolve() throws java.io.ObjectStreamException {
return ILLEGAL_ARGUMENT_EXCEPTION;
}
};
public static final RuntimeType<java.lang.NumberFormatException> NUMBER_FORMAT_EXCEPTION = new NamedType<java.lang.NumberFormatException>(
"x10.lang.NumberFormatException",
java.lang.NumberFormatException.class,
null,
new Type[] { ILLEGAL_ARGUMENT_EXCEPTION }
) {
// make sure deserialized RTT object is not duplicated
private Object readResolve() throws java.io.ObjectStreamException {
return NUMBER_FORMAT_EXCEPTION;
}
};
public static final RuntimeType<java.lang.UnsupportedOperationException> UNSUPPORTED_OPERATION_EXCEPTION = new NamedType<java.lang.UnsupportedOperationException>(
"x10.lang.UnsupportedOperationException",
java.lang.UnsupportedOperationException.class,
null,
new Type[] { EXCEPTION }
) {
// make sure deserialized RTT object is not duplicated
private Object readResolve() throws java.io.ObjectStreamException {
return UNSUPPORTED_OPERATION_EXCEPTION;
}
};
public static final RuntimeType<java.util.NoSuchElementException> NO_SUCH_ELEMENT_EXCEPTION = new NamedType<java.util.NoSuchElementException>(
"x10.util.NoSuchElementException",
java.util.NoSuchElementException.class,
null,
new Type[] { EXCEPTION }
) {
// make sure deserialized RTT object is not duplicated
private Object readResolve() throws java.io.ObjectStreamException {
return NO_SUCH_ELEMENT_EXCEPTION;
}
};
public static final RuntimeType<java.lang.Error> ERROR = new NamedType<java.lang.Error>(
"x10.lang.Error",
java.lang.Error.class,
null,
new Type[] { CHECKED_THROWABLE }
) {
// make sure deserialized RTT object is not duplicated
private Object readResolve() throws java.io.ObjectStreamException {
return ERROR;
}
};
public static final RuntimeType<java.lang.AssertionError> ASSERTION_ERROR = new NamedType<java.lang.AssertionError>(
"x10.lang.AssertionError",
java.lang.AssertionError.class,
null,
new Type[] { ERROR }
) {
// make sure deserialized RTT object is not duplicated
private Object readResolve() throws java.io.ObjectStreamException {
return ASSERTION_ERROR;
}
};
public static final RuntimeType<java.lang.StackOverflowError> STACK_OVERFLOW_ERROR = new NamedType<java.lang.StackOverflowError>(
"x10.lang.StackOverflowError",
java.lang.StackOverflowError.class,
null,
new Type[] { ERROR }
) {
// make sure deserialized RTT object is not duplicated
private Object readResolve() throws java.io.ObjectStreamException {
return STACK_OVERFLOW_ERROR;
}
};
public static final RuntimeType<java.lang.OutOfMemoryError> OUT_OF_MEMORY_ERROR = new NamedType<java.lang.OutOfMemoryError>(
"x10.lang.OutOfMemoryError",
java.lang.OutOfMemoryError.class,
null,
new Type[] { ERROR }
) {
// make sure deserialized RTT object is not duplicated
private Object readResolve() throws java.io.ObjectStreamException {
return OUT_OF_MEMORY_ERROR;
}
};
public static final RuntimeType<java.lang.InternalError> INTERNAL_ERROR = new NamedType<java.lang.InternalError>(
"x10.lang.InternalError",
java.lang.InternalError.class,
null,
new Type[] { ERROR }
) {
// make sure deserialized RTT object is not duplicated
private Object readResolve() throws java.io.ObjectStreamException {
return INTERNAL_ERROR;
}
};
public static final RuntimeType<x10.core.Boolean> BOOLEAN = new BooleanType();
public static final RuntimeType<x10.core.Char> CHAR = new CharType();
public static final RuntimeType<x10.core.Byte> BYTE = new ByteType();
public static final RuntimeType<x10.core.Short> SHORT = new ShortType();
public static final RuntimeType<x10.core.Int> INT = new IntType();
public static final RuntimeType<x10.core.Long> LONG = new LongType();
public static final RuntimeType<x10.core.Float> FLOAT = new FloatType();
public static final RuntimeType<x10.core.Double> DOUBLE = new DoubleType();
public static final RuntimeType<x10.core.UByte> UBYTE = new UByteType();
public static final RuntimeType<x10.core.UShort> USHORT = new UShortType();
public static final RuntimeType<x10.core.UInt> UINT = new UIntType();
public static final RuntimeType<x10.core.ULong> ULONG = new ULongType();
public static final x10.core.Boolean BOOLEAN_ZERO = x10.core.Boolean.FALSE;
public static final x10.core.Char CHAR_ZERO = x10.core.Char.$box((char)0);
public static final x10.core.Byte BYTE_ZERO = x10.core.Byte.$box(0);
public static final x10.core.Short SHORT_ZERO = x10.core.Short.$box(0);
public static final x10.core.Int INT_ZERO = x10.core.Int.$box(0);
public static final x10.core.Long LONG_ZERO = x10.core.Long.$box(0l);
public static final x10.core.Float FLOAT_ZERO = x10.core.Float.$box(0.0F);
public static final x10.core.Double DOUBLE_ZERO = x10.core.Double.$box(0.0);
public static final x10.core.UByte UBYTE_ZERO = x10.core.UByte.$box((byte)0);
public static final x10.core.UShort USHORT_ZERO = x10.core.UShort.$box((short)0);
public static final x10.core.UInt UINT_ZERO = x10.core.UInt.$box(0);
public static final x10.core.ULong ULONG_ZERO = x10.core.ULong.$box((long)0);
public static final RuntimeType<String> STRING = new StringType();
static boolean isNumericType(Type<?> rtt) {
if (rtt == BYTE || rtt == SHORT || rtt == INT || rtt == LONG ||
rtt == UBYTE || rtt == USHORT || rtt == UINT || rtt == ULONG ||
rtt == FLOAT || rtt == DOUBLE) {
return true;
}
return false;
}
public static boolean isPrimitiveType(Type<?> rtt) {
return isNumericType(rtt) || rtt == CHAR || rtt == BOOLEAN;
}
static boolean isStructType(Type<?> rtt) {
return isPrimitiveType(rtt) || rtt.isAssignableTo(STRUCT);
}
public static boolean isStringType(Type<?> rtt) {
return rtt == STRING;
}
public static boolean asboolean(Object typeParamOrAny, Type<?> origRTT) {
if (typeParamOrAny == null) {nullIsCastToStruct("x10.lang.Boolean");}
if (typeParamOrAny instanceof x10.core.Boolean) return x10.core.Boolean.$unbox((x10.core.Boolean)typeParamOrAny);
else if (typeParamOrAny instanceof java.lang.Boolean) {return (java.lang.Boolean) typeParamOrAny;}
throw new java.lang.ClassCastException("x10.lang.Boolean");
}
public static char aschar(Object typeParamOrAny, Type<?> origRTT) {
if (typeParamOrAny == null) {nullIsCastToStruct("x10.lang.Char");}
if (typeParamOrAny instanceof x10.core.Char) return x10.core.Char.$unbox((x10.core.Char)typeParamOrAny);
else if (typeParamOrAny instanceof java.lang.Character) {return (java.lang.Character) typeParamOrAny;}
throw new java.lang.ClassCastException("x10.lang.Char");
}
public static byte asbyte(Object typeParamOrAny, Type<?> origRTT){
if (typeParamOrAny == null) {nullIsCastToStruct("x10.lang.Byte");}
if (isNumericType(origRTT)) {
return ((java.lang.Number) typeParamOrAny).byteValue();
} else {
if (typeParamOrAny instanceof x10.core.Byte) return x10.core.Byte.$unbox((x10.core.Byte)typeParamOrAny);
else if (typeParamOrAny instanceof java.lang.Byte) {return (java.lang.Byte) typeParamOrAny;}
}
throw new java.lang.ClassCastException("x10.lang.Byte");
}
public static short asshort(Object typeParamOrAny, Type<?> origRTT){
if (typeParamOrAny == null) {nullIsCastToStruct("x10.lang.Short");}
if (isNumericType(origRTT)) {
return ((java.lang.Number) typeParamOrAny).shortValue();
} else {
if (typeParamOrAny instanceof x10.core.Short) return x10.core.Short.$unbox((x10.core.Short)typeParamOrAny);
else if (typeParamOrAny instanceof java.lang.Short) {return (java.lang.Short) typeParamOrAny;}
}
throw new java.lang.ClassCastException("x10.lang.Short");
}
public static int asint(Object typeParamOrAny, Type<?> origRTT){
if (typeParamOrAny == null) {nullIsCastToStruct("x10.lang.Int");}
if (isNumericType(origRTT)) {
return ((java.lang.Number) typeParamOrAny).intValue();
} else {
if (typeParamOrAny instanceof x10.core.Int) return x10.core.Int.$unbox((x10.core.Int) typeParamOrAny);
else if (typeParamOrAny instanceof java.lang.Integer) {return (java.lang.Integer) typeParamOrAny;}
}
throw new java.lang.ClassCastException("x10.lang.Int");
}
public static long aslong(Object typeParamOrAny, Type<?> origRTT){
if (typeParamOrAny == null) {nullIsCastToStruct("x10.lang.Long");}
if (isNumericType(origRTT)) {
return ((java.lang.Number) typeParamOrAny).longValue();
} else {
if (typeParamOrAny instanceof x10.core.Long) {return x10.core.Long.$unbox((x10.core.Long)typeParamOrAny);}
else if (typeParamOrAny instanceof java.lang.Long) {return (java.lang.Long) typeParamOrAny;}
}
throw new java.lang.ClassCastException("x10.lang.Long");
}
public static float asfloat(Object typeParamOrAny, Type<?> origRTT){
if (typeParamOrAny == null) {nullIsCastToStruct("x10.lang.Float");}
if (isNumericType(origRTT)) {
return ((java.lang.Number) typeParamOrAny).floatValue();
} else {
if (typeParamOrAny instanceof x10.core.Float) {return x10.core.Float.$unbox((x10.core.Float)typeParamOrAny);}
else if (typeParamOrAny instanceof java.lang.Float) {return (java.lang.Float) typeParamOrAny;}
}
throw new java.lang.ClassCastException("x10.lang.Float");
}
public static double asdouble(Object typeParamOrAny, Type<?> origRTT){
if (typeParamOrAny == null) {nullIsCastToStruct("x10.lang.Double");}
if (isNumericType(origRTT)) {
return ((java.lang.Number) typeParamOrAny).doubleValue();
} else {
if (typeParamOrAny instanceof x10.core.Double) {return x10.core.Double.$unbox((x10.core.Double)typeParamOrAny);}
else if (typeParamOrAny instanceof java.lang.Double) {return (java.lang.Double) typeParamOrAny;}
}
throw new java.lang.ClassCastException("x10.lang.Double");
}
public static byte asUByte(Object typeParamOrAny, Type<?> origRTT){
if (typeParamOrAny == null) {nullIsCastToStruct("x10.lang.UByte");}
if (isNumericType(origRTT)) {
return ((java.lang.Number) typeParamOrAny).byteValue();
} else {
if (typeParamOrAny instanceof x10.core.UByte) {return x10.core.UByte.$unbox((x10.core.UByte)typeParamOrAny);}
else if (typeParamOrAny instanceof java.lang.Byte) {return (java.lang.Byte)typeParamOrAny;}
}
throw new java.lang.ClassCastException("x10.lang.UByte");
}
// not used
// public static Object asBoxedUByte(Object typeParamOrAny, Type<?> origRTT){
// return x10.core.UByte.$box(asUByte(typeParamOrAny, origRTT));
// }
public static short asUShort(Object typeParamOrAny, Type<?> origRTT){
if (typeParamOrAny == null) {nullIsCastToStruct("x10.lang.UShort");}
if (isNumericType(origRTT)) {
return ((java.lang.Number) typeParamOrAny).shortValue();
} else {
if (typeParamOrAny instanceof x10.core.UShort) {return x10.core.UShort.$unbox((x10.core.UShort)typeParamOrAny);}
else if (typeParamOrAny instanceof java.lang.Short) {return (java.lang.Short)typeParamOrAny;}
}
throw new java.lang.ClassCastException("x10.lang.UShort");
}
// not used
// public static Object asBoxedUShort(Object typeParamOrAny, Type<?> origRTT){
// return x10.core.UShort.$box(asUShort(typeParamOrAny, origRTT));
// }
public static int asUInt(Object typeParamOrAny, Type<?> origRTT){
if (typeParamOrAny == null) {nullIsCastToStruct("x10.lang.UInt");}
if (isNumericType(origRTT)) {
return ((java.lang.Number) typeParamOrAny).intValue();
} else {
if (typeParamOrAny instanceof x10.core.UInt) {return x10.core.UInt.$unbox((x10.core.UInt)typeParamOrAny);}
else if (typeParamOrAny instanceof java.lang.Integer) {return (java.lang.Integer)typeParamOrAny;}
}
throw new java.lang.ClassCastException("x10.lang.UInt");
}
// not used
// public static Object asBoxedUInt(Object typeParamOrAny, Type<?> origRTT){
// return x10.core.UInt.$box(asUInt(typeParamOrAny, origRTT));
// }
public static long asULong(Object typeParamOrAny, Type<?> origRTT){
if (typeParamOrAny == null) {nullIsCastToStruct("x10.lang.ULong");}
if (isNumericType(origRTT)) {
return ((java.lang.Number) typeParamOrAny).longValue();
} else {
if (typeParamOrAny instanceof x10.core.ULong) {return x10.core.ULong.$unbox((x10.core.ULong)typeParamOrAny);}
else if (typeParamOrAny instanceof java.lang.Long) {return (java.lang.Long)typeParamOrAny;}
}
throw new java.lang.ClassCastException("x10.lang.ULong");
}
// not used
// public static Object asBoxedULong(Object typeParamOrAny, Type<?> origRTT){
// return x10.core.ULong.$box(asULong(typeParamOrAny, origRTT));
// }
public static Object asStruct(Type<?> rtt, Object typeParamOrAny) {
if (typeParamOrAny == null) {nullIsCastToStruct(rtt);}
// N.B. ClassCastException is not explicitly checked here since it will be checked by a Java cast of the return value
return typeParamOrAny;
}
// FIXME this should be replaced by virtual method for user defined conversion
private static Object conversion(Type<?> rtt, Object primOrTypeParam, boolean convert) {
if (primOrTypeParam == null) {
if (isStructType(rtt)) {
nullIsCastToStruct(rtt);
}
else {
return null;
}
}
if (rtt == BOOLEAN) {return x10.core.Boolean.$box(asboolean(primOrTypeParam, convert ? BOOLEAN : null));}
if (rtt == CHAR) {return x10.core.Char.$box(aschar(primOrTypeParam, convert ? CHAR : null));}
if (rtt == BYTE) {return x10.core.Byte.$box(asbyte(primOrTypeParam, convert ? BYTE : null));}
if (rtt == SHORT) {return x10.core.Short.$box(asshort(primOrTypeParam, convert ? SHORT : null));}
if (rtt == INT) {return x10.core.Int.$box(asint(primOrTypeParam, convert ? INT : null));}
if (rtt == LONG) {return x10.core.Long.$box(aslong(primOrTypeParam, convert ? LONG : null));}
if (rtt == FLOAT) {return x10.core.Float.$box(asfloat(primOrTypeParam, convert ? FLOAT : null));}
if (rtt == DOUBLE) {return x10.core.Double.$box(asdouble(primOrTypeParam, convert ? DOUBLE : null));}
if (rtt == UBYTE) {return x10.core.UByte.$box(asUByte(primOrTypeParam, convert ? UBYTE : null));}
if (rtt == USHORT) {return x10.core.UShort.$box(asUShort(primOrTypeParam, convert ? USHORT : null));}
if (rtt == UINT) {return x10.core.UInt.$box(asUInt(primOrTypeParam, convert ? UINT : null));}
if (rtt == ULONG) {return x10.core.ULong.$box(asULong(primOrTypeParam, convert ? ULONG : null));}
return primOrTypeParam;
}
public static Object conversion(Type<?> rtt, Object primOrTypeParam) {
return conversion(rtt, primOrTypeParam, false);
}
private static void nullIsCastToStruct(Type<?> rtt) {throw new java.lang.ClassCastException(rtt.typeName());}
private static void nullIsCastToStruct(String msg){throw new java.lang.ClassCastException(msg);}
private static boolean isNullable(Type<?> rtt) {
return rtt.isref();
}
public static boolean hasNaturalZero(Type<?> rtt) {
return isNullable(rtt) || isPrimitiveType(rtt);
}
public static <T> T cast(final java.lang.Object self, Type<?> rtt) {
// XTENLANG-3093
if (self == null) {
if (rtt == null || isNullable(rtt)) return null;
throw new java.lang.ClassCastException(rtt.typeName());
}
if (rtt != null && !rtt.isInstance(self)) throw new java.lang.ClassCastException(rtt.typeName());
return (T) self;
}
public static <T> T castConversion(final java.lang.Object self, Type<?> rtt) {
// XTENLANG-3093
if (self == null) {
if (rtt == null || isNullable(rtt)) return null;
throw new java.lang.ClassCastException(rtt.typeName());
}
T ret = (T) conversion(rtt, self, true);
if (rtt != null && !rtt.isInstance(ret)) throw new java.lang.ClassCastException(rtt.typeName());
return ret;
}
public static Object zeroValue(Type<?> rtt) {
Type<?>[] actualTypeArguments = null;
if (rtt instanceof ParameterizedType) {
ParameterizedType<?> pt = (ParameterizedType<?>) rtt;
rtt = pt.getRawType();
actualTypeArguments = pt.getActualTypeArguments();
}
if (isStructType(rtt)) {
if (rtt == BYTE) return BYTE_ZERO;
if (rtt == SHORT) return SHORT_ZERO;
if (rtt == INT) return INT_ZERO;
if (rtt == LONG) return LONG_ZERO;
if (rtt == UBYTE) return UBYTE_ZERO;
if (rtt == USHORT) return USHORT_ZERO;
if (rtt == UINT) return UINT_ZERO;
if (rtt == ULONG) return ULONG_ZERO;
if (rtt == FLOAT) return FLOAT_ZERO;
if (rtt == DOUBLE) return DOUBLE_ZERO;
if (rtt == CHAR) return CHAR_ZERO;
if (rtt == BOOLEAN) return BOOLEAN_ZERO;
// N.B. to enable following special paths, make corresponding $RTTs singleton
// N.B. since GlobalRef and IndexedMemoryChunk have their own zero value constructor, special paths are no longer needed
// if (rtt == x10.core.IndexedMemoryChunk.$RTT) return new x10.core.IndexedMemoryChunk(actualTypeArguments[0], (java.lang.System) null);
// if (rtt == x10.core.GlobalRef.$RTT) return new x10.core.GlobalRef(actualTypeArguments[0], (java.lang.System) null);
// for user-defined structs, call zero value constructor
try {
Class<?> impl = rtt.getJavaClass();
java.lang.reflect.Constructor<?> ctor = null;
Class<?>[] paramTypes = null;
for (java.lang.reflect.Constructor<?> ctor0 : impl.getConstructors()) {
paramTypes = ctor0.getParameterTypes();
if (paramTypes.length >= 1 && paramTypes[paramTypes.length-1].equals(java.lang.System.class)) {
ctor = ctor0;
break;
}
}
assert ctor != null;
Object[] params = new Object[paramTypes.length];
assert actualTypeArguments == null ? paramTypes.length == 1/*(java.lang.System)null*/ : paramTypes.length == actualTypeArguments.length/*T1,T2,...*/ + 1/*(java.lang.System)null*/;
int i = 0;
if (actualTypeArguments != null) {
for ( ; i < actualTypeArguments.length; ++i) {
// pass type params
params[i] = actualTypeArguments[i];
}
}
params[i] = null;
return ctor.newInstance(params);
} catch (Exception e) {
e.printStackTrace();
throw new java.lang.Error(e);
}
}
return null;
}
}