/* IntegerType Copyright (C) 1999 Jochen Hoenicke. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id$ */ package jode.type; import 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 { public static final int IT_I = 0x01; public static final int IT_C = 0x02; public static final int IT_S = 0x04; public static final int IT_B = 0x08; public static final int IT_Z = 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 = { /*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*/, /*Z*/ IT_Z, /*cS*/IT_cS|IT_cB, /*cB*/IT_cB }; private static final int[] superTypes = { /*I*/ IT_I, /*C*/ IT_I|IT_C, /*S*/ IT_I|IT_S, /*B*/ IT_I|IT_S|IT_B, /*Z*/ IT_Z, /*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_I), new IntegerType(IT_C), new IntegerType(IT_S), new IntegerType(IT_B), new IntegerType(IT_Z), new IntegerType(IT_cS), new IntegerType(IT_cB) }; private static final String[] typeNames = { "I","C","S","B","Z","cS","cB" }; int possTypes; int strongHint = 0; int weakHint = 0; /** * Create a new type with the given type. */ public IntegerType(int types) { super(TC_INTEGER); possTypes = types; } public Type getHint() { int hint = ((possTypes & IT_Z) != 0 ? IT_Z : strongHint != 0 ? strongHint : weakHint != 0 ? weakHint : possTypes); int i = 0; for (int it = 0x1; (it & hint) == 0; it <<= 1) i++; return simpleTypes[i]; } private int getSubTypes() { int result = 0; for (int i=0; i < NUM_TYPES; i++) { if (((1<