/*
* 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-2010.
*/
package x10.rtt;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import x10.serialization.X10JavaDeserializer;
import x10.serialization.X10JavaSerializable;
import x10.serialization.X10JavaSerializer;
public class NamedType<T> extends RuntimeType<T> implements X10JavaSerializable {
private static final long serialVersionUID = 1L;
public String typeName;
// Just for allocation
public NamedType() {
super();
}
// N.B. this is also used to implement readResolve() in place for Types.COMPARABLE
protected NamedType(String typeName, Class<?> javaClass, Variance[] variances, Type<?>[] parents) {
super(javaClass, variances, parents);
this.typeName = typeName;
}
private static final boolean useCache = true;
private static final ConcurrentHashMap<Class<?>, NamedType<?>> typeCache = new ConcurrentHashMap<Class<?>, NamedType<?>>();
public static <T> NamedType/*<T>*/ make(String typeName, Class<?> javaClass) {
if (useCache) {
NamedType<?> type = typeCache.get(javaClass);
if (type == null) {
NamedType<?> type0 = new NamedType<T>(typeName, javaClass, null, null);
type = typeCache.putIfAbsent(javaClass, type0);
if (type == null) type = type0;
}
return (NamedType<T>) type;
} else {
return new NamedType<T>(typeName, javaClass, null, null);
}
}
public static <T> NamedType/*<T>*/ make(String typeName, Class<?> javaClass, Variance[] variances) {
if (useCache) {
NamedType<?> type = typeCache.get(javaClass);
if (type == null) {
NamedType<?> type0 = new NamedType<T>(typeName, javaClass, variances, null);
type = typeCache.putIfAbsent(javaClass, type0);
if (type == null) type = type0;
}
return (NamedType<T>) type;
} else {
return new NamedType<T>(typeName, javaClass, variances, null);
}
}
public static <T> NamedType/*<T>*/ make(String typeName, Class<?> javaClass, Type<?>[] parents) {
if (useCache) {
NamedType<?> type = typeCache.get(javaClass);
if (type == null) {
NamedType<?> type0 = new NamedType<T>(typeName, javaClass, null, parents);
type = typeCache.putIfAbsent(javaClass, type0);
if (type == null) type = type0;
}
return (NamedType<T>) type;
} else {
return new NamedType<T>(typeName, javaClass, null, parents);
}
}
public static <T> NamedType/*<T>*/ make(String typeName, Class<?> javaClass, Variance[] variances, Type<?>[] parents) {
if (useCache) {
NamedType<?> type = typeCache.get(javaClass);
if (type == null) {
NamedType<?> type0 = new NamedType<T>(typeName, javaClass, variances, parents);
type = typeCache.putIfAbsent(javaClass, type0);
if (type == null) type = type0;
}
return (NamedType<T>) type;
} else {
return new NamedType<T>(typeName, javaClass, variances, parents);
}
}
@Override
public String typeName() {
return typeName;
}
@Override
public void $_serialize(X10JavaSerializer serializer) throws IOException {
super.$_serialize(serializer);
serializer.write(typeName);
}
public static X10JavaSerializable $_deserializer(X10JavaDeserializer deserializer) throws IOException {
NamedType namedType = new NamedType();
deserializer.record_reference(namedType);
return $_deserialize_body(namedType, deserializer);
}
public static X10JavaSerializable $_deserialize_body(NamedType nt, X10JavaDeserializer deserializer) throws IOException {
RuntimeType.$_deserialize_body(nt, deserializer);
nt.typeName = deserializer.readString();
return nt;
}
}