diff options
Diffstat (limited to 'android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/ArrayUtils.java')
-rw-r--r-- | android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/ArrayUtils.java | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/ArrayUtils.java b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/ArrayUtils.java new file mode 100644 index 0000000000..d806ec5992 --- /dev/null +++ b/android/3rd_party/HoloEverywhere/library/src/org/holoeverywhere/util/ArrayUtils.java @@ -0,0 +1,187 @@ + +package org.holoeverywhere.util; + +import java.lang.reflect.Array; + +public class ArrayUtils { + private static final int CACHE_SIZE = 73; + private static Object[] EMPTY = new Object[0]; + private static Object[] sCache = new Object[ArrayUtils.CACHE_SIZE]; + + @SuppressWarnings("unchecked") + public static <T> T[] appendElement(Class<T> kind, T[] array, T element) { + final T[] result; + final int end; + if (array != null) { + end = array.length; + result = (T[]) Array.newInstance(kind, end + 1); + System.arraycopy(array, 0, result, 0, end); + } else { + end = 0; + result = (T[]) Array.newInstance(kind, 1); + } + result[end] = element; + return result; + } + + public static int[] appendInt(int[] cur, int val) { + if (cur == null) { + return new int[] { + val + }; + } + final int N = cur.length; + for (int i = 0; i < N; i++) { + if (cur[i] == val) { + return cur; + } + } + int[] ret = new int[N + 1]; + System.arraycopy(cur, 0, ret, 0, N); + ret[N] = val; + return ret; + } + + public static boolean contains(int[] array, int value) { + for (int element : array) { + if (element == value) { + return true; + } + } + return false; + } + + public static <T> boolean contains(T[] array, T value) { + for (T element : array) { + if (element == null) { + if (value == null) { + return true; + } + } else { + if (value != null && element.equals(value)) { + return true; + } + } + } + return false; + } + + @SuppressWarnings("unchecked") + public static <T> T[] emptyArray(Class<T> kind) { + if (kind == Object.class) { + return (T[]) ArrayUtils.EMPTY; + } + int bucket = (System.identityHashCode(kind) / 8 & 0x7FFFFFFF) + % ArrayUtils.CACHE_SIZE; + Object cache = ArrayUtils.sCache[bucket]; + if (cache == null || cache.getClass().getComponentType() != kind) { + cache = Array.newInstance(kind, 0); + ArrayUtils.sCache[bucket] = cache; + } + return (T[]) cache; + } + + public static boolean equals(byte[] array1, byte[] array2, int length) { + if (array1 == array2) { + return true; + } + if (array1 == null || array2 == null || array1.length < length + || array2.length < length) { + return false; + } + for (int i = 0; i < length; i++) { + if (array1[i] != array2[i]) { + return false; + } + } + return true; + } + + public static int idealBooleanArraySize(int need) { + return ArrayUtils.idealByteArraySize(need); + } + + public static int idealByteArraySize(int need) { + for (int i = 4; i < 32; i++) { + if (need <= (1 << i) - 12) { + return (1 << i) - 12; + } + } + + return need; + } + + public static int idealCharArraySize(int need) { + return ArrayUtils.idealByteArraySize(need * 2) / 2; + } + + public static int idealFloatArraySize(int need) { + return ArrayUtils.idealByteArraySize(need * 4) / 4; + } + + public static int idealIntArraySize(int need) { + return ArrayUtils.idealByteArraySize(need * 4) / 4; + } + + public static int idealLongArraySize(int need) { + return ArrayUtils.idealByteArraySize(need * 8) / 8; + } + + public static int idealObjectArraySize(int need) { + return ArrayUtils.idealByteArraySize(need * 4) / 4; + } + + public static int idealShortArraySize(int need) { + return ArrayUtils.idealByteArraySize(need * 2) / 2; + } + + @SuppressWarnings("unchecked") + public static <T> T[] removeElement(Class<T> kind, T[] array, T element) { + if (array != null) { + final int length = array.length; + for (int i = 0; i < length; i++) { + if (array[i] == element) { + if (length == 1) { + return null; + } + T[] result = (T[]) Array.newInstance(kind, length - 1); + System.arraycopy(array, 0, result, 0, i); + System.arraycopy(array, i + 1, result, i, length - i - 1); + return result; + } + } + } + return array; + } + + public static int[] removeInt(int[] cur, int val) { + if (cur == null) { + return null; + } + final int N = cur.length; + for (int i = 0; i < N; i++) { + if (cur[i] == val) { + int[] ret = new int[N - 1]; + if (i > 0) { + System.arraycopy(cur, 0, ret, 0, i); + } + if (i < N - 1) { + System.arraycopy(cur, i + 1, ret, i, N - i - 1); + } + return ret; + } + } + return cur; + } + + public static long total(long[] array) { + long total = 0; + for (long value : array) { + total += value; + } + return total; + } + + private ArrayUtils() { + } +} |