1.1 --- a/javap/src/main/java/org/apidesign/javap/TypeArray.java Wed Dec 12 11:04:02 2012 +0100
1.2 +++ b/javap/src/main/java/org/apidesign/javap/TypeArray.java Fri Mar 22 16:59:47 2013 +0100
1.3 @@ -1,186 +1,186 @@
1.4 -/*
1.5 - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
1.6 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
1.7 - *
1.8 - * This code is free software; you can redistribute it and/or modify it
1.9 - * under the terms of the GNU General Public License version 2 only, as
1.10 - * published by the Free Software Foundation. Oracle designates this
1.11 - * particular file as subject to the "Classpath" exception as provided
1.12 - * by Oracle in the LICENSE file that accompanied this code.
1.13 - *
1.14 - * This code is distributed in the hope that it will be useful, but WITHOUT
1.15 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1.16 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
1.17 - * version 2 for more details (a copy is included in the LICENSE file that
1.18 - * accompanied this code).
1.19 - *
1.20 - * You should have received a copy of the GNU General Public License version
1.21 - * 2 along with this work; if not, write to the Free Software Foundation,
1.22 - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1.23 - *
1.24 - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1.25 - * or visit www.oracle.com if you need additional information or have any
1.26 - * questions.
1.27 - */
1.28 -
1.29 -package org.apidesign.javap;
1.30 -
1.31 -import static org.apidesign.javap.RuntimeConstants.ITEM_Bogus;
1.32 -import static org.apidesign.javap.RuntimeConstants.ITEM_Integer;
1.33 -import static org.apidesign.javap.RuntimeConstants.ITEM_Float;
1.34 -import static org.apidesign.javap.RuntimeConstants.ITEM_Double;
1.35 -import static org.apidesign.javap.RuntimeConstants.ITEM_Long;
1.36 -import static org.apidesign.javap.RuntimeConstants.ITEM_Null;
1.37 -import static org.apidesign.javap.RuntimeConstants.ITEM_InitObject;
1.38 -import static org.apidesign.javap.RuntimeConstants.ITEM_Object;
1.39 -import static org.apidesign.javap.RuntimeConstants.ITEM_NewObject;
1.40 -
1.41 -public final class TypeArray {
1.42 - private static final int CAPACITY_INCREMENT = 16;
1.43 -
1.44 - private int[] types;
1.45 - private int size;
1.46 -
1.47 - public TypeArray() {
1.48 - }
1.49 -
1.50 - public TypeArray(final TypeArray initialTypes) {
1.51 - setAll(initialTypes);
1.52 - }
1.53 -
1.54 - public void add(final int newType) {
1.55 - ensureCapacity(size + 1);
1.56 - types[size++] = newType;
1.57 - }
1.58 -
1.59 - public void addAll(final TypeArray newTypes) {
1.60 - addAll(newTypes.types, 0, newTypes.size);
1.61 - }
1.62 -
1.63 - public void addAll(final int[] newTypes) {
1.64 - addAll(newTypes, 0, newTypes.length);
1.65 - }
1.66 -
1.67 - public void addAll(final int[] newTypes,
1.68 - final int offset,
1.69 - final int count) {
1.70 - if (count > 0) {
1.71 - ensureCapacity(size + count);
1.72 - arraycopy(newTypes, offset, types, size, count);
1.73 - size += count;
1.74 - }
1.75 - }
1.76 -
1.77 - public void set(final int index, final int newType) {
1.78 - types[index] = newType;
1.79 - }
1.80 -
1.81 - public void setAll(final TypeArray newTypes) {
1.82 - setAll(newTypes.types, 0, newTypes.size);
1.83 - }
1.84 -
1.85 - public void setAll(final int[] newTypes) {
1.86 - setAll(newTypes, 0, newTypes.length);
1.87 - }
1.88 -
1.89 - public void setAll(final int[] newTypes,
1.90 - final int offset,
1.91 - final int count) {
1.92 - if (count > 0) {
1.93 - ensureCapacity(count);
1.94 - arraycopy(newTypes, offset, types, 0, count);
1.95 - size = count;
1.96 - } else {
1.97 - clear();
1.98 - }
1.99 - }
1.100 -
1.101 - public void setSize(final int newSize) {
1.102 - if (size != newSize) {
1.103 - ensureCapacity(newSize);
1.104 -
1.105 - for (int i = size; i < newSize; ++i) {
1.106 - types[i] = 0;
1.107 - }
1.108 - size = newSize;
1.109 - }
1.110 - }
1.111 -
1.112 - public void clear() {
1.113 - size = 0;
1.114 - }
1.115 -
1.116 - public int getSize() {
1.117 - return size;
1.118 - }
1.119 -
1.120 - public int get(final int index) {
1.121 - return types[index];
1.122 - }
1.123 -
1.124 - public static String typeString(final int type) {
1.125 - switch (type & 0xff) {
1.126 - case ITEM_Bogus:
1.127 - return "_top_";
1.128 - case ITEM_Integer:
1.129 - return "_int_";
1.130 - case ITEM_Float:
1.131 - return "_float_";
1.132 - case ITEM_Double:
1.133 - return "_double_";
1.134 - case ITEM_Long:
1.135 - return "_long_";
1.136 - case ITEM_Null:
1.137 - return "_null_";
1.138 - case ITEM_InitObject: // UninitializedThis
1.139 - return "_init_";
1.140 - case ITEM_Object:
1.141 - return "_object_";
1.142 - case ITEM_NewObject: // Uninitialized
1.143 - return "_new_";
1.144 - default:
1.145 - throw new IllegalArgumentException("Unknown type");
1.146 - }
1.147 - }
1.148 -
1.149 - @Override
1.150 - public String toString() {
1.151 - final StringBuilder sb = new StringBuilder("[");
1.152 - if (size > 0) {
1.153 - sb.append(typeString(types[0]));
1.154 - for (int i = 1; i < size; ++i) {
1.155 - sb.append(", ");
1.156 - sb.append(typeString(types[i]));
1.157 - }
1.158 - }
1.159 -
1.160 - return sb.append(']').toString();
1.161 - }
1.162 -
1.163 - private void ensureCapacity(final int minCapacity) {
1.164 - if ((minCapacity == 0)
1.165 - || (types != null) && (minCapacity <= types.length)) {
1.166 - return;
1.167 - }
1.168 -
1.169 - final int newCapacity =
1.170 - ((minCapacity + CAPACITY_INCREMENT - 1) / CAPACITY_INCREMENT)
1.171 - * CAPACITY_INCREMENT;
1.172 - final int[] newTypes = new int[newCapacity];
1.173 -
1.174 - if (size > 0) {
1.175 - arraycopy(types, 0, newTypes, 0, size);
1.176 - }
1.177 -
1.178 - types = newTypes;
1.179 - }
1.180 -
1.181 - // no System.arraycopy
1.182 - private void arraycopy(final int[] src, final int srcPos,
1.183 - final int[] dest, final int destPos,
1.184 - final int length) {
1.185 - for (int i = 0; i < length; ++i) {
1.186 - dest[destPos + i] = src[srcPos + i];
1.187 - }
1.188 - }
1.189 -}
1.190 +/*
1.191 + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
1.192 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
1.193 + *
1.194 + * This code is free software; you can redistribute it and/or modify it
1.195 + * under the terms of the GNU General Public License version 2 only, as
1.196 + * published by the Free Software Foundation. Oracle designates this
1.197 + * particular file as subject to the "Classpath" exception as provided
1.198 + * by Oracle in the LICENSE file that accompanied this code.
1.199 + *
1.200 + * This code is distributed in the hope that it will be useful, but WITHOUT
1.201 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1.202 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
1.203 + * version 2 for more details (a copy is included in the LICENSE file that
1.204 + * accompanied this code).
1.205 + *
1.206 + * You should have received a copy of the GNU General Public License version
1.207 + * 2 along with this work; if not, write to the Free Software Foundation,
1.208 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1.209 + *
1.210 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1.211 + * or visit www.oracle.com if you need additional information or have any
1.212 + * questions.
1.213 + */
1.214 +
1.215 +package org.apidesign.javap;
1.216 +
1.217 +import static org.apidesign.javap.RuntimeConstants.ITEM_Bogus;
1.218 +import static org.apidesign.javap.RuntimeConstants.ITEM_Integer;
1.219 +import static org.apidesign.javap.RuntimeConstants.ITEM_Float;
1.220 +import static org.apidesign.javap.RuntimeConstants.ITEM_Double;
1.221 +import static org.apidesign.javap.RuntimeConstants.ITEM_Long;
1.222 +import static org.apidesign.javap.RuntimeConstants.ITEM_Null;
1.223 +import static org.apidesign.javap.RuntimeConstants.ITEM_InitObject;
1.224 +import static org.apidesign.javap.RuntimeConstants.ITEM_Object;
1.225 +import static org.apidesign.javap.RuntimeConstants.ITEM_NewObject;
1.226 +
1.227 +public final class TypeArray {
1.228 + private static final int CAPACITY_INCREMENT = 16;
1.229 +
1.230 + private int[] types;
1.231 + private int size;
1.232 +
1.233 + public TypeArray() {
1.234 + }
1.235 +
1.236 + public TypeArray(final TypeArray initialTypes) {
1.237 + setAll(initialTypes);
1.238 + }
1.239 +
1.240 + public void add(final int newType) {
1.241 + ensureCapacity(size + 1);
1.242 + types[size++] = newType;
1.243 + }
1.244 +
1.245 + public void addAll(final TypeArray newTypes) {
1.246 + addAll(newTypes.types, 0, newTypes.size);
1.247 + }
1.248 +
1.249 + public void addAll(final int[] newTypes) {
1.250 + addAll(newTypes, 0, newTypes.length);
1.251 + }
1.252 +
1.253 + public void addAll(final int[] newTypes,
1.254 + final int offset,
1.255 + final int count) {
1.256 + if (count > 0) {
1.257 + ensureCapacity(size + count);
1.258 + arraycopy(newTypes, offset, types, size, count);
1.259 + size += count;
1.260 + }
1.261 + }
1.262 +
1.263 + public void set(final int index, final int newType) {
1.264 + types[index] = newType;
1.265 + }
1.266 +
1.267 + public void setAll(final TypeArray newTypes) {
1.268 + setAll(newTypes.types, 0, newTypes.size);
1.269 + }
1.270 +
1.271 + public void setAll(final int[] newTypes) {
1.272 + setAll(newTypes, 0, newTypes.length);
1.273 + }
1.274 +
1.275 + public void setAll(final int[] newTypes,
1.276 + final int offset,
1.277 + final int count) {
1.278 + if (count > 0) {
1.279 + ensureCapacity(count);
1.280 + arraycopy(newTypes, offset, types, 0, count);
1.281 + size = count;
1.282 + } else {
1.283 + clear();
1.284 + }
1.285 + }
1.286 +
1.287 + public void setSize(final int newSize) {
1.288 + if (size != newSize) {
1.289 + ensureCapacity(newSize);
1.290 +
1.291 + for (int i = size; i < newSize; ++i) {
1.292 + types[i] = 0;
1.293 + }
1.294 + size = newSize;
1.295 + }
1.296 + }
1.297 +
1.298 + public void clear() {
1.299 + size = 0;
1.300 + }
1.301 +
1.302 + public int getSize() {
1.303 + return size;
1.304 + }
1.305 +
1.306 + public int get(final int index) {
1.307 + return types[index];
1.308 + }
1.309 +
1.310 + public static String typeString(final int type) {
1.311 + switch (type & 0xff) {
1.312 + case ITEM_Bogus:
1.313 + return "_top_";
1.314 + case ITEM_Integer:
1.315 + return "_int_";
1.316 + case ITEM_Float:
1.317 + return "_float_";
1.318 + case ITEM_Double:
1.319 + return "_double_";
1.320 + case ITEM_Long:
1.321 + return "_long_";
1.322 + case ITEM_Null:
1.323 + return "_null_";
1.324 + case ITEM_InitObject: // UninitializedThis
1.325 + return "_init_";
1.326 + case ITEM_Object:
1.327 + return "_object_";
1.328 + case ITEM_NewObject: // Uninitialized
1.329 + return "_new_";
1.330 + default:
1.331 + throw new IllegalArgumentException("Unknown type");
1.332 + }
1.333 + }
1.334 +
1.335 + @Override
1.336 + public String toString() {
1.337 + final StringBuilder sb = new StringBuilder("[");
1.338 + if (size > 0) {
1.339 + sb.append(typeString(types[0]));
1.340 + for (int i = 1; i < size; ++i) {
1.341 + sb.append(", ");
1.342 + sb.append(typeString(types[i]));
1.343 + }
1.344 + }
1.345 +
1.346 + return sb.append(']').toString();
1.347 + }
1.348 +
1.349 + private void ensureCapacity(final int minCapacity) {
1.350 + if ((minCapacity == 0)
1.351 + || (types != null) && (minCapacity <= types.length)) {
1.352 + return;
1.353 + }
1.354 +
1.355 + final int newCapacity =
1.356 + ((minCapacity + CAPACITY_INCREMENT - 1) / CAPACITY_INCREMENT)
1.357 + * CAPACITY_INCREMENT;
1.358 + final int[] newTypes = new int[newCapacity];
1.359 +
1.360 + if (size > 0) {
1.361 + arraycopy(types, 0, newTypes, 0, size);
1.362 + }
1.363 +
1.364 + types = newTypes;
1.365 + }
1.366 +
1.367 + // no System.arraycopy
1.368 + private void arraycopy(final int[] src, final int srcPos,
1.369 + final int[] dest, final int destPos,
1.370 + final int length) {
1.371 + for (int i = 0; i < length; ++i) {
1.372 + dest[destPos + i] = src[srcPos + i];
1.373 + }
1.374 + }
1.375 +}