/* 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<