1b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/* 2b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * ProGuard -- shrinking, optimization, obfuscation, and preverification 3b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * of Java bytecode. 4b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * 5b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) 6b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * 7b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * This program is free software; you can redistribute it and/or modify it 8b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * under the terms of the GNU General Public License as published by the Free 9b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Software Foundation; either version 2 of the License, or (at your option) 10b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * any later version. 11b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * 12b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * This program is distributed in the hope that it will be useful, but WITHOUT 13b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * more details. 16b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * 17b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * You should have received a copy of the GNU General Public License along 18b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * with this program; if not, write to the Free Software Foundation, Inc., 19b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 21b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangpackage proguard.util; 22b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 23b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport java.lang.reflect.Array; 24b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport java.util.Arrays; 25b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 26b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/** 27b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * This class contains utility methods operating on arrays. 28b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 29b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangpublic class ArrayUtil 30b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{ 31b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 32b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Returns whether the elements of the two given arrays are the same. 33b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array1 the first array. 34b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array2 the second array. 35b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the size of the arrays to be checked. 36b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return whether the elements are the same. 37b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 38b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static boolean equal(byte[] array1, byte[] array2, int size) 39b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 40b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang for (int index = 0; index < size; index++) 41b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 42b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (array1[index] != array2[index]) 43b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 44b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return false; 45b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 46b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 47b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 48b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return true; 49b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 50b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 51b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 52b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 53b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Returns whether the elements of the two given arrays are the same. 54b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array1 the first array. 55b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array2 the second array. 56b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the size of the arrays to be checked. 57b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return whether the elements are the same. 58b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 59b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static boolean equal(short[] array1, short[] array2, int size) 60b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 61b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang for (int index = 0; index < size; index++) 62b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 63b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (array1[index] != array2[index]) 64b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 65b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return false; 66b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 67b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 68b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 69b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return true; 70b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 71b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 72b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 73b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 74b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Returns whether the elements of the two given arrays are the same. 75b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array1 the first array. 76b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array2 the second array. 77b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the size of the arrays to be checked. 78b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return whether the elements are the same. 79b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 80b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static boolean equal(int[] array1, int[] array2, int size) 81b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 82b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang for (int index = 0; index < size; index++) 83b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 84b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (array1[index] != array2[index]) 85b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 86b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return false; 87b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 88b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 89b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 90b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return true; 91b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 92b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 93b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 94b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 95b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Returns whether the elements of the two given arrays are the same. 96b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array1 the first array. 97b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array2 the second array. 98b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the size of the arrays to be checked. 99b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return whether the elements are the same. 100b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 101b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static boolean equal(Object[] array1, Object[] array2, int size) 102b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 103b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang for (int index = 0; index < size; index++) 104b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 105b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (!array1[index].equals(array2[index])) 106b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 107b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return false; 108b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 109b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 110b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 111b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return true; 112b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 113b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 114b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 115b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 116b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Returns a hash code for the elements of the given array. 117b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 118b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the size of the array to be taken into account. 119b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return a hash code. 120b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 121b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static int hashCode(byte[] array, int size) 122b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 123b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int hashCode = 0; 124b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 125b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang for (int index = 0; index < size; index++) 126b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 127b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang hashCode ^= array[index]; 128b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 129b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 130b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return hashCode; 131b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 132b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 133b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 134b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 135b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Returns a hash code for the elements of the given array. 136b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 137b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the size of the array to be taken into account. 138b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return a hash code. 139b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 140b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static int hashCode(short[] array, int size) 141b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 142b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int hashCode = 0; 143b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 144b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang for (int index = 0; index < size; index++) 145b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 146b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang hashCode ^= array[index]; 147b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 148b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 149b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return hashCode; 150b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 151b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 152b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 153b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 154b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Returns a hash code for the elements of the given array. 155b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 156b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the size of the array to be taken into account. 157b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return a hash code. 158b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 159b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static int hashCode(int[] array, int size) 160b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 161b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int hashCode = 0; 162b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 163b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang for (int index = 0; index < size; index++) 164b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 165b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang hashCode ^= array[index]; 166b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 167b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 168b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return hashCode; 169b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 170b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 171b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 172b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 173b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Returns a hash code for the elements of the given array. 174b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 175b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the size of the array to be taken into account. 176b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return a hash code. 177b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 178b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static int hashCode(Object[] array, int size) 179b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 180b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int hashCode = 0; 181b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 182b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang for (int index = 0; index < size; index++) 183b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 184b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang hashCode ^= array[index].hashCode(); 185b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 186b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 187b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return hashCode; 188b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 189b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 190b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 191b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 192b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Compares the elements of the two given arrays. 193b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array1 the first array. 194b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size1 the size of the first array. 195b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array2 the second array. 196b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size2 the size of the second array. 197b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return 0 if all elements are the same, 198b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * -1 if the first different element in the first array is smaller 199b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * than the corresponding element in the second array, 200b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * or 1 if it is larger. 201b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 202b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static int compare(byte[] array1, int size1, 203b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang byte[] array2, int size2) 204b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 205b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int minSize = Math.min(size1, size2); 206b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 207b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang for (int index = 0; index < minSize; index++) 208b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 209b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (array1[index] < array2[index]) 210b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 211b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return -1; 212b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 213b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang else if (array1[index] > array2[index]) 214b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 215b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return 1; 216b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 217b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 218b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 219b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return size1 < size2 ? -1 : 220b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang size1 == size2 ? 0 : 221b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 1; 222b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 223b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 224b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 225b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 226b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Compares the elements of the two given arrays. 227b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array1 the first array. 228b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size1 the size of the first array. 229b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array2 the second array. 230b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size2 the size of the second array. 231b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return 0 if all elements are the same, 232b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * -1 if the first different element in the first array is smaller 233b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * than the corresponding element in the second array, 234b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * or 1 if it is larger. 235b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 236b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static int compare(short[] array1, int size1, 237b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang short[] array2, int size2) 238b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 239b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int minSize = Math.min(size1, size2); 240b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 241b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang for (int index = 0; index < minSize; index++) 242b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 243b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (array1[index] < array2[index]) 244b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 245b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return -1; 246b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 247b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang else if (array1[index] > array2[index]) 248b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 249b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return 1; 250b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 251b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 252b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 253b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return size1 < size2 ? -1 : 254b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang size1 == size2 ? 0 : 255b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 1; 256b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 257b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 258b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 259b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 260b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Compares the elements of the two given arrays. 261b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array1 the first array. 262b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size1 the size of the first array. 263b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array2 the second array. 264b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size2 the size of the second array. 265b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return 0 if all elements are the same, 266b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * -1 if the first different element in the first array is smaller 267b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * than the corresponding element in the second array, 268b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * or 1 if it is larger. 269b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 270b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static int compare(int[] array1, int size1, 271b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int[] array2, int size2) 272b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 273b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int minSize = Math.min(size1, size2); 274b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 275b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang for (int index = 0; index < minSize; index++) 276b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 277b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (array1[index] < array2[index]) 278b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 279b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return -1; 280b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 281b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang else if (array1[index] > array2[index]) 282b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 283b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return 1; 284b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 285b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 286b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 287b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return size1 < size2 ? -1 : 288b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang size1 == size2 ? 0 : 289b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 1; 290b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 291b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 292b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 293b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 294b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Compares the elements of the two given arrays. 295b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array1 the first array. 296b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size1 the size of the first array. 297b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array2 the second array. 298b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size2 the size of the second array. 299b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return 0 if all elements are the same, 300b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * -1 if the first different element in the first array is smaller 301b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * than the corresponding element in the second array, 302b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * or 1 if it is larger. 303b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 304b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static int compare(Comparable[] array1, int size1, 305b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Comparable[] array2, int size2) 306b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 307b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int minSize = Math.min(size1, size2); 308b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 309b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang for (int index = 0; index < minSize; index++) 310b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 311b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int comparison = ObjectUtil.compare(array1[index], array2[index]); 312b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (comparison != 0) 313b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 314b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return comparison; 315b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 316b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 317b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 318b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return size1 < size2 ? -1 : 319b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang size1 == size2 ? 0 : 320b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 1; 321b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 322b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 323b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 324b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 325b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Ensures the given array has a given size. 326b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 327b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the target size of the array. 328b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be extended. 329b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 330b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static boolean[] extendArray(boolean[] array, int size) 331b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 332b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Reuse the existing array if possible. 333b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (array.length >= size) 334b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 335b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 336b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 337b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 338b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Otherwise create and initialize a new array. 339b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang boolean[] newArray = new boolean[size]; 340b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 341b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang System.arraycopy(array, 0, 342b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang newArray, 0, 343b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array.length); 344b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 345b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return newArray; 346b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 347b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 348b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 349b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 350b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Ensures the given array has a given size. 351b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 352b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the target size of the array. 353b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param initialValue the initial value of the elements. 354b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be 355b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * extended. 356b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 357b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static boolean[] ensureArraySize(boolean[] array, 358b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int size, 359b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang boolean initialValue) 360b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 361b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Is the existing array large enough? 362b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (array.length >= size) 363b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 364b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Reinitialize the existing array. 365b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Arrays.fill(array, 0, size, initialValue); 366b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 367b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang else 368b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 369b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Otherwise create and initialize a new array. 370b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array = new boolean[size]; 371b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 372b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (initialValue) 373b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 374b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Arrays.fill(array, 0, size, initialValue); 375b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 376b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 377b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 378b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 379b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 380b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 381b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 382b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 383b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Adds the given element to the given array. 384b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * The array is extended if necessary. 385b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 386b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the original size of the array. 387b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param element the element to be added. 388b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be extended. 389b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 390b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static byte[] add(byte[] array, int size, byte element) 391b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 392b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array = extendArray(array, size + 1); 393b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 394b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array[size] = element; 395b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 396b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 397b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 398b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 399b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 400b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 401b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Inserts the given element in the given array. 402b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * The array is extended if necessary. 403b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 404b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the original size of the array. 405b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param index the index at which the element is to be added. 406b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param element the element to be added. 407b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be extended. 408b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 409b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static byte[] insert(byte[] array, int size, int index, byte element) 410b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 411b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array = extendArray(array, size + 1); 412b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 413b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Move the last part. 414b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang System.arraycopy(array, index, 415b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array, index + 1, 416b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang size - index); 417b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 418b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array[index] = element; 419b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 420b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 421b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 422b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 423b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 424b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 425b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Removes the specified element from the given array. 426b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 427b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the original size of the array. 428b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param index the index of the element to be removed. 429b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 430b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static void remove(byte[] array, int size, int index) 431b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 432b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang System.arraycopy(array, index + 1, 433b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array, index, 434b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array.length - index - 1); 435b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 436b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array[size - 1] = 0; 437b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 438b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 439b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 440b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 441b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Ensures the given array has a given size. 442b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 443b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the target size of the array. 444b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be extended. 445b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 446b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static byte[] extendArray(byte[] array, int size) 447b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 448b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Reuse the existing array if possible. 449b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (array.length >= size) 450b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 451b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 452b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 453b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 454b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Otherwise create and initialize a new array. 455b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang byte[] newArray = new byte[size]; 456b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 457b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang System.arraycopy(array, 0, 458b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang newArray, 0, 459b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array.length); 460b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 461b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return newArray; 462b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 463b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 464b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 465b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 466b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Ensures the given array has a given size. 467b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 468b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the target size of the array. 469b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param initialValue the initial value of the elements. 470b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be 471b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * extended. 472b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 473b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static byte[] ensureArraySize(byte[] array, 474b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int size, 475b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang byte initialValue) 476b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 477b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Is the existing array large enough? 478b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (array.length >= size) 479b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 480b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Reinitialize the existing array. 481b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Arrays.fill(array, 0, size, initialValue); 482b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 483b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang else 484b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 485b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Otherwise create and initialize a new array. 486b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array = new byte[size]; 487b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 488b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (initialValue != 0) 489b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 490b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Arrays.fill(array, 0, size, initialValue); 491b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 492b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 493b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 494b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 495b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 496b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 497b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 498b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 499b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Adds the given element to the given array. 500b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * The array is extended if necessary. 501b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 502b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the original size of the array. 503b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param element the element to be added. 504b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be extended. 505b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 506b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static short[] add(short[] array, int size, short element) 507b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 508b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array = extendArray(array, size + 1); 509b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 510b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array[size] = element; 511b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 512b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 513b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 514b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 515b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 516b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 517b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Inserts the given element in the given array. 518b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * The array is extended if necessary. 519b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 520b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the original size of the array. 521b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param index the index at which the element is to be added. 522b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param element the element to be added. 523b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be extended. 524b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 525b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static short[] insert(short[] array, int size, int index, short element) 526b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 527b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array = extendArray(array, size + 1); 528b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 529b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Move the last part. 530b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang System.arraycopy(array, index, 531b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array, index + 1, 532b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang size - index); 533b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 534b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array[index] = element; 535b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 536b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 537b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 538b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 539b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 540b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 541b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Removes the specified element from the given array. 542b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 543b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the original size of the array. 544b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param index the index of the element to be removed. 545b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 546b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static void remove(short[] array, int size, int index) 547b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 548b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang System.arraycopy(array, index + 1, 549b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array, index, 550b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array.length - index - 1); 551b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 552b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array[size - 1] = 0; 553b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 554b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 555b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 556b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 557b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Ensures the given array has a given size. 558b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 559b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the target size of the array. 560b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be extended. 561b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 562b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static short[] extendArray(short[] array, int size) 563b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 564b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Reuse the existing array if possible. 565b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (array.length >= size) 566b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 567b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 568b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 569b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 570b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Otherwise create and initialize a new array. 571b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang short[] newArray = new short[size]; 572b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 573b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang System.arraycopy(array, 0, 574b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang newArray, 0, 575b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array.length); 576b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 577b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return newArray; 578b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 579b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 580b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 581b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 582b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Ensures the given array has a given size. 583b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 584b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the target size of the array. 585b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param initialValue the initial value of the elements. 586b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be 587b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * extended. 588b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 589b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static short[] ensureArraySize(short[] array, 590b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int size, 591b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang short initialValue) 592b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 593b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Is the existing array large enough? 594b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (array.length >= size) 595b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 596b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Reinitialize the existing array. 597b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Arrays.fill(array, 0, size, initialValue); 598b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 599b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang else 600b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 601b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Otherwise create and initialize a new array. 602b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array = new short[size]; 603b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 604b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (initialValue != 0) 605b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 606b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Arrays.fill(array, 0, size, initialValue); 607b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 608b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 609b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 610b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 611b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 612b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 613b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 614b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 615b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Adds the given element to the given array. 616b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * The array is extended if necessary. 617b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 618b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the original size of the array. 619b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param element the element to be added. 620b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be extended. 621b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 622b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static int[] add(int[] array, int size, int element) 623b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 624b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array = extendArray(array, size + 1); 625b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 626b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array[size] = element; 627b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 628b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 629b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 630b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 631b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 632b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 633b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Inserts the given element in the given array. 634b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * The array is extended if necessary. 635b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 636b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the original size of the array. 637b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param index the index at which the element is to be added. 638b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param element the element to be added. 639b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be extended. 640b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 641b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static int[] insert(int[] array, int size, int index, int element) 642b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 643b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array = extendArray(array, size + 1); 644b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 645b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Move the last part. 646b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang System.arraycopy(array, index, 647b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array, index + 1, 648b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang size - index); 649b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 650b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array[index] = element; 651b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 652b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 653b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 654b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 655b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 656b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 657b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Removes the specified element from the given array. 658b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 659b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the original size of the array. 660b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param index the index of the element to be removed. 661b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 662b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static void remove(int[] array, int size, int index) 663b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 664b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang System.arraycopy(array, index + 1, 665b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array, index, 666b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array.length - index - 1); 667b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 668b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array[size - 1] = 0; 669b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 670b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 671b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 672b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 673b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Ensures the given array has a given size. 674b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 675b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the target size of the array. 676b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be extended. 677b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 678b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static int[] extendArray(int[] array, int size) 679b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 680b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Reuse the existing array if possible. 681b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (array.length >= size) 682b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 683b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 684b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 685b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 686b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Otherwise create and initialize a new array. 687b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int[] newArray = new int[size]; 688b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 689b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang System.arraycopy(array, 0, 690b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang newArray, 0, 691b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array.length); 692b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 693b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return newArray; 694b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 695b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 696b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 697b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 698b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Ensures the given array has a given size. 699b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 700b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the target size of the array. 701b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param initialValue the initial value of the elements. 702b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be 703b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * extended. 704b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 705b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static int[] ensureArraySize(int[] array, 706b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int size, 707b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int initialValue) 708b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 709b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Is the existing array large enough? 710b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (array.length >= size) 711b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 712b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Reinitialize the existing array. 713b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Arrays.fill(array, 0, size, initialValue); 714b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 715b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang else 716b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 717b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Otherwise create and initialize a new array. 718b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array = new int[size]; 719b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 720b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (initialValue != 0) 721b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 722b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Arrays.fill(array, 0, size, initialValue); 723b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 724b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 725b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 726b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 727b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 728b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 729b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 730b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 731b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Adds the given element to the given array. 732b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * The array is extended if necessary. 733b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 734b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the original size of the array. 735b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param element the element to be added. 736b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be extended. 737b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 738b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static long[] add(long[] array, int size, long element) 739b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 740b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array = extendArray(array, size + 1); 741b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 742b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array[size] = element; 743b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 744b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 745b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 746b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 747b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 748b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 749b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Inserts the given element in the given array. 750b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * The array is extended if necessary. 751b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 752b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the original size of the array. 753b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param index the index at which the element is to be added. 754b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param element the element to be added. 755b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be extended. 756b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 757b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static long[] insert(long[] array, int size, int index, long element) 758b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 759b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array = extendArray(array, size + 1); 760b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 761b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Move the last part. 762b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang System.arraycopy(array, index, 763b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array, index + 1, 764b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang size - index); 765b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 766b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array[index] = element; 767b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 768b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 769b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 770b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 771b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 772b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 773b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Removes the specified element from the given array. 774b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 775b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the original size of the array. 776b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param index the index of the element to be removed. 777b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 778b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static void remove(long[] array, int size, int index) 779b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 780b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang System.arraycopy(array, index + 1, 781b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array, index, 782b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array.length - index - 1); 783b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 784b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array[size - 1] = 0; 785b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 786b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 787b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 788b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 789b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Ensures the given array has a given size. 790b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 791b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the target size of the array. 792b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be extended. 793b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 794b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static long[] extendArray(long[] array, int size) 795b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 796b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Reuse the existing array if possible. 797b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (array.length >= size) 798b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 799b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 800b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 801b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 802b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Otherwise create and initialize a new array. 803b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang long[] newArray = new long[size]; 804b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 805b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang System.arraycopy(array, 0, 806b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang newArray, 0, 807b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array.length); 808b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 809b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return newArray; 810b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 811b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 812b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 813b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 814b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Ensures the given array has a given size. 815b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 816b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the target size of the array. 817b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param initialValue the initial value of the elements. 818b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be 819b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * extended. 820b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 821b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static long[] ensureArraySize(long[] array, 822b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int size, 823b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang long initialValue) 824b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 825b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Is the existing array large enough? 826b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (array.length >= size) 827b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 828b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Reinitialize the existing array. 829b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Arrays.fill(array, 0, size, initialValue); 830b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 831b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang else 832b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 833b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Otherwise create and initialize a new array. 834b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array = new long[size]; 835b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 836b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (initialValue != 0L) 837b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 838b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Arrays.fill(array, 0, size, initialValue); 839b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 840b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 841b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 842b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 843b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 844b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 845b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 846b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 847b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Adds the given element to the given array. 848b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * The array is extended if necessary. 849b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 850b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the original size of the array. 851b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param element the element to be added. 852b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be extended. 853b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 854b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static Object[] add(Object[] array, int size, Object element) 855b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 856b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array = extendArray(array, size + 1); 857b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 858b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array[size] = element; 859b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 860b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 861b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 862b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 863b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 864b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 865b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Inserts the given element in the given array. 866b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * The array is extended if necessary. 867b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 868b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the original size of the array. 869b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param index the index at which the element is to be added. 870b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param element the element to be added. 871b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be extended. 872b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 873b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static Object[] insert(Object[] array, int size, int index, Object element) 874b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 875b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array = extendArray(array, size + 1); 876b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 877b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Move the last part. 878b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang System.arraycopy(array, index, 879b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array, index + 1, 880b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang size - index); 881b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 882b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array[index] = element; 883b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 884b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 885b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 886b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 887b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 888b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 889b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Removes the specified element from the given array. 890b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 891b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the original size of the array. 892b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param index the index of the element to be removed. 893b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 894b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static void remove(Object[] array, int size, int index) 895b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 896b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang System.arraycopy(array, index + 1, 897b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array, index, 898b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array.length - index - 1); 899b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 900b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array[size - 1] = null; 901b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 902b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 903b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 904b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 905b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Ensures the given array has a given size. 906b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 907b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the target size of the array. 908b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be extended. 909b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 910b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static Object[] extendArray(Object[] array, int size) 911b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 912b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Reuse the existing array if possible. 913b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (array.length >= size) 914b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 915b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 916b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 917b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 918b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Otherwise create and initialize a new array. 919b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Object[] newArray = (Object[])Array.newInstance(array.getClass().getComponentType(), size); 920b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 921b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang System.arraycopy(array, 0, 922b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang newArray, 0, 923b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array.length); 924b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 925b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return newArray; 926b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 927b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 928b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 929b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 930b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Ensures the given array has a given size. 931b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param array the array. 932b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param size the target size of the array. 933b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @param initialValue the initial value of the elements. 934b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @return the original array, or a copy if it had to be 935b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * extended. 936b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 937b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public static Object[] ensureArraySize(Object[] array, 938b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int size, 939b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Object initialValue) 940b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 941b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Is the existing array large enough? 942b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (array.length >= size) 943b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 944b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Reinitialize the existing array. 945b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Arrays.fill(array, 0, size, initialValue); 946b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 947b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang else 948b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 949b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Otherwise create and initialize a new array. 950b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang array = (Object[])Array.newInstance(array.getClass().getComponentType(), size); 951b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 952b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (initialValue != null) 953b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 954b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Arrays.fill(array, 0, size, initialValue); 955b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 956b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 957b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 958b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return array; 959b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 960b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang} 961