1579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/* 2579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Copyright (C) 2007 The Android Open Source Project 3579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 4579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 5579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * you may not use this file except in compliance with the License. 6579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * You may obtain a copy of the License at 7579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 8579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 9579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 10579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Unless required by applicable law or agreed to in writing, software 11579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 12579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * See the License for the specific language governing permissions and 14579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * limitations under the License. 15579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 16579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 17579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpackage com.android.dx.rop.type; 18579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 19579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.util.FixedSizeList; 20579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 21579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/** 22579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Standard implementation of {@link TypeList}. 23579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 24579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpublic final class StdTypeList 25579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson extends FixedSizeList implements TypeList { 26579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} no-element instance */ 27579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList EMPTY = new StdTypeList(0); 28579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 29579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [int]} */ 30579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList INT = StdTypeList.make(Type.INT); 31579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 32579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [long]} */ 33579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList LONG = StdTypeList.make(Type.LONG); 34579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 35579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [float]} */ 36579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList FLOAT = StdTypeList.make(Type.FLOAT); 37579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 38579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [double]} */ 39579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList DOUBLE = StdTypeList.make(Type.DOUBLE); 40579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 41579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [Object]} */ 42579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList OBJECT = StdTypeList.make(Type.OBJECT); 43579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 44579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [ReturnAddress]} */ 45579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList RETURN_ADDRESS 46579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson = StdTypeList.make(Type.RETURN_ADDRESS); 47579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 48579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [Throwable]} */ 49579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList THROWABLE = 50579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.THROWABLE); 51579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 52579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [int, int]} */ 53579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList INT_INT = 54579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.INT, Type.INT); 55579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 56579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [long, long]} */ 57579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList LONG_LONG = 58579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.LONG, Type.LONG); 59579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 60579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [float, float]} */ 61579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList FLOAT_FLOAT = 62579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.FLOAT, Type.FLOAT); 63579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 64579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [double, double]} */ 65579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList DOUBLE_DOUBLE = 66579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.DOUBLE, Type.DOUBLE); 67579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 68579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [Object, Object]} */ 69579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList OBJECT_OBJECT = 70579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.OBJECT, Type.OBJECT); 71579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 72579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [int, Object]} */ 73579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList INT_OBJECT = 74579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.INT, Type.OBJECT); 75579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 76579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [long, Object]} */ 77579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList LONG_OBJECT = 78579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.LONG, Type.OBJECT); 79579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 80579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [float, Object]} */ 81579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList FLOAT_OBJECT = 82579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.FLOAT, Type.OBJECT); 83579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 84579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [double, Object]} */ 85579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList DOUBLE_OBJECT = 86579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.DOUBLE, Type.OBJECT); 87579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 88579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [long, int]} */ 89579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList LONG_INT = 90579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.LONG, Type.INT); 91579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 92579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [int[], int]} */ 93579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList INTARR_INT = 94579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.INT_ARRAY, Type.INT); 95579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 96579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [long[], int]} */ 97579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList LONGARR_INT = 98579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.LONG_ARRAY, Type.INT); 99579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 100579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [float[], int]} */ 101579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList FLOATARR_INT = 102579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.FLOAT_ARRAY, Type.INT); 103579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 104579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [double[], int]} */ 105579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList DOUBLEARR_INT = 106579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.DOUBLE_ARRAY, Type.INT); 107579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 108579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [Object[], int]} */ 109579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList OBJECTARR_INT = 110579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.OBJECT_ARRAY, Type.INT); 111579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 112579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [boolean[], int]} */ 113579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList BOOLEANARR_INT = 114579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.BOOLEAN_ARRAY, Type.INT); 115579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 116579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [byte[], int]} */ 117579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList BYTEARR_INT = 118579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.BYTE_ARRAY, Type.INT); 119579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 120579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [char[], int]} */ 121579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList CHARARR_INT = 122579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.CHAR_ARRAY, Type.INT); 123579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 124579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [short[], int]} */ 125579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList SHORTARR_INT = 126579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.SHORT_ARRAY, Type.INT); 127579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 128579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [int, int[], int]} */ 129579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList INT_INTARR_INT = 130579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.INT, Type.INT_ARRAY, Type.INT); 131579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 132579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [long, long[], int]} */ 133579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList LONG_LONGARR_INT = 134579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.LONG, Type.LONG_ARRAY, Type.INT); 135579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 136579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [float, float[], int]} */ 137579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList FLOAT_FLOATARR_INT = 138579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.FLOAT, Type.FLOAT_ARRAY, Type.INT); 139579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 140579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [double, double[], int]} */ 141579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList DOUBLE_DOUBLEARR_INT = 142579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.DOUBLE, Type.DOUBLE_ARRAY, Type.INT); 143579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 144579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [Object, Object[], int]} */ 145579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList OBJECT_OBJECTARR_INT = 146579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.OBJECT, Type.OBJECT_ARRAY, Type.INT); 147579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 148579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [int, boolean[], int]} */ 149579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList INT_BOOLEANARR_INT = 150579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.INT, Type.BOOLEAN_ARRAY, Type.INT); 151579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 152579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [int, byte[], int]} */ 153579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList INT_BYTEARR_INT = 154579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.INT, Type.BYTE_ARRAY, Type.INT); 155579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 156579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [int, char[], int]} */ 157579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList INT_CHARARR_INT = 158579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.INT, Type.CHAR_ARRAY, Type.INT); 159579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 160579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@code non-null;} the list {@code [int, short[], int]} */ 161579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static final StdTypeList INT_SHORTARR_INT = 162579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList.make(Type.INT, Type.SHORT_ARRAY, Type.INT); 163579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 164579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 165579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Makes a single-element instance. 166579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 167579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param type {@code non-null;} the element 168579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code non-null;} an appropriately-constructed instance 169579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 170579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static StdTypeList make(Type type) { 171579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList result = new StdTypeList(1); 172579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson result.set(0, type); 173579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return result; 174579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 175579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 176579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 177579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Makes a two-element instance. 178579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 179579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param type0 {@code non-null;} the first element 180579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param type1 {@code non-null;} the second element 181579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code non-null;} an appropriately-constructed instance 182579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 183579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static StdTypeList make(Type type0, Type type1) { 184579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList result = new StdTypeList(2); 185579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson result.set(0, type0); 186579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson result.set(1, type1); 187579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return result; 188579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 189579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 190579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 191579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Makes a three-element instance. 192579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 193579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param type0 {@code non-null;} the first element 194579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param type1 {@code non-null;} the second element 195579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param type2 {@code non-null;} the third element 196579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code non-null;} an appropriately-constructed instance 197579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 198579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static StdTypeList make(Type type0, Type type1, Type type2) { 199579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList result = new StdTypeList(3); 200579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson result.set(0, type0); 201579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson result.set(1, type1); 202579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson result.set(2, type2); 203579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return result; 204579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 205579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 206579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 207579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Makes a four-element instance. 208579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 209579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param type0 {@code non-null;} the first element 210579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param type1 {@code non-null;} the second element 211579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param type2 {@code non-null;} the third element 212579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param type3 {@code non-null;} the fourth element 213579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code non-null;} an appropriately-constructed instance 214579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 215579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static StdTypeList make(Type type0, Type type1, Type type2, 216579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson Type type3) { 217579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList result = new StdTypeList(4); 218579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson result.set(0, type0); 219579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson result.set(1, type1); 220579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson result.set(2, type2); 221579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson result.set(3, type3); 222579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return result; 223579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 224579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 225579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 226579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Returns the given list as a comma-separated list of human forms. This 227579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * is a static method so as to work on arbitrary {@link TypeList} 228579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * instances. 229579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 230579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param list {@code non-null;} the list to convert 231579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code non-null;} the human form 232579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 233579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static String toHuman(TypeList list) { 234579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int size = list.size(); 235579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 236579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (size == 0) { 237579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return "<empty>"; 238579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 239579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 240579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StringBuffer sb = new StringBuffer(100); 241579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 242579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson for (int i = 0; i < size; i++) { 243579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (i != 0) { 244579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson sb.append(", "); 245579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 246579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson sb.append(list.getType(i).toHuman()); 247579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 248579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 249579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return sb.toString(); 250579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 251579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 252579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 253579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Returns a hashcode of the contents of the given list. This 254579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * is a static method so as to work on arbitrary {@link TypeList} 255579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * instances. 256579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 257579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param list {@code non-null;} the list to inspect 258579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code non-null;} the hash code 259579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 260579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static int hashContents(TypeList list) { 261579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int size = list.size(); 262579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int hash = 0; 263579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 264579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson for (int i = 0; i < size; i++) { 265579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson hash = (hash * 31) + list.getType(i).hashCode(); 266579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 267579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 268579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return hash; 269579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 270579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 271579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 272579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Compares the contents of the given two instances for equality. This 273579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * is a static method so as to work on arbitrary {@link TypeList} 274579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * instances. 275579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 276579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param list1 {@code non-null;} one list to compare 277579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param list2 {@code non-null;} another list to compare 278579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return whether the two lists contain corresponding equal elements 279579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 280579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static boolean equalContents(TypeList list1, TypeList list2) { 281579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int size = list1.size(); 282579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 283579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (list2.size() != size) { 284579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return false; 285579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 286579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 287579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson for (int i = 0; i < size; i++) { 288579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (! list1.getType(i).equals(list2.getType(i))) { 289579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return false; 290579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 291579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 292579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 293579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return true; 294579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 295579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 296579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 297579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Compares the contents of the given two instances for ordering. This 298579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * is a static method so as to work on arbitrary {@link TypeList} 299579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * instances. 300579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 301579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param list1 {@code non-null;} one list to compare 302579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param list2 {@code non-null;} another list to compare 303579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return the order of the two lists 304579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 305579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public static int compareContents(TypeList list1, TypeList list2) { 306579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int size1 = list1.size(); 307579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int size2 = list2.size(); 308579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int size = Math.min(size1, size2); 309579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 310579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson for (int i = 0; i < size; i++) { 311579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int comparison = list1.getType(i).compareTo(list2.getType(i)); 312579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (comparison != 0) { 313579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return comparison; 314579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 315579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 316579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 317579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson if (size1 == size2) { 318579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return 0; 319579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } else if (size1 < size2) { 320579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return -1; 321579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } else { 322579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return 1; 323579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 324579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 325579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 326579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 327579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Constructs an instance. All indices initially contain {@code null}. 328579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 329579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param size the size of the list 330579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 331579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public StdTypeList(int size) { 332579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson super(size); 333579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 334579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 335579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 336579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public Type getType(int n) { 337579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return get(n); 338579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 339579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 340579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 341579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public int getWordCount() { 342579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int sz = size(); 343579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int result = 0; 344579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 345579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson for (int i = 0; i < sz; i++) { 346579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson result += get(i).getCategory(); 347579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 348579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 349579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return result; 350579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 351579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 352579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** {@inheritDoc} */ 353579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public TypeList withAddedType(Type type) { 354579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int sz = size(); 355579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList result = new StdTypeList(sz + 1); 356579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 357579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson for (int i = 0; i < sz; i++) { 358579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson result.set0(i, get0(i)); 359579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 360579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 361579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson result.set(sz, type); 362579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson result.setImmutable(); 363579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return result; 364579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 365579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 366579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 367579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Gets the indicated element. It is an error to call this with the 368579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * index for an element which was never set; if you do that, this 369579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * will throw {@code NullPointerException}. 370579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 371579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param n {@code >= 0, < size();} which element 372579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code non-null;} the indicated element 373579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 374579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public Type get(int n) { 375579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return (Type) get0(n); 376579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 377579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 378579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 379579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Sets the type at the given index. 380579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 381579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param n {@code >= 0, < size();} which element 382579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param type {@code non-null;} the type to store 383579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 384579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public void set(int n, Type type) { 385579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson set0(n, type); 386579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 387579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 388579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 389579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Returns a new instance, which is the same as this instance, 390579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * except that it has an additional type prepended to the 391579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * original. 392579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 393579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param type {@code non-null;} the new first element 394579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return {@code non-null;} an appropriately-constructed instance 395579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 396579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public StdTypeList withFirst(Type type) { 397579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int sz = size(); 398579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson StdTypeList result = new StdTypeList(sz + 1); 399579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 400579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson result.set0(0, type); 401579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson for (int i = 0; i < sz; i++) { 402579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson result.set0(i + 1, getOrNull0(i)); 403579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 404579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 405579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return result; 406579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 407579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson} 408