1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.rop.cst; 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.Type; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.Hex; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 2399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Constants of type {@code CONSTANT_Integer_info}. 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class CstInteger 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project extends CstLiteral32 { 2799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} array of cached instances */ 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static final CstInteger[] cache = new CstInteger[511]; 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} instance representing {@code -1} */ 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static final CstInteger VALUE_M1 = make(-1); 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} instance representing {@code 0} */ 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static final CstInteger VALUE_0 = make(0); 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} instance representing {@code 1} */ 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static final CstInteger VALUE_1 = make(1); 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} instance representing {@code 2} */ 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static final CstInteger VALUE_2 = make(2); 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} instance representing {@code 3} */ 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static final CstInteger VALUE_3 = make(3); 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} instance representing {@code 4} */ 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static final CstInteger VALUE_4 = make(4); 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} instance representing {@code 5} */ 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static final CstInteger VALUE_5 = make(5); 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Makes an instance for the given value. This may (but does not 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * necessarily) return an already-allocated instance. 54de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 5599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param value the {@code int} value 5699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the appropriate instance 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static CstInteger make(int value) { 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: No need to synchronize, since we don't make any sort 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * of guarantee about ==, and it's okay to overwrite existing 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * entries too. 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int idx = (value & 0x7fffffff) % cache.length; 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CstInteger obj = cache[idx]; 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((obj != null) && (obj.getValue() == value)) { 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return obj; 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project obj = new CstInteger(value); 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cache[idx] = obj; 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return obj; 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs an instance. This constructor is private; use {@link #make}. 78de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 7999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param value the {@code int} value 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private CstInteger(int value) { 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super(value); 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String toString() { 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int value = getIntBits(); 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return "int{0x" + Hex.u4(value) + " / " + value + '}'; 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public Type getType() { 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return Type.INT; 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String typeName() { 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return "int"; 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String toHuman() { 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return Integer.toString(getIntBits()); 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 10999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Gets the {@code int} value. 110de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @return the value 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int getValue() { 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return getIntBits(); 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 117