package jetbrains.mps.internal.collections.runtime;
/*Generated by MPS */
import java.lang.reflect.Array;
import jetbrains.mps.internal.collections.runtime.impl.NullSequence;
import java.util.Iterator;
public class ArrayUtils {
public ArrayUtils() {
}
public static boolean[] toBooleanArray(ISequence<? extends Boolean> seq) {
return (boolean[]) ArrayUtils.createAndFillArray(Boolean.TYPE, seq);
}
public static byte[] toByteArray(ISequence<? extends Byte> seq) {
return (byte[]) ArrayUtils.createAndFillArray(Byte.TYPE, seq);
}
public static char[] toCharArray(ISequence<? extends Character> seq) {
return (char[]) ArrayUtils.createAndFillArray(Character.TYPE, seq);
}
public static double[] toDoubleArray(ISequence<? extends Double> seq) {
return (double[]) ArrayUtils.createAndFillArray(Double.TYPE, seq);
}
public static float[] toFloatArray(ISequence<? extends Float> seq) {
return (float[]) ArrayUtils.createAndFillArray(Float.TYPE, seq);
}
public static int[] toIntArray(ISequence<? extends Integer> seq) {
return (int[]) ArrayUtils.createAndFillArray(Integer.TYPE, seq);
}
public static long[] toLongArray(ISequence<? extends Long> seq) {
return (long[]) ArrayUtils.createAndFillArray(Long.TYPE, seq);
}
public static short[] toShortArray(ISequence<? extends Short> seq) {
return (short[]) ArrayUtils.createAndFillArray(Short.TYPE, seq);
}
public static ISequence<Boolean> fromBooleanArray(boolean[] array) {
return Sequence.<Boolean>fromIterable(ArrayUtils.<Boolean>iterableFromArray(array));
}
public static ISequence<Byte> fromByteArray(byte[] array) {
return Sequence.<Byte>fromIterable(ArrayUtils.<Byte>iterableFromArray(array));
}
public static ISequence<Character> fromCharacterArray(char[] array) {
return Sequence.<Character>fromIterable(ArrayUtils.<Character>iterableFromArray(array));
}
public static ISequence<Double> fromDoubleArray(double[] array) {
return Sequence.<Double>fromIterable(ArrayUtils.<Double>iterableFromArray(array));
}
public static ISequence<Float> fromFloatArray(float[] array) {
return Sequence.<Float>fromIterable(ArrayUtils.<Float>iterableFromArray(array));
}
public static ISequence<Integer> fromIntegerArray(int[] array) {
return Sequence.<Integer>fromIterable(ArrayUtils.<Integer>iterableFromArray(array));
}
public static ISequence<Long> fromLongArray(long[] array) {
return Sequence.<Long>fromIterable(ArrayUtils.<Long>iterableFromArray(array));
}
public static ISequence<Short> fromShortArray(short[] array) {
return Sequence.<Short>fromIterable(ArrayUtils.<Short>iterableFromArray(array));
}
public static Object newArrayInstance(Class<?> componentType, int length) {
return Array.newInstance(componentType, length);
}
public static Object newArrayInstance(Class<?> componentType, int... dims) {
return Array.newInstance(componentType, dims);
}
public static <T> T[] asArray(T... ts) {
return ts;
}
private static <T> Object createAndFillArray(Class<T> type, ISequence<? extends T> seq) {
Object arr = Array.newInstance(type, seq.count());
int idx = 0;
for (Object o : seq) {
Array.set(arr, idx++, o);
}
return arr;
}
private static <T> Iterable<T> iterableFromArray(final Object array) {
if (Sequence.USE_NULL_SEQUENCE) {
if (array == null) {
return NullSequence.instance();
}
}
return new Iterable<T>() {
@Override
public Iterator<T> iterator() {
return new ArrayUtils.ArrayIterator<T>(array);
}
};
}
private static class ArrayIterator<T> implements Iterator<T> {
private int idx = 0;
private Object array;
private int length;
private ArrayIterator(Object array) {
this.array = array;
length = Array.getLength(array);
}
@Override
public boolean hasNext() {
return idx < length;
}
@SuppressWarnings(value = "unchecked")
@Override
public T next() {
return (T) Array.get(array, idx++);
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
}