/* IntegerType Copyright (C) 1999-2002 Jochen Hoenicke.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; see the file COPYING.LESSER. If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id$
*/
package net.sf.jode.type;
import net.sf.jode.GlobalOptions;
/**
* This is a type class for 16 bit integral types. There are seven
* different types, namely int, char, short, byte, boolean,
* const short, const byte
abbreviated I, C, S, B, Z, cS,
* cB
. cB
and cS
specify constant
* ints whose value is in byte resp. short range. They may be
* converted to B resp. S, but sometimes need an explicit cast.
*
* @author Jochen Hoenicke
*/
public class IntegerType extends Type {
/* Order does matter:
* First type that is possible (and hinted) will be taken.
*/
public static final int IT_Z = 0x01;
public static final int IT_I = 0x02;
public static final int IT_C = 0x04;
public static final int IT_S = 0x08;
public static final int IT_B = 0x10;
public static final int IT_cS = 0x20;
public static final int IT_cB = 0x40;
private static final int NUM_TYPES = 7;
private static final int[] subTypes = {
/*Z*/ IT_Z,
/*I*/ IT_I|IT_C|IT_S|IT_B/*|IT_cS|IT_cB*/, /*C*/ IT_C,
/*S*/ IT_S|IT_B/*|IT_cS|IT_cB*/, /*B*/ IT_B/*|IT_cB*/,
/*cS*/IT_cS|IT_cB, /*cB*/IT_cB
};
private static final int[] superTypes = {
/*Z*/ IT_Z,
/*I*/ IT_I, /*C*/ IT_I|IT_C,
/*S*/ IT_I|IT_S, /*B*/ IT_I|IT_S|IT_B,
/*cS*/IT_I|IT_C|IT_S|IT_cS, /*cB*/IT_I|IT_C|IT_S|IT_B|IT_cS|IT_cB
};
private static final Type[] simpleTypes = {
new IntegerType(IT_Z),
new IntegerType(IT_I), new IntegerType(IT_C),
new IntegerType(IT_S), new IntegerType(IT_B),
new IntegerType(IT_cS), new IntegerType(IT_cB)
};
private static final String[] typeNames = {
"Z","I","C","S","B","s","b"
};
int possTypes;
int hintTypes;
/**
* Create a new type with the given type.
*/
public IntegerType(int types) {
this(types, types);
}
public IntegerType(int types, int hints) {
super(TC_INTEGER);
possTypes = types;
hintTypes = hints;
}
public Type getHint() {
int hint = possTypes & hintTypes;
if (hint == 0)
hint = possTypes;
int i = 0;
while ((hint & 1) == 0) {
hint >>= 1;
i++;
}
return simpleTypes[i];
}
public Type getCanonic() {
int types = possTypes;
int i = 0;
while ((types >>= 1) != 0) {
i++;
}
return simpleTypes[i];
}
private static int getSubTypes(int types) {
int result = 0;
for (int i=0; i < NUM_TYPES; i++) {
if (((1<