/*
* 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.core;
import java.io.IOException;
import x10.rtt.RuntimeType;
import x10.rtt.Type;
import x10.rtt.Types;
import x10.serialization.X10JavaDeserializer;
import x10.serialization.X10JavaSerializable;
import x10.serialization.X10JavaSerializer;
/**
* Represents a boxed Char value. Boxed representation is used when casting
* an Char value to type Any, parameter type T or superinterfaces such
* as Comparable<Char>.
*/
final public class Char extends Struct implements java.lang.Comparable<Char>, x10.util.Ordered<Char>
{
private static final long serialVersionUID = 1L;
public static final RuntimeType<?> $RTT = Types.CHAR;
public RuntimeType<?> $getRTT() {return $RTT;}
public Type<?> $getParam(int i) {return null;}
final char $value;
private Char(char value) {
this.$value = value;
}
private abstract static class Cache {
static final int low = 0;
static final int high = 127;
static final Char cache[] = new Char[high - low + 1];
static {
for (int i = 0; i < cache.length; ++i) {
cache[i] = new Char((char)(low + i));
}
}
}
public static Char $box(char value) {
int valueAsInt = value;
if (Cache.low <= valueAsInt && valueAsInt <= Cache.high) {
return Cache.cache[valueAsInt - Cache.low];
}
return new Char(value);
}
public static char $unbox(Char obj) {
return obj.$value;
}
public static char $unbox(Object obj) {
if (obj instanceof Char) return ((Char)obj).$value;
else return ((java.lang.Character)obj).charValue();
}
// make $box/$unbox idempotent
public static Char $box(Char obj) {
return obj;
}
public static Char $box(Object obj) {
if (obj instanceof Char) return (Char) obj;
else return $box(((java.lang.Character)obj).charValue());
}
public static char $unbox(char value) {
return value;
}
public boolean _struct_equals$O(Object obj) {
if (obj instanceof Char && ((Char) obj).$value == $value)
return true;
return false;
}
@Override
public boolean equals(Object value) {
if (value instanceof Char) {
return ((Char) value).$value == $value;
} else if (value instanceof java.lang.Character) { // char literals come here as Character autoboxed values
return ((java.lang.Character) value).charValue() == $value;
}
return false;
}
@Override
public int hashCode() {
return (int) $value;
}
@Override
public java.lang.String toString() {
return java.lang.Character.toString($value);
}
// implements Comparable<Char>
public int compareTo(Char o) {
if ($value > o.$value) return 1;
else if ($value < o.$value) return -1;
return 0;
}
public void $_serialize(X10JavaSerializer $serializer) throws IOException {
$serializer.write($value);
}
public static X10JavaSerializable $_deserializer(X10JavaDeserializer $deserializer) throws IOException {
return $_deserialize_body(null, $deserializer);
}
public static X10JavaSerializable $_deserialize_body(Char $_obj, X10JavaDeserializer $deserializer) throws IOException {
char value = $deserializer.readChar();
$_obj = new Char(value);
$deserializer.record_reference($_obj);
return $_obj;
}
// implements Ordered<Char>
public java.lang.Object $lt(java.lang.Object b, Type t) { return x10.core.Boolean.$box($value < ((Char)b).$value); }
public java.lang.Object $gt(java.lang.Object b, Type t) { return x10.core.Boolean.$box($value > ((Char)b).$value); }
public java.lang.Object $le(java.lang.Object b, Type t) { return x10.core.Boolean.$box($value <= ((Char)b).$value); }
public java.lang.Object $ge(java.lang.Object b, Type t) { return x10.core.Boolean.$box($value >= ((Char)b).$value); }
// for X10PrettyPrinterVisitor.generateSpecialDispatcher
public boolean $lt$Z(java.lang.Object b, Type t) { return $value < ((Char)b).$value; }
public boolean $gt$Z(java.lang.Object b, Type t) { return $value > ((Char)b).$value; }
public boolean $le$Z(java.lang.Object b, Type t) { return $value <= ((Char)b).$value; }
public boolean $ge$Z(java.lang.Object b, Type t) { return $value >= ((Char)b).$value; }
}