3 * $Date: 2005-11-10 09:52:44 -0600 (Thu, 10 Nov 2005) $
6 * Copyright (C) 2003-2005 The Jmol Development Team
8 * Contact: jmol-developers@lists.sf.net
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
26 // 4/23/15 BH getComponentType fix
28 import java.lang.reflect.Array;
30 import java.util.Arrays;
31 import java.util.Hashtable;
35 final public class AU {
38 * Very important that this not be used with Int32Array or Float32Array,
39 * because it is not initialized to all zeros in MSIE 9.
42 * @param minimumLength
45 public static Object ensureLength(Object array, int minimumLength) {
46 if (array != null && getLength(array) >= minimumLength)
48 return arrayCopyObject(array, minimumLength);
51 public static String[] ensureLengthS(String[] array, int minimumLength) {
52 if (array != null && array.length >= minimumLength)
54 return arrayCopyS(array, minimumLength);
57 public static float[] ensureLengthA(float[] array, int minimumLength) {
58 if (array != null && array.length >= minimumLength)
60 return arrayCopyF(array, minimumLength);
63 public static int[] ensureLengthI(int[] array, int minimumLength) {
64 if (array != null && array.length >= minimumLength)
66 return arrayCopyI(array, minimumLength);
69 public static short[] ensureLengthShort(short[] array, int minimumLength) {
70 if (array != null && array.length >= minimumLength)
72 return arrayCopyShort(array, minimumLength);
75 public static byte[] ensureLengthByte(byte[] array, int minimumLength) {
76 if (array != null && array.length >= minimumLength)
78 return arrayCopyByte(array, minimumLength);
82 * Very important that this not be used with Int32Array or Float32Array,
83 * because it is not initialized to all zeros in MSIE 9.
88 public static Object doubleLength(Object array) {
89 return arrayCopyObject(array, (array == null ? 16 : 2 * getLength(array)));
92 public static String[] doubleLengthS(String[] array) {
93 return arrayCopyS(array, (array == null ? 16 : 2 * array.length));
96 public static float[] doubleLengthF(float[] array) {
97 return arrayCopyF(array, (array == null ? 16 : 2 * array.length));
100 public static int[] doubleLengthI(int[] array) {
101 return arrayCopyI(array, (array == null ? 16 : 2 * array.length));
104 public static short[] doubleLengthShort(short[] array) {
105 return arrayCopyShort(array, (array == null ? 16 : 2 * array.length));
108 public static byte[] doubleLengthByte(byte[] array) {
109 return arrayCopyByte(array, (array == null ? 16 : 2 * array.length));
112 public static boolean[] doubleLengthBool(boolean[] array) {
113 return arrayCopyBool(array, (array == null ? 16 : 2 * array.length));
116 public static Object deleteElements(Object array, int firstElement,
118 if (nElements == 0 || array == null)
120 int oldLength = getLength(array);
121 if (firstElement >= oldLength)
123 int n = oldLength - (firstElement + nElements);
126 Object t = newInstanceO(array, firstElement + n);
127 if (firstElement > 0)
128 System.arraycopy(array, 0, t, 0, firstElement);
130 System.arraycopy(array, firstElement + nElements, t, firstElement, n);
135 * note -- cannot copy if array is null!
141 public static Object arrayCopyObject(Object array, int newLength) {
142 //System.out.println("ArrayUtil.copy " + newLength + " " + array + " ");
144 return null; // We can't allocate since we don't know the type of array
146 int oldLength = getLength(array);
147 if (newLength == oldLength)
149 Object t = newInstanceO(array, newLength);
150 System.arraycopy(array, 0, t, 0, oldLength < newLength ? oldLength
157 * Very important that this not be used with Int32Array or Float32Array,
158 * because those need to be initialized to all zeros in MSIE 9, and
159 * MSIE 9 cannot distinguish Int32Array or Float32Array from Array.
165 private static Object newInstanceO(Object array, int n) {
169 * if (!array.getClass().getComponentType)
170 * return new Array(n);
174 return Array.newInstance(array.getClass().getComponentType(), n);
178 public static int getLength(Object array) {
182 * return array.length
186 return Array.getLength(array);
190 public static String[] arrayCopyS(String[] array, int newLength) {
192 newLength = array.length;
193 String[] t = new String[newLength];
195 int oldLength = array.length;
196 System.arraycopy(array, 0, t, 0, oldLength < newLength ? oldLength
202 public static int[][] arrayCopyII(int[][] array, int newLength) {
203 int[][] t = newInt2(newLength);
205 int oldLength = array.length;
206 System.arraycopy(array, 0, t, 0, oldLength < newLength ? oldLength
212 public static T3[] arrayCopyPt(T3[] array, int newLength) {
214 newLength = array.length;
215 T3[] t = new T3[newLength];
217 int oldLength = array.length;
218 System.arraycopy(array, 0, t, 0, oldLength < newLength ? oldLength
224 public static float[] arrayCopyF(float[] array, int newLength) {
226 newLength = array.length;
227 float[] t = new float[newLength];
229 int oldLength = array.length;
230 System.arraycopy(array, 0, t, 0, oldLength < newLength ? oldLength
236 public static int[] arrayCopyI(int[] array, int newLength) {
238 newLength = array.length;
239 int[] t = new int[newLength];
241 int oldLength = array.length;
242 System.arraycopy(array, 0, t, 0, oldLength < newLength ? oldLength
249 * a specialized method that allows copying from a starting point either
250 * to the end or to the middle (color schemes, especially)
254 * @return array or null
256 public static int[] arrayCopyRangeI(int[] array, int i0, int n) {
259 int oldLength = array.length;
260 if (n == -1) n = oldLength;
261 if (n == -2) n = oldLength / 2;
263 int[] t = new int[n];
264 System.arraycopy(array, i0, t, 0, n);
268 public static int[] arrayCopyRangeRevI(int[] array, int i0, int n) {
271 int[] t = arrayCopyRangeI(array, i0, n);
274 for (int i = n / 2; --i >= 0;)
275 swapInt(t, i, n - 1 - i);
279 public static short[] arrayCopyShort(short[] array, int newLength) {
281 newLength = array.length;
282 short[] t = new short[newLength];
284 int oldLength = array.length;
285 System.arraycopy(array, 0, t, 0, oldLength < newLength ? oldLength
291 public static byte[] arrayCopyByte(byte[] array, int newLength) {
293 newLength = array.length;
294 byte[] t = new byte[newLength];
296 int oldLength = array.length;
297 System.arraycopy(array, 0, t, 0, oldLength < newLength ? oldLength
303 public static boolean[] arrayCopyBool(boolean[] array, int newLength) {
305 newLength = array.length;
306 boolean[] t = new boolean[newLength];
308 int oldLength = array.length;
309 System.arraycopy(array, 0, t, 0, oldLength < newLength ? oldLength
315 public static void swapInt(int[] array, int indexA, int indexB) {
316 int t = array[indexA];
317 array[indexA] = array[indexB];
322 public static void swap(short[] array, int indexA, int indexB) {
323 short t = array[indexA];
324 array[indexA] = array[indexB];
328 public static void swap(float[] array, int indexA, int indexB) {
329 float t = array[indexA];
330 array[indexA] = array[indexB];
335 public static String dumpArray(String msg, float[][] A, int x1, int x2, int y1, int y2) {
336 String s = "dumpArray: " + msg + "\n";
337 for (int x = x1; x <= x2; x++)
338 s += "\t*" + x + "*";
339 for (int y = y2; y >= y1; y--) {
340 s += "\n*" + y + "*";
341 for (int x = x1; x <= x2; x++)
342 s += "\t" + (x < A.length && y < A[x].length ? A[x][y] : Float.NaN);
347 public static String dumpIntArray(int[] A, int n) {
349 for (int i = 0; i < n; i++)
354 public static String sortedItem(Lst<String> v, int n) {
359 String[] keys = v.toArray(new String[v.size()]);
361 return keys[n % keys.length];
365 * Helper method for creating a List<Tx>[] without warnings.
367 * @param <type> Type of objects in the list.
368 * @param size Array size.
369 * @return Array of List<type>
371 @SuppressWarnings("unchecked")
372 public static <type> Lst<type>[] createArrayOfArrayList(int size) {
373 return new Lst[size];
377 * Helper method for creating a Map<K, V>[] without warnings.
379 * @param <K> Type of object for the keys in the map.
380 * @param <V> Type of object for the values in the map.
381 * @param size Array size.
382 * @return Array of Map<K, V>
384 @SuppressWarnings("unchecked")
385 public static <K, V> Map<K, V>[] createArrayOfHashtable(int size) {
386 return new Hashtable[size];
389 public static void swap(Object[] o, int i, int j) {
395 public static float[][] newFloat2(int n) {
399 * return Clazz.newArray(n, null);
403 return new float[n][];
407 public static int[][] newInt2(int n) {
411 * return Clazz.newArray(n, null);
419 public static int[][][] newInt3(int nx, int ny) {
423 * return Clazz.newArray(nx, null);
427 return (ny < 0 ? new int[nx][][] : new int[nx][ny][]);
431 public static float[][][] newFloat3(int nx, int ny) {
435 * return Clazz.newArray(nx, null);
439 return (ny < 0 ? new float[nx][][] : new float[nx][ny][]);
443 public static int[][][][] newInt4(int n) {
447 * return Clazz.newArray(n, null);
451 return new int[n][][][];
455 public static short[][] newShort2(int n) {
459 * return Clazz.newArray(n, null);
463 return new short[n][];
467 public static byte[][] newByte2(int n) {
471 * return Clazz.newArray(n, null);
475 return new byte[n][];
479 public static double[][] newDouble2(int n) {
483 * return Clazz.newArray(n, null);
487 return new double[n][];
492 * remove all keys from a map that start with given root
495 * @return number removed
497 public static int removeMapKeys(Map<String, ?> map, String root) {
498 Lst<String> list = new Lst<String>();
499 for (String key: map.keySet())
500 if (key.startsWith(root))
502 for (int i = list.size(); --i >= 0;)
503 map.remove(list.get(i));
507 public static boolean isAS(Object x) {
510 * look also for array with first null element
511 * so untypable -- just call it a String[]
512 * (group3Lists, created in ModelLoader)
515 * return Clazz.isAS(x);
518 return x instanceof String[];
522 public static boolean isASS(Object x) {
525 * return Clazz.isASS(x);
528 return x instanceof String[][];
532 public static boolean isAP(Object x) {
535 * return Clazz.isAP(x);
538 return x instanceof T3[];
542 public static boolean isAF(Object x) {
545 * return Clazz.isAF(x);
548 return x instanceof float[];
552 public static boolean isAFloat(Object x) {
555 * return Clazz.isAFloat(x);
558 return x instanceof Float[];
562 public static boolean isAD(Object x) {
565 * return Clazz.isAF(x);
568 return x instanceof double[];
572 public static boolean isADD(Object x) {
575 * return Clazz.isAFF(x);
578 return x instanceof double[][];
582 public static boolean isAB(Object x) {
585 * return Clazz.isAI(x);
588 return x instanceof byte[];
592 public static boolean isAI(Object x) {
595 * return Clazz.isAI(x);
598 return x instanceof int[];
602 public static boolean isAII(Object x) {
605 * return Clazz.isAII(x);
608 return (x instanceof int[][]);
612 public static boolean isAFF(Object x) {
615 * return Clazz.isAFF(x);
618 return x instanceof float[][];
622 public static boolean isAFFF(Object x) {
625 * return Clazz.isAFFF(x);
628 return x instanceof float[][][];
633 * Ensure that we have signed and not unsigned bytes
634 * coming out of any process, but particularly out of
639 public static void ensureSignedBytes(byte[] b) {
643 * for (var i = b.length; --i >= 0;) {
644 * var j = b[i] & 0xFF;
645 * if (j >= 0x80) j -= 0x100;