|
// This is the Array constructor I was testing. Note that if we can't create a primitive backing array we don't bother to copy the array again, we use the one we've already sorted. |
|
|
|
private static <Element> java.lang.Object createArray( |
|
final TypeDescriptor $reifiedElement, |
|
ceylon.language.Iterable<? extends Element,?> elements, |
|
final Callable<? extends Comparison> comparing) { |
|
int size = Util.toInt(elements.getSize()); |
|
java.lang.Class<?> clazz = $reifiedElement.getArrayElementClass(); |
|
final java.lang.Object[] sortedArray; |
|
if (comparing != null) { |
|
// If we have a comparing function, fill an Object array and sort it |
|
sortedArray = (java.lang.Object[]) java.lang.reflect.Array |
|
.newInstance($reifiedElement.getArrayElementClass(), size); |
|
final Iterator<?> iterator = elements.iterator(); |
|
for (int i=0; i<sortedArray.length; i++) { |
|
sortedArray[i] = iterator.next(); |
|
} |
|
Arrays.sort(sortedArray, new ComparingComparator<>(comparing)); |
|
elements = new ObjectArray.ObjectArrayIterable<Element>($reifiedElement, (Element[])sortedArray); |
|
} else { |
|
sortedArray = null; |
|
} |
|
final Iterator<?> iterator = elements.iterator(); |
|
if (!$reifiedElement.containsNull()) { |
|
if (clazz==String.class) { |
|
//note: we don't unbox strings in an Array<String?> |
|
// because it would break javaObjectArray() |
|
java.lang.String[] array = new java.lang.String[size]; |
|
if (elements instanceof Array) { |
|
arraycopy(((Array<?>)elements).array, 0, array, 0, size); |
|
} |
|
else { |
|
for (int i=0; i<array.length; i++) { |
|
String s = (String) iterator.next(); |
|
array[i] = s==null ? null : s.value; |
|
} |
|
} |
|
return array; |
|
} |
|
else if (clazz==Integer.class) { |
|
long[] array = new long[size]; |
|
if (elements instanceof Array) { |
|
arraycopy(((Array<?>)elements).array, 0, array, 0, size); |
|
} |
|
else { |
|
for (int i=0; i<array.length; i++) { |
|
array[i] = ((Integer) iterator.next()).value; |
|
} |
|
} |
|
return array; |
|
} |
|
else if (clazz==Float.class) { |
|
double[] array = new double[size]; |
|
if (elements instanceof Array) { |
|
arraycopy(((Array<?>)elements).array, 0, array, 0, size); |
|
} |
|
else { |
|
for (int i=0; i<array.length; i++) { |
|
array[i] = ((Float) iterator.next()).value; |
|
} |
|
} |
|
return array; |
|
} |
|
else if (clazz==Character.class) { |
|
int[] array = new int[size]; |
|
if (elements instanceof Array) { |
|
arraycopy(((Array<?>)elements).array, 0, array, 0, size); |
|
} |
|
else { |
|
for (int i=0; i<array.length; i++) { |
|
array[i] = ((Character) iterator.next()).codePoint; |
|
} |
|
} |
|
return array; |
|
} |
|
else if (clazz==Boolean.class) { |
|
boolean[] array = new boolean[size]; |
|
if (elements instanceof Array) { |
|
arraycopy(((Array<?>)elements).array, 0, array, 0, size); |
|
} |
|
else { |
|
for (int i=0; i<array.length; i++) { |
|
array[i] = ((Boolean) iterator.next()).booleanValue(); |
|
} |
|
} |
|
return array; |
|
} |
|
else if (clazz==java.lang.Boolean.class) { |
|
boolean[] array = new boolean[size]; |
|
if (elements instanceof Array) { |
|
arraycopy(((Array<?>)elements).array, 0, array, 0, size); |
|
} |
|
else { |
|
for (int i=0; i<array.length; i++) { |
|
array[i] = ((java.lang.Boolean) iterator.next()).booleanValue(); |
|
} |
|
} |
|
return array; |
|
} |
|
else if (clazz==java.lang.Character.class) { |
|
char[] array = new char[size]; |
|
if (elements instanceof Array) { |
|
arraycopy(((Array<?>)elements).array, 0, array, 0, size); |
|
} |
|
else { |
|
for (int i=0; i<array.length; i++) { |
|
array[i] = ((java.lang.Character) iterator.next()).charValue(); |
|
} |
|
} |
|
return array; |
|
} |
|
else if (clazz==java.lang.Float.class) { |
|
float[] array = new float[size]; |
|
if (elements instanceof Array) { |
|
arraycopy(((Array<?>)elements).array, 0, array, 0, size); |
|
} |
|
else { |
|
for (int i=0; i<array.length; i++) { |
|
array[i] = ((java.lang.Float) iterator.next()).floatValue(); |
|
} |
|
} |
|
return array; |
|
} |
|
else if (clazz==java.lang.Double.class) { |
|
double[] array = new double[size]; |
|
if (elements instanceof Array) { |
|
arraycopy(((Array<?>)elements).array, 0, array, 0, size); |
|
} |
|
else { |
|
for (int i=0; i<array.length; i++) { |
|
array[i] = ((java.lang.Double) iterator.next()).doubleValue(); |
|
} |
|
} |
|
return array; |
|
} |
|
else if (clazz==java.lang.Byte.class) { |
|
byte[] array = new byte[size]; |
|
if (elements instanceof Array) { |
|
arraycopy(((Array<?>)elements).array, 0, array, 0, size); |
|
} |
|
else { |
|
for (int i=0; i<array.length; i++) { |
|
array[i] = ((java.lang.Byte) iterator.next()).byteValue(); |
|
} |
|
} |
|
return array; |
|
} |
|
else if (clazz==java.lang.Short.class) { |
|
short[] array = new short[size]; |
|
if (elements instanceof Array) { |
|
arraycopy(((Array<?>)elements).array, 0, array, 0, size); |
|
} |
|
else { |
|
for (int i=0; i<array.length; i++) { |
|
array[i] = ((java.lang.Short) iterator.next()).shortValue(); |
|
} |
|
} |
|
return array; |
|
} |
|
else if (clazz==java.lang.Integer.class) { |
|
int[] array = new int[size]; |
|
if (elements instanceof Array) { |
|
arraycopy(((Array<?>)elements).array, 0, array, 0, size); |
|
} |
|
else { |
|
for (int i=0; i<array.length; i++) { |
|
array[i] = ((java.lang.Integer) iterator.next()).intValue(); |
|
} |
|
} |
|
return array; |
|
} |
|
else if (clazz==java.lang.Long.class) { |
|
long[] array = new long[size]; |
|
if (elements instanceof Array) { |
|
arraycopy(((Array<?>)elements).array, 0, array, 0, size); |
|
} |
|
else { |
|
for (int i=0; i<array.length; i++) { |
|
array[i] = ((java.lang.Long) iterator.next()).longValue(); |
|
} |
|
} |
|
return array; |
|
} |
|
} |
|
|
|
if (sortedArray != null) { |
|
return sortedArray; |
|
} else { |
|
java.lang.Object[] array = (java.lang.Object[]) java.lang.reflect.Array |
|
.newInstance($reifiedElement.getArrayElementClass(), size); |
|
for (int i=0; i<array.length; i++) { |
|
array[i] = iterator.next(); |
|
} |
|
return array; |
|
} |
|
} |