/*
 * Copyright (C) 2008 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.hit;

public class Types {
    private static int mIdSize = 4;

    public static final int OBJECT     =   2;
    public static final int BOOLEAN    =   4;
    public static final int CHAR       =   5;
    public static final int FLOAT      =   6;
    public static final int DOUBLE     =   7;
    public static final int BYTE       =   8;
    public static final int SHORT      =   9;
    public static final int INT        =   10;
    public static final int LONG       =   11;

    public static final void setIdSize(int size) {
        mIdSize = size;
    }

    public static final int getTypeSize(int type) {
        switch (type) {
            case '[':      return mIdSize; //  array object
            case 'L':      return mIdSize; //  object
            case 'Z':      return 1;       //  boolean
            case 'C':      return 2;       //  char
            case 'F':      return 4;       //  float
            case 'D':      return 8;       //  double
            case 'B':      return 1;       //  byte
            case 'S':      return 2;       //  short
            case 'I':      return 4;       //  int
            case 'J':      return 8;       //  long
                
            case OBJECT:   return mIdSize;
            case BOOLEAN:  return 1;
            case CHAR:     return 2;
            case FLOAT:    return 4;
            case DOUBLE:   return 8;
            case BYTE:     return 1;
            case SHORT:    return 2;
            case INT:      return 4;
            case LONG:     return 8;
        }
        
        throw new IllegalArgumentException("Illegal type signature: " + type);
    }
    
    public static final String getTypeName(int type) {
        switch (type) {
            case '[':      return "array";
            case 'L':      return "object";
            case 'Z':      return "boolean";
            case 'C':      return "char";
            case 'F':      return "float";
            case 'D':      return "double";
            case 'B':      return "byte";
            case 'S':      return "short";
            case 'I':      return "int";
            case 'J':      return "long";
                
            case OBJECT:   return "object";
            case BOOLEAN:  return "boolean";
            case CHAR:     return "char";
            case FLOAT:    return "float";
            case DOUBLE:   return "double";
            case BYTE:     return "byte";
            case SHORT:    return "short";
            case INT:      return "int";
            case LONG:     return "long";
        }
        
        throw new IllegalArgumentException("Illegal type signature: " + type);
    }
}
