Index: lucene/src/java/org/apache/lucene/util/ArrayUtil.java =================================================================== --- lucene/src/java/org/apache/lucene/util/ArrayUtil.java (revision 1097776) +++ lucene/src/java/org/apache/lucene/util/ArrayUtil.java (working copy) @@ -17,8 +17,12 @@ * limitations under the License. */ +import java.lang.reflect.Array; +import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.Comparator; +import java.util.List; /** * Methods for manipulating arrays. @@ -584,6 +588,7 @@ public static > void quickSort(T[] a, int fromIndex, int toIndex) { if (toIndex-fromIndex <= 1) return; getSorter(a).quickSort(fromIndex, toIndex-1); + assert saneComparator(a, fromIndex, toIndex); } /** @@ -594,6 +599,33 @@ quickSort(a, 0, a.length); } + private static > boolean saneComparator(T[] a, int fromIndex, int toIndex) { + T[] a2 = copyOfRange(a, fromIndex, toIndex); + List a2l = Arrays.asList(a2); + Collections.reverse(a2l); + a2 = a2l.toArray(a2); + Arrays.sort(a2, 0, a2.length); + for (int i = 0; i < a2.length; i++) { + assert a2[i].equals(a[fromIndex+i]) : "insane comparator for: " + a.getClass().getComponentType().getName(); + } + return true; + } + + // apache harmony copyfRange + @SuppressWarnings("unchecked") + public static T[] copyOfRange(T[] original, int start, int end) { + if (original.length >= start && 0 <= start) { + if (start <= end) { + int length = end - start; + int copyLength = Math.min(length, original.length - start); + T[] copy = (T[]) Array.newInstance(original.getClass().getComponentType(), length); + System.arraycopy(original, start, copy, 0, copyLength); + return copy; + } + throw new IllegalArgumentException(); + } + throw new ArrayIndexOutOfBoundsException(); + } // mergeSorts: /**