ArrayUtils.java
/*
* Copyright (c) 2014 Oracle and/or its affiliates. All rights reserved. This
* code is released under a tri EPL/GPL/LGPL license. You can use it,
* redistribute it and/or modify it under the terms of the:
*
* Eclipse Public License version 1.0
* GNU General Public License version 2
* GNU Lesser General Public License version 2.1
*/
package org.jruby.truffle.runtime.util;
import com.oracle.truffle.api.CompilerAsserts;
import org.jruby.truffle.nodes.RubyNode;
import org.jruby.truffle.runtime.RubyArguments;
import java.util.Arrays;
public abstract class ArrayUtils {
public static boolean contains(int[] array, int value) {
for (int n = 0; n < array.length; n++) {
if (array[n] == value) {
return true;
}
}
return false;
}
public static boolean contains(long[] array, long value) {
for (int n = 0; n < array.length; n++) {
if (array[n] == value) {
return true;
}
}
return false;
}
public static boolean contains(double[] array, double value) {
for (int n = 0; n < array.length; n++) {
if (array[n] == value) {
return true;
}
}
return false;
}
public static boolean contains(Object[] array, int length, Object value) {
for (int n = 0; n < length; n++) {
if (array[n].equals(value)) {
return true;
}
}
return false;
}
public static Object[] box(int[] unboxed) {
return box(unboxed, 0);
}
public static Object[] box(long[] unboxed) {
return box(unboxed, 0);
}
public static Object[] box(double[] unboxed) {
return box(unboxed, 0);
}
public static Object[] box(Object array) {
return box(array, 0);
}
public static Object[] box(int[] unboxed, int extra) {
final Object[] boxed = new Object[unboxed.length + extra];
for (int n = 0; n < unboxed.length; n++) {
boxed[n] = unboxed[n];
}
return boxed;
}
public static Object[] box(long[] unboxed, int extra) {
final Object[] boxed = new Object[unboxed.length + extra];
for (int n = 0; n < unboxed.length; n++) {
boxed[n] = unboxed[n];
}
return boxed;
}
public static Object[] box(double[] unboxed, int extra) {
final Object[] boxed = new Object[unboxed.length + extra];
for (int n = 0; n < unboxed.length; n++) {
boxed[n] = unboxed[n];
}
return boxed;
}
public static Object[] boxUntil(int[] unboxed, int length) {
final Object[] boxed = new Object[length];
for (int n = 0; n < length; n++) {
boxed[n] = unboxed[n];
}
return boxed;
}
public static Object[] boxUntil(long[] unboxed, int length) {
final Object[] boxed = new Object[length];
for (int n = 0; n < length; n++) {
boxed[n] = unboxed[n];
}
return boxed;
}
public static Object[] boxUntil(double[] unboxed, int length) {
final Object[] boxed = new Object[length];
for (int n = 0; n < length; n++) {
boxed[n] = unboxed[n];
}
return boxed;
}
public static Object[] box(Object array, int extra) {
CompilerAsserts.neverPartOfCompilation();
if (array == null) {
return new Object[extra];
} if (array instanceof int[]) {
return box((int[]) array, extra);
} else if (array instanceof long[]) {
return box((long[]) array, extra);
} else if (array instanceof double[]) {
return box((double[]) array, extra);
} else if (array instanceof Object[]) {
final Object[] objectArray = (Object[]) array;
return Arrays.copyOf(objectArray, objectArray.length + extra);
} else {
throw new UnsupportedOperationException();
}
}
public static int[] unboxInteger(Object[] unboxed, int length) {
CompilerAsserts.neverPartOfCompilation();
final int[] boxed = new int[length];
for (int n = 0; n < length; n++) {
boxed[n] = (int) unboxed[n];
}
return boxed;
}
public static long[] unboxLong(Object[] unboxed, int length) {
CompilerAsserts.neverPartOfCompilation();
final long[] boxed = new long[length];
for (int n = 0; n < length; n++) {
final Object value = unboxed[n];
if (value instanceof Integer) {
boxed[n] = (long) (int) unboxed[n];
} else if (value instanceof Long) {
boxed[n] = (long) unboxed[n];
}
}
return boxed;
}
public static double[] unboxDouble(Object[] unboxed, int length) {
CompilerAsserts.neverPartOfCompilation();
final double[] boxed = new double[length];
for (int n = 0; n < length; n++) {
boxed[n] = (double) unboxed[n];
}
return boxed;
}
public static void copy(Object source, Object[] destination, int destinationStart, int length) {
RubyNode.notDesignedForCompilation();
if (length == 0) {
return;
}
if (source instanceof int[]) {
final int[] unboxedSource = (int[]) source;
for (int n = 0; n < length; n++) {
destination[destinationStart + n] = unboxedSource[n];
}
} else if (source instanceof long[]) {
final long[] unboxedSource = (long[]) source;
for (int n = 0; n < length; n++) {
destination[destinationStart + n] = unboxedSource[n];
}
} else if (source instanceof double[]) {
final double[] unboxedSource = (double[]) source;
for (int n = 0; n < length; n++) {
destination[destinationStart + n] = unboxedSource[n];
}
} else if (source instanceof Object[]) {
RubyArguments.arraycopy((Object[]) source, 0, destination, destinationStart, length);
} else {
throw new UnsupportedOperationException();
}
}
public static long[] longCopyOf(int[] ints) {
final long[] longs = new long[ints.length];
for (int n = 0; n < ints.length; n++) {
longs[n] = ints[n];
}
return longs;
}
public static int capacity(int current, int needed) {
if (needed < 16) {
return 16;
} else {
int capacity = current;
while (capacity < needed) {
capacity *= 2;
}
return capacity;
}
}
}