1 /* |
|
2 * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. |
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
|
4 * |
|
5 * This code is free software; you can redistribute it and/or modify it |
|
6 * under the terms of the GNU General Public License version 2 only, as |
|
7 * published by the Free Software Foundation. |
|
8 * |
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
|
13 * accompanied this code). |
|
14 * |
|
15 * You should have received a copy of the GNU General Public License version |
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
18 * |
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
20 * or visit www.oracle.com if you need additional information or have any |
|
21 * questions. |
|
22 */ |
|
23 |
|
24 /* Adapted from test/java/util/Arrays/Sorting.java |
|
25 * |
|
26 * Where that test checks Arrays.sort against manual quicksort routines, |
|
27 * this test checks parallelSort against either Arrays.sort or manual |
|
28 * quicksort routines. |
|
29 */ |
|
30 |
|
31 /* |
|
32 * @test |
|
33 * @bug 8003981 |
|
34 * @run main ParallelSorting -shortrun |
|
35 * @summary Exercise Arrays.parallelSort (adapted from test Sorting) |
|
36 * |
|
37 * @author Vladimir Yaroslavskiy |
|
38 * @author Jon Bentley |
|
39 * @author Josh Bloch |
|
40 */ |
|
41 |
|
42 import java.util.Arrays; |
|
43 import java.util.Random; |
|
44 import java.io.PrintStream; |
|
45 import java.util.Comparator; |
|
46 |
|
47 public class ParallelSorting { |
|
48 private static final PrintStream out = System.out; |
|
49 private static final PrintStream err = System.err; |
|
50 |
|
51 // Array lengths used in a long run (default) |
|
52 private static final int[] LONG_RUN_LENGTHS = { |
|
53 1000, 10000, 100000, 1000000 }; |
|
54 |
|
55 // Array lengths used in a short run |
|
56 private static final int[] SHORT_RUN_LENGTHS = { |
|
57 5000, 9000, 10000, 12000 }; |
|
58 |
|
59 // Random initial values used in a long run (default) |
|
60 private static final long[] LONG_RUN_RANDOMS = { 666, 0xC0FFEE, 999 }; |
|
61 |
|
62 // Random initial values used in a short run |
|
63 private static final long[] SHORT_RUN_RANDOMS = { 666 }; |
|
64 |
|
65 public static void main(String[] args) { |
|
66 boolean shortRun = args.length > 0 && args[0].equals("-shortrun"); |
|
67 long start = System.currentTimeMillis(); |
|
68 |
|
69 if (shortRun) { |
|
70 testAndCheck(SHORT_RUN_LENGTHS, SHORT_RUN_RANDOMS); |
|
71 } else { |
|
72 testAndCheck(LONG_RUN_LENGTHS, LONG_RUN_RANDOMS); |
|
73 } |
|
74 long end = System.currentTimeMillis(); |
|
75 |
|
76 out.format("PASSED in %d sec.\n", Math.round((end - start) / 1E3)); |
|
77 } |
|
78 |
|
79 private static void testAndCheck(int[] lengths, long[] randoms) { |
|
80 testEmptyAndNullIntArray(); |
|
81 testEmptyAndNullLongArray(); |
|
82 testEmptyAndNullShortArray(); |
|
83 testEmptyAndNullCharArray(); |
|
84 testEmptyAndNullByteArray(); |
|
85 testEmptyAndNullFloatArray(); |
|
86 testEmptyAndNullDoubleArray(); |
|
87 |
|
88 for (int length : lengths) { |
|
89 testMergeSort(length); |
|
90 testAndCheckRange(length); |
|
91 testAndCheckSubArray(length); |
|
92 } |
|
93 for (long seed : randoms) { |
|
94 for (int length : lengths) { |
|
95 testAndCheckWithInsertionSort(length, new MyRandom(seed)); |
|
96 testAndCheckWithCheckSum(length, new MyRandom(seed)); |
|
97 testAndCheckWithScrambling(length, new MyRandom(seed)); |
|
98 testAndCheckFloat(length, new MyRandom(seed)); |
|
99 testAndCheckDouble(length, new MyRandom(seed)); |
|
100 testStable(length, new MyRandom(seed)); |
|
101 } |
|
102 } |
|
103 } |
|
104 |
|
105 private static void testEmptyAndNullIntArray() { |
|
106 ourDescription = "Check empty and null array"; |
|
107 Arrays.parallelSort(new int[]{}); |
|
108 Arrays.parallelSort(new int[]{}, 0, 0); |
|
109 |
|
110 try { |
|
111 Arrays.parallelSort((int[]) null); |
|
112 } catch (NullPointerException expected) { |
|
113 try { |
|
114 Arrays.parallelSort((int[]) null, 0, 0); |
|
115 } catch (NullPointerException expected2) { |
|
116 return; |
|
117 } |
|
118 failed("Arrays.parallelSort(int[],fromIndex,toIndex) shouldn't " + |
|
119 "catch null array"); |
|
120 } |
|
121 failed("Arrays.parallelSort(int[]) shouldn't catch null array"); |
|
122 } |
|
123 |
|
124 private static void testEmptyAndNullLongArray() { |
|
125 ourDescription = "Check empty and null array"; |
|
126 Arrays.parallelSort(new long[]{}); |
|
127 Arrays.parallelSort(new long[]{}, 0, 0); |
|
128 |
|
129 try { |
|
130 Arrays.parallelSort((long[]) null); |
|
131 } catch (NullPointerException expected) { |
|
132 try { |
|
133 Arrays.parallelSort((long[]) null, 0, 0); |
|
134 } catch (NullPointerException expected2) { |
|
135 return; |
|
136 } |
|
137 failed("Arrays.parallelSort(long[],fromIndex,toIndex) shouldn't " + |
|
138 "catch null array"); |
|
139 } |
|
140 failed("Arrays.parallelSort(long[]) shouldn't catch null array"); |
|
141 } |
|
142 |
|
143 private static void testEmptyAndNullShortArray() { |
|
144 ourDescription = "Check empty and null array"; |
|
145 Arrays.parallelSort(new short[]{}); |
|
146 Arrays.parallelSort(new short[]{}, 0, 0); |
|
147 |
|
148 try { |
|
149 Arrays.parallelSort((short[]) null); |
|
150 } catch (NullPointerException expected) { |
|
151 try { |
|
152 Arrays.parallelSort((short[]) null, 0, 0); |
|
153 } catch (NullPointerException expected2) { |
|
154 return; |
|
155 } |
|
156 failed("Arrays.parallelSort(short[],fromIndex,toIndex) shouldn't " + |
|
157 "catch null array"); |
|
158 } |
|
159 failed("Arrays.parallelSort(short[]) shouldn't catch null array"); |
|
160 } |
|
161 |
|
162 private static void testEmptyAndNullCharArray() { |
|
163 ourDescription = "Check empty and null array"; |
|
164 Arrays.parallelSort(new char[]{}); |
|
165 Arrays.parallelSort(new char[]{}, 0, 0); |
|
166 |
|
167 try { |
|
168 Arrays.parallelSort((char[]) null); |
|
169 } catch (NullPointerException expected) { |
|
170 try { |
|
171 Arrays.parallelSort((char[]) null, 0, 0); |
|
172 } catch (NullPointerException expected2) { |
|
173 return; |
|
174 } |
|
175 failed("Arrays.parallelSort(char[],fromIndex,toIndex) shouldn't " + |
|
176 "catch null array"); |
|
177 } |
|
178 failed("Arrays.parallelSort(char[]) shouldn't catch null array"); |
|
179 } |
|
180 |
|
181 private static void testEmptyAndNullByteArray() { |
|
182 ourDescription = "Check empty and null array"; |
|
183 Arrays.parallelSort(new byte[]{}); |
|
184 Arrays.parallelSort(new byte[]{}, 0, 0); |
|
185 |
|
186 try { |
|
187 Arrays.parallelSort((byte[]) null); |
|
188 } catch (NullPointerException expected) { |
|
189 try { |
|
190 Arrays.parallelSort((byte[]) null, 0, 0); |
|
191 } catch (NullPointerException expected2) { |
|
192 return; |
|
193 } |
|
194 failed("Arrays.parallelSort(byte[],fromIndex,toIndex) shouldn't " + |
|
195 "catch null array"); |
|
196 } |
|
197 failed("Arrays.parallelSort(byte[]) shouldn't catch null array"); |
|
198 } |
|
199 |
|
200 private static void testEmptyAndNullFloatArray() { |
|
201 ourDescription = "Check empty and null array"; |
|
202 Arrays.parallelSort(new float[]{}); |
|
203 Arrays.parallelSort(new float[]{}, 0, 0); |
|
204 |
|
205 try { |
|
206 Arrays.parallelSort((float[]) null); |
|
207 } catch (NullPointerException expected) { |
|
208 try { |
|
209 Arrays.parallelSort((float[]) null, 0, 0); |
|
210 } catch (NullPointerException expected2) { |
|
211 return; |
|
212 } |
|
213 failed("Arrays.parallelSort(float[],fromIndex,toIndex) shouldn't " + |
|
214 "catch null array"); |
|
215 } |
|
216 failed("Arrays.parallelSort(float[]) shouldn't catch null array"); |
|
217 } |
|
218 |
|
219 private static void testEmptyAndNullDoubleArray() { |
|
220 ourDescription = "Check empty and null array"; |
|
221 Arrays.parallelSort(new double[]{}); |
|
222 Arrays.parallelSort(new double[]{}, 0, 0); |
|
223 |
|
224 try { |
|
225 Arrays.parallelSort((double[]) null); |
|
226 } catch (NullPointerException expected) { |
|
227 try { |
|
228 Arrays.parallelSort((double[]) null, 0, 0); |
|
229 } catch (NullPointerException expected2) { |
|
230 return; |
|
231 } |
|
232 failed("Arrays.parallelSort(double[],fromIndex,toIndex) shouldn't " + |
|
233 "catch null array"); |
|
234 } |
|
235 failed("Arrays.parallelSort(double[]) shouldn't catch null array"); |
|
236 } |
|
237 |
|
238 private static void testAndCheckSubArray(int length) { |
|
239 ourDescription = "Check sorting of subarray"; |
|
240 int[] golden = new int[length]; |
|
241 boolean newLine = false; |
|
242 |
|
243 for (int m = 1; m < length / 2; m *= 2) { |
|
244 newLine = true; |
|
245 int fromIndex = m; |
|
246 int toIndex = length - m; |
|
247 |
|
248 prepareSubArray(golden, fromIndex, toIndex, m); |
|
249 int[] test = golden.clone(); |
|
250 |
|
251 for (TypeConverter converter : TypeConverter.values()) { |
|
252 out.println("Test 'subarray': " + converter + |
|
253 " length = " + length + ", m = " + m); |
|
254 Object convertedGolden = converter.convert(golden); |
|
255 Object convertedTest = converter.convert(test); |
|
256 sortSubArray(convertedTest, fromIndex, toIndex); |
|
257 checkSubArray(convertedTest, fromIndex, toIndex, m); |
|
258 } |
|
259 } |
|
260 if (newLine) { |
|
261 out.println(); |
|
262 } |
|
263 } |
|
264 |
|
265 private static void testAndCheckRange(int length) { |
|
266 ourDescription = "Check range check"; |
|
267 int[] golden = new int[length]; |
|
268 |
|
269 for (int m = 1; m < 2 * length; m *= 2) { |
|
270 for (int i = 1; i <= length; i++) { |
|
271 golden[i - 1] = i % m + m % i; |
|
272 } |
|
273 for (TypeConverter converter : TypeConverter.values()) { |
|
274 out.println("Test 'range': " + converter + |
|
275 ", length = " + length + ", m = " + m); |
|
276 Object convertedGolden = converter.convert(golden); |
|
277 checkRange(convertedGolden, m); |
|
278 } |
|
279 } |
|
280 out.println(); |
|
281 } |
|
282 |
|
283 private static void testStable(int length, MyRandom random) { |
|
284 ourDescription = "Check if sorting is stable"; |
|
285 Pair[] a = build(length, random); |
|
286 |
|
287 out.println("Test 'stable': " + "random = " + random.getSeed() + |
|
288 ", length = " + length); |
|
289 Arrays.parallelSort(a); |
|
290 checkSorted(a); |
|
291 checkStable(a); |
|
292 out.println(); |
|
293 |
|
294 a = build(length, random); |
|
295 |
|
296 out.println("Test 'stable' comparator: " + "random = " + random.getSeed() + |
|
297 ", length = " + length); |
|
298 Arrays.parallelSort(a, pairCmp); |
|
299 checkSorted(a); |
|
300 checkStable(a); |
|
301 out.println(); |
|
302 |
|
303 } |
|
304 |
|
305 private static void checkSorted(Pair[] a) { |
|
306 for (int i = 0; i < a.length - 1; i++) { |
|
307 if (a[i].getKey() > a[i + 1].getKey()) { |
|
308 failedSort(i, "" + a[i].getKey(), "" + a[i + 1].getKey()); |
|
309 } |
|
310 } |
|
311 } |
|
312 |
|
313 private static void checkStable(Pair[] a) { |
|
314 for (int i = 0; i < a.length / 4; ) { |
|
315 int key1 = a[i].getKey(); |
|
316 int value1 = a[i++].getValue(); |
|
317 int key2 = a[i].getKey(); |
|
318 int value2 = a[i++].getValue(); |
|
319 int key3 = a[i].getKey(); |
|
320 int value3 = a[i++].getValue(); |
|
321 int key4 = a[i].getKey(); |
|
322 int value4 = a[i++].getValue(); |
|
323 |
|
324 if (!(key1 == key2 && key2 == key3 && key3 == key4)) { |
|
325 failed("On position " + i + " keys are different " + |
|
326 key1 + ", " + key2 + ", " + key3 + ", " + key4); |
|
327 } |
|
328 if (!(value1 < value2 && value2 < value3 && value3 < value4)) { |
|
329 failed("Sorting is not stable at position " + i + |
|
330 ". Second values have been changed: " + value1 + ", " + |
|
331 value2 + ", " + value3 + ", " + value4); |
|
332 } |
|
333 } |
|
334 } |
|
335 |
|
336 private static Pair[] build(int length, Random random) { |
|
337 Pair[] a = new Pair[length * 4]; |
|
338 |
|
339 for (int i = 0; i < a.length; ) { |
|
340 int key = random.nextInt(); |
|
341 a[i++] = new Pair(key, 1); |
|
342 a[i++] = new Pair(key, 2); |
|
343 a[i++] = new Pair(key, 3); |
|
344 a[i++] = new Pair(key, 4); |
|
345 } |
|
346 return a; |
|
347 } |
|
348 |
|
349 private static Comparator<Pair> pairCmp = new Comparator<Pair>() { |
|
350 public int compare(Pair p1, Pair p2) { |
|
351 return p1.compareTo(p2); |
|
352 } |
|
353 }; |
|
354 |
|
355 private static final class Pair implements Comparable<Pair> { |
|
356 Pair(int key, int value) { |
|
357 myKey = key; |
|
358 myValue = value; |
|
359 } |
|
360 |
|
361 int getKey() { |
|
362 return myKey; |
|
363 } |
|
364 |
|
365 int getValue() { |
|
366 return myValue; |
|
367 } |
|
368 |
|
369 public int compareTo(Pair pair) { |
|
370 if (myKey < pair.myKey) { |
|
371 return -1; |
|
372 } |
|
373 if (myKey > pair.myKey) { |
|
374 return 1; |
|
375 } |
|
376 return 0; |
|
377 } |
|
378 |
|
379 @Override |
|
380 public String toString() { |
|
381 return "(" + myKey + ", " + myValue + ")"; |
|
382 } |
|
383 |
|
384 private int myKey; |
|
385 private int myValue; |
|
386 } |
|
387 |
|
388 |
|
389 private static void testAndCheckWithInsertionSort(int length, MyRandom random) { |
|
390 if (length > 1000) { |
|
391 return; |
|
392 } |
|
393 ourDescription = "Check sorting with insertion sort"; |
|
394 int[] golden = new int[length]; |
|
395 |
|
396 for (int m = 1; m < 2 * length; m *= 2) { |
|
397 for (UnsortedBuilder builder : UnsortedBuilder.values()) { |
|
398 builder.build(golden, m, random); |
|
399 int[] test = golden.clone(); |
|
400 |
|
401 for (TypeConverter converter : TypeConverter.values()) { |
|
402 out.println("Test 'insertion sort': " + converter + |
|
403 " " + builder + "random = " + random.getSeed() + |
|
404 ", length = " + length + ", m = " + m); |
|
405 Object convertedGolden = converter.convert(golden); |
|
406 Object convertedTest1 = converter.convert(test); |
|
407 Object convertedTest2 = converter.convert(test); |
|
408 sort(convertedTest1); |
|
409 sortByInsertionSort(convertedTest2); |
|
410 compare(convertedTest1, convertedTest2); |
|
411 } |
|
412 } |
|
413 } |
|
414 out.println(); |
|
415 } |
|
416 |
|
417 private static void testMergeSort(int length) { |
|
418 if (length < 1000) { |
|
419 return; |
|
420 } |
|
421 ourDescription = "Check merge sorting"; |
|
422 int[] golden = new int[length]; |
|
423 int period = 67; // java.util.DualPivotQuicksort.MAX_RUN_COUNT |
|
424 |
|
425 for (int m = period - 2; m <= period + 2; m++) { |
|
426 for (MergeBuilder builder : MergeBuilder.values()) { |
|
427 builder.build(golden, m); |
|
428 int[] test = golden.clone(); |
|
429 |
|
430 for (TypeConverter converter : TypeConverter.values()) { |
|
431 out.println("Test 'merge sort': " + converter + " " + |
|
432 builder + "length = " + length + ", m = " + m); |
|
433 Object convertedGolden = converter.convert(golden); |
|
434 sort(convertedGolden); |
|
435 checkSorted(convertedGolden); |
|
436 } |
|
437 } |
|
438 } |
|
439 out.println(); |
|
440 } |
|
441 |
|
442 private static void testAndCheckWithCheckSum(int length, MyRandom random) { |
|
443 ourDescription = "Check sorting with check sum"; |
|
444 int[] golden = new int[length]; |
|
445 |
|
446 for (int m = 1; m < 2 * length; m *= 2) { |
|
447 for (UnsortedBuilder builder : UnsortedBuilder.values()) { |
|
448 builder.build(golden, m, random); |
|
449 int[] test = golden.clone(); |
|
450 |
|
451 for (TypeConverter converter : TypeConverter.values()) { |
|
452 out.println("Test 'check sum': " + converter + |
|
453 " " + builder + "random = " + random.getSeed() + |
|
454 ", length = " + length + ", m = " + m); |
|
455 Object convertedGolden = converter.convert(golden); |
|
456 Object convertedTest = converter.convert(test); |
|
457 sort(convertedTest); |
|
458 checkWithCheckSum(convertedTest, convertedGolden); |
|
459 } |
|
460 } |
|
461 } |
|
462 out.println(); |
|
463 } |
|
464 |
|
465 private static void testAndCheckWithScrambling(int length, MyRandom random) { |
|
466 ourDescription = "Check sorting with scrambling"; |
|
467 int[] golden = new int[length]; |
|
468 |
|
469 for (int m = 1; m <= 7; m++) { |
|
470 if (m > length) { |
|
471 break; |
|
472 } |
|
473 for (SortedBuilder builder : SortedBuilder.values()) { |
|
474 builder.build(golden, m); |
|
475 int[] test = golden.clone(); |
|
476 scramble(test, random); |
|
477 |
|
478 for (TypeConverter converter : TypeConverter.values()) { |
|
479 out.println("Test 'scrambling': " + converter + |
|
480 " " + builder + "random = " + random.getSeed() + |
|
481 ", length = " + length + ", m = " + m); |
|
482 Object convertedGolden = converter.convert(golden); |
|
483 Object convertedTest = converter.convert(test); |
|
484 sort(convertedTest); |
|
485 compare(convertedTest, convertedGolden); |
|
486 } |
|
487 } |
|
488 } |
|
489 out.println(); |
|
490 } |
|
491 |
|
492 private static void testAndCheckFloat(int length, MyRandom random) { |
|
493 ourDescription = "Check float sorting"; |
|
494 float[] golden = new float[length]; |
|
495 final int MAX = 10; |
|
496 boolean newLine = false; |
|
497 |
|
498 for (int a = 0; a <= MAX; a++) { |
|
499 for (int g = 0; g <= MAX; g++) { |
|
500 for (int z = 0; z <= MAX; z++) { |
|
501 for (int n = 0; n <= MAX; n++) { |
|
502 for (int p = 0; p <= MAX; p++) { |
|
503 if (a + g + z + n + p > length) { |
|
504 continue; |
|
505 } |
|
506 if (a + g + z + n + p < length) { |
|
507 continue; |
|
508 } |
|
509 for (FloatBuilder builder : FloatBuilder.values()) { |
|
510 out.println("Test 'float': random = " + random.getSeed() + |
|
511 ", length = " + length + ", a = " + a + ", g = " + |
|
512 g + ", z = " + z + ", n = " + n + ", p = " + p); |
|
513 builder.build(golden, a, g, z, n, p, random); |
|
514 float[] test = golden.clone(); |
|
515 scramble(test, random); |
|
516 sort(test); |
|
517 compare(test, golden, a, n, g); |
|
518 } |
|
519 newLine = true; |
|
520 } |
|
521 } |
|
522 } |
|
523 } |
|
524 } |
|
525 if (newLine) { |
|
526 out.println(); |
|
527 } |
|
528 } |
|
529 |
|
530 private static void testAndCheckDouble(int length, MyRandom random) { |
|
531 ourDescription = "Check double sorting"; |
|
532 double[] golden = new double[length]; |
|
533 final int MAX = 10; |
|
534 boolean newLine = false; |
|
535 |
|
536 for (int a = 0; a <= MAX; a++) { |
|
537 for (int g = 0; g <= MAX; g++) { |
|
538 for (int z = 0; z <= MAX; z++) { |
|
539 for (int n = 0; n <= MAX; n++) { |
|
540 for (int p = 0; p <= MAX; p++) { |
|
541 if (a + g + z + n + p > length) { |
|
542 continue; |
|
543 } |
|
544 if (a + g + z + n + p < length) { |
|
545 continue; |
|
546 } |
|
547 for (DoubleBuilder builder : DoubleBuilder.values()) { |
|
548 out.println("Test 'double': random = " + random.getSeed() + |
|
549 ", length = " + length + ", a = " + a + ", g = " + |
|
550 g + ", z = " + z + ", n = " + n + ", p = " + p); |
|
551 builder.build(golden, a, g, z, n, p, random); |
|
552 double[] test = golden.clone(); |
|
553 scramble(test, random); |
|
554 sort(test); |
|
555 compare(test, golden, a, n, g); |
|
556 } |
|
557 newLine = true; |
|
558 } |
|
559 } |
|
560 } |
|
561 } |
|
562 } |
|
563 if (newLine) { |
|
564 out.println(); |
|
565 } |
|
566 } |
|
567 |
|
568 private static void prepareSubArray(int[] a, int fromIndex, int toIndex, int m) { |
|
569 for (int i = 0; i < fromIndex; i++) { |
|
570 a[i] = 0xDEDA; |
|
571 } |
|
572 int middle = (fromIndex + toIndex) >>> 1; |
|
573 int k = 0; |
|
574 |
|
575 for (int i = fromIndex; i < middle; i++) { |
|
576 a[i] = k++; |
|
577 } |
|
578 for (int i = middle; i < toIndex; i++) { |
|
579 a[i] = k--; |
|
580 } |
|
581 for (int i = toIndex; i < a.length; i++) { |
|
582 a[i] = 0xBABA; |
|
583 } |
|
584 } |
|
585 |
|
586 private static void scramble(int[] a, Random random) { |
|
587 for (int i = 0; i < a.length * 7; i++) { |
|
588 swap(a, random.nextInt(a.length), random.nextInt(a.length)); |
|
589 } |
|
590 } |
|
591 |
|
592 private static void scramble(float[] a, Random random) { |
|
593 for (int i = 0; i < a.length * 7; i++) { |
|
594 swap(a, random.nextInt(a.length), random.nextInt(a.length)); |
|
595 } |
|
596 } |
|
597 |
|
598 private static void scramble(double[] a, Random random) { |
|
599 for (int i = 0; i < a.length * 7; i++) { |
|
600 swap(a, random.nextInt(a.length), random.nextInt(a.length)); |
|
601 } |
|
602 } |
|
603 |
|
604 private static void swap(int[] a, int i, int j) { |
|
605 int t = a[i]; |
|
606 a[i] = a[j]; |
|
607 a[j] = t; |
|
608 } |
|
609 |
|
610 private static void swap(float[] a, int i, int j) { |
|
611 float t = a[i]; |
|
612 a[i] = a[j]; |
|
613 a[j] = t; |
|
614 } |
|
615 |
|
616 private static void swap(double[] a, int i, int j) { |
|
617 double t = a[i]; |
|
618 a[i] = a[j]; |
|
619 a[j] = t; |
|
620 } |
|
621 |
|
622 private static enum TypeConverter { |
|
623 INT { |
|
624 Object convert(int[] a) { |
|
625 return a.clone(); |
|
626 } |
|
627 }, |
|
628 LONG { |
|
629 Object convert(int[] a) { |
|
630 long[] b = new long[a.length]; |
|
631 |
|
632 for (int i = 0; i < a.length; i++) { |
|
633 b[i] = (long) a[i]; |
|
634 } |
|
635 return b; |
|
636 } |
|
637 }, |
|
638 BYTE { |
|
639 Object convert(int[] a) { |
|
640 byte[] b = new byte[a.length]; |
|
641 |
|
642 for (int i = 0; i < a.length; i++) { |
|
643 b[i] = (byte) a[i]; |
|
644 } |
|
645 return b; |
|
646 } |
|
647 }, |
|
648 SHORT { |
|
649 Object convert(int[] a) { |
|
650 short[] b = new short[a.length]; |
|
651 |
|
652 for (int i = 0; i < a.length; i++) { |
|
653 b[i] = (short) a[i]; |
|
654 } |
|
655 return b; |
|
656 } |
|
657 }, |
|
658 CHAR { |
|
659 Object convert(int[] a) { |
|
660 char[] b = new char[a.length]; |
|
661 |
|
662 for (int i = 0; i < a.length; i++) { |
|
663 b[i] = (char) a[i]; |
|
664 } |
|
665 return b; |
|
666 } |
|
667 }, |
|
668 FLOAT { |
|
669 Object convert(int[] a) { |
|
670 float[] b = new float[a.length]; |
|
671 |
|
672 for (int i = 0; i < a.length; i++) { |
|
673 b[i] = (float) a[i]; |
|
674 } |
|
675 return b; |
|
676 } |
|
677 }, |
|
678 DOUBLE { |
|
679 Object convert(int[] a) { |
|
680 double[] b = new double[a.length]; |
|
681 |
|
682 for (int i = 0; i < a.length; i++) { |
|
683 b[i] = (double) a[i]; |
|
684 } |
|
685 return b; |
|
686 } |
|
687 }, |
|
688 INTEGER { |
|
689 Object convert(int[] a) { |
|
690 Integer[] b = new Integer[a.length]; |
|
691 |
|
692 for (int i = 0; i < a.length; i++) { |
|
693 b[i] = new Integer(a[i]); |
|
694 } |
|
695 return b; |
|
696 } |
|
697 }; |
|
698 |
|
699 abstract Object convert(int[] a); |
|
700 |
|
701 @Override public String toString() { |
|
702 String name = name(); |
|
703 |
|
704 for (int i = name.length(); i < 9; i++) { |
|
705 name += " "; |
|
706 } |
|
707 return name; |
|
708 } |
|
709 } |
|
710 |
|
711 private static enum FloatBuilder { |
|
712 SIMPLE { |
|
713 void build(float[] x, int a, int g, int z, int n, int p, Random random) { |
|
714 int fromIndex = 0; |
|
715 float negativeValue = -random.nextFloat(); |
|
716 float positiveValue = random.nextFloat(); |
|
717 |
|
718 writeValue(x, negativeValue, fromIndex, n); |
|
719 fromIndex += n; |
|
720 |
|
721 writeValue(x, -0.0f, fromIndex, g); |
|
722 fromIndex += g; |
|
723 |
|
724 writeValue(x, 0.0f, fromIndex, z); |
|
725 fromIndex += z; |
|
726 |
|
727 writeValue(x, positiveValue, fromIndex, p); |
|
728 fromIndex += p; |
|
729 |
|
730 writeValue(x, Float.NaN, fromIndex, a); |
|
731 } |
|
732 }; |
|
733 |
|
734 abstract void build(float[] x, int a, int g, int z, int n, int p, Random random); |
|
735 } |
|
736 |
|
737 private static enum DoubleBuilder { |
|
738 SIMPLE { |
|
739 void build(double[] x, int a, int g, int z, int n, int p, Random random) { |
|
740 int fromIndex = 0; |
|
741 double negativeValue = -random.nextFloat(); |
|
742 double positiveValue = random.nextFloat(); |
|
743 |
|
744 writeValue(x, negativeValue, fromIndex, n); |
|
745 fromIndex += n; |
|
746 |
|
747 writeValue(x, -0.0d, fromIndex, g); |
|
748 fromIndex += g; |
|
749 |
|
750 writeValue(x, 0.0d, fromIndex, z); |
|
751 fromIndex += z; |
|
752 |
|
753 writeValue(x, positiveValue, fromIndex, p); |
|
754 fromIndex += p; |
|
755 |
|
756 writeValue(x, Double.NaN, fromIndex, a); |
|
757 } |
|
758 }; |
|
759 |
|
760 abstract void build(double[] x, int a, int g, int z, int n, int p, Random random); |
|
761 } |
|
762 |
|
763 private static void writeValue(float[] a, float value, int fromIndex, int count) { |
|
764 for (int i = fromIndex; i < fromIndex + count; i++) { |
|
765 a[i] = value; |
|
766 } |
|
767 } |
|
768 |
|
769 private static void compare(float[] a, float[] b, int numNaN, int numNeg, int numNegZero) { |
|
770 for (int i = a.length - numNaN; i < a.length; i++) { |
|
771 if (a[i] == a[i]) { |
|
772 failed("On position " + i + " must be NaN instead of " + a[i]); |
|
773 } |
|
774 } |
|
775 final int NEGATIVE_ZERO = Float.floatToIntBits(-0.0f); |
|
776 |
|
777 for (int i = numNeg; i < numNeg + numNegZero; i++) { |
|
778 if (NEGATIVE_ZERO != Float.floatToIntBits(a[i])) { |
|
779 failed("On position " + i + " must be -0.0 instead of " + a[i]); |
|
780 } |
|
781 } |
|
782 for (int i = 0; i < a.length - numNaN; i++) { |
|
783 if (a[i] != b[i]) { |
|
784 failedCompare(i, "" + a[i], "" + b[i]); |
|
785 } |
|
786 } |
|
787 } |
|
788 |
|
789 private static void writeValue(double[] a, double value, int fromIndex, int count) { |
|
790 for (int i = fromIndex; i < fromIndex + count; i++) { |
|
791 a[i] = value; |
|
792 } |
|
793 } |
|
794 |
|
795 private static void compare(double[] a, double[] b, int numNaN, int numNeg, int numNegZero) { |
|
796 for (int i = a.length - numNaN; i < a.length; i++) { |
|
797 if (a[i] == a[i]) { |
|
798 failed("On position " + i + " must be NaN instead of " + a[i]); |
|
799 } |
|
800 } |
|
801 final long NEGATIVE_ZERO = Double.doubleToLongBits(-0.0d); |
|
802 |
|
803 for (int i = numNeg; i < numNeg + numNegZero; i++) { |
|
804 if (NEGATIVE_ZERO != Double.doubleToLongBits(a[i])) { |
|
805 failed("On position " + i + " must be -0.0 instead of " + a[i]); |
|
806 } |
|
807 } |
|
808 for (int i = 0; i < a.length - numNaN; i++) { |
|
809 if (a[i] != b[i]) { |
|
810 failedCompare(i, "" + a[i], "" + b[i]); |
|
811 } |
|
812 } |
|
813 } |
|
814 |
|
815 private static enum SortedBuilder { |
|
816 REPEATED { |
|
817 void build(int[] a, int m) { |
|
818 int period = a.length / m; |
|
819 int i = 0; |
|
820 int k = 0; |
|
821 |
|
822 while (true) { |
|
823 for (int t = 1; t <= period; t++) { |
|
824 if (i >= a.length) { |
|
825 return; |
|
826 } |
|
827 a[i++] = k; |
|
828 } |
|
829 if (i >= a.length) { |
|
830 return; |
|
831 } |
|
832 k++; |
|
833 } |
|
834 } |
|
835 }, |
|
836 ORGAN_PIPES { |
|
837 void build(int[] a, int m) { |
|
838 int i = 0; |
|
839 int k = m; |
|
840 |
|
841 while (true) { |
|
842 for (int t = 1; t <= m; t++) { |
|
843 if (i >= a.length) { |
|
844 return; |
|
845 } |
|
846 a[i++] = k; |
|
847 } |
|
848 } |
|
849 } |
|
850 }; |
|
851 |
|
852 abstract void build(int[] a, int m); |
|
853 |
|
854 @Override public String toString() { |
|
855 String name = name(); |
|
856 |
|
857 for (int i = name.length(); i < 12; i++) { |
|
858 name += " "; |
|
859 } |
|
860 return name; |
|
861 } |
|
862 } |
|
863 |
|
864 private static enum MergeBuilder { |
|
865 ASCENDING { |
|
866 void build(int[] a, int m) { |
|
867 int period = a.length / m; |
|
868 int v = 1, i = 0; |
|
869 |
|
870 for (int k = 0; k < m; k++) { |
|
871 v = 1; |
|
872 for (int p = 0; p < period; p++) { |
|
873 a[i++] = v++; |
|
874 } |
|
875 } |
|
876 for (int j = i; j < a.length - 1; j++) { |
|
877 a[j] = v++; |
|
878 } |
|
879 a[a.length - 1] = 0; |
|
880 } |
|
881 }, |
|
882 DESCENDING { |
|
883 void build(int[] a, int m) { |
|
884 int period = a.length / m; |
|
885 int v = -1, i = 0; |
|
886 |
|
887 for (int k = 0; k < m; k++) { |
|
888 v = -1; |
|
889 for (int p = 0; p < period; p++) { |
|
890 a[i++] = v--; |
|
891 } |
|
892 } |
|
893 for (int j = i; j < a.length - 1; j++) { |
|
894 a[j] = v--; |
|
895 } |
|
896 a[a.length - 1] = 0; |
|
897 } |
|
898 }; |
|
899 |
|
900 abstract void build(int[] a, int m); |
|
901 |
|
902 @Override public String toString() { |
|
903 String name = name(); |
|
904 |
|
905 for (int i = name.length(); i < 12; i++) { |
|
906 name += " "; |
|
907 } |
|
908 return name; |
|
909 } |
|
910 } |
|
911 |
|
912 private static enum UnsortedBuilder { |
|
913 RANDOM { |
|
914 void build(int[] a, int m, Random random) { |
|
915 for (int i = 0; i < a.length; i++) { |
|
916 a[i] = random.nextInt(); |
|
917 } |
|
918 } |
|
919 }, |
|
920 ASCENDING { |
|
921 void build(int[] a, int m, Random random) { |
|
922 for (int i = 0; i < a.length; i++) { |
|
923 a[i] = m + i; |
|
924 } |
|
925 } |
|
926 }, |
|
927 DESCENDING { |
|
928 void build(int[] a, int m, Random random) { |
|
929 for (int i = 0; i < a.length; i++) { |
|
930 a[i] = a.length - m - i; |
|
931 } |
|
932 } |
|
933 }, |
|
934 ALL_EQUAL { |
|
935 void build(int[] a, int m, Random random) { |
|
936 for (int i = 0; i < a.length; i++) { |
|
937 a[i] = m; |
|
938 } |
|
939 } |
|
940 }, |
|
941 SAW { |
|
942 void build(int[] a, int m, Random random) { |
|
943 int incCount = 1; |
|
944 int decCount = a.length; |
|
945 int i = 0; |
|
946 int period = m--; |
|
947 |
|
948 while (true) { |
|
949 for (int k = 1; k <= period; k++) { |
|
950 if (i >= a.length) { |
|
951 return; |
|
952 } |
|
953 a[i++] = incCount++; |
|
954 } |
|
955 period += m; |
|
956 |
|
957 for (int k = 1; k <= period; k++) { |
|
958 if (i >= a.length) { |
|
959 return; |
|
960 } |
|
961 a[i++] = decCount--; |
|
962 } |
|
963 period += m; |
|
964 } |
|
965 } |
|
966 }, |
|
967 REPEATED { |
|
968 void build(int[] a, int m, Random random) { |
|
969 for (int i = 0; i < a.length; i++) { |
|
970 a[i] = i % m; |
|
971 } |
|
972 } |
|
973 }, |
|
974 DUPLICATED { |
|
975 void build(int[] a, int m, Random random) { |
|
976 for (int i = 0; i < a.length; i++) { |
|
977 a[i] = random.nextInt(m); |
|
978 } |
|
979 } |
|
980 }, |
|
981 ORGAN_PIPES { |
|
982 void build(int[] a, int m, Random random) { |
|
983 int middle = a.length / (m + 1); |
|
984 |
|
985 for (int i = 0; i < middle; i++) { |
|
986 a[i] = i; |
|
987 } |
|
988 for (int i = middle; i < a.length; i++) { |
|
989 a[i] = a.length - i - 1; |
|
990 } |
|
991 } |
|
992 }, |
|
993 STAGGER { |
|
994 void build(int[] a, int m, Random random) { |
|
995 for (int i = 0; i < a.length; i++) { |
|
996 a[i] = (i * m + i) % a.length; |
|
997 } |
|
998 } |
|
999 }, |
|
1000 PLATEAU { |
|
1001 void build(int[] a, int m, Random random) { |
|
1002 for (int i = 0; i < a.length; i++) { |
|
1003 a[i] = Math.min(i, m); |
|
1004 } |
|
1005 } |
|
1006 }, |
|
1007 SHUFFLE { |
|
1008 void build(int[] a, int m, Random random) { |
|
1009 int x = 0, y = 0; |
|
1010 for (int i = 0; i < a.length; i++) { |
|
1011 a[i] = random.nextBoolean() ? (x += 2) : (y += 2); |
|
1012 } |
|
1013 } |
|
1014 }; |
|
1015 |
|
1016 abstract void build(int[] a, int m, Random random); |
|
1017 |
|
1018 @Override public String toString() { |
|
1019 String name = name(); |
|
1020 |
|
1021 for (int i = name.length(); i < 12; i++) { |
|
1022 name += " "; |
|
1023 } |
|
1024 return name; |
|
1025 } |
|
1026 } |
|
1027 |
|
1028 private static void checkWithCheckSum(Object test, Object golden) { |
|
1029 checkSorted(test); |
|
1030 checkCheckSum(test, golden); |
|
1031 } |
|
1032 |
|
1033 private static void failed(String message) { |
|
1034 err.format("\n*** TEST FAILED - %s.\n\n%s.\n\n", ourDescription, message); |
|
1035 throw new RuntimeException("Test failed - see log file for details"); |
|
1036 } |
|
1037 |
|
1038 private static void failedSort(int index, String value1, String value2) { |
|
1039 failed("Array is not sorted at " + index + "-th position: " + |
|
1040 value1 + " and " + value2); |
|
1041 } |
|
1042 |
|
1043 private static void failedCompare(int index, String value1, String value2) { |
|
1044 failed("On position " + index + " must be " + value2 + " instead of " + value1); |
|
1045 } |
|
1046 |
|
1047 private static void compare(Object test, Object golden) { |
|
1048 if (test instanceof int[]) { |
|
1049 compare((int[]) test, (int[]) golden); |
|
1050 } else if (test instanceof long[]) { |
|
1051 compare((long[]) test, (long[]) golden); |
|
1052 } else if (test instanceof short[]) { |
|
1053 compare((short[]) test, (short[]) golden); |
|
1054 } else if (test instanceof byte[]) { |
|
1055 compare((byte[]) test, (byte[]) golden); |
|
1056 } else if (test instanceof char[]) { |
|
1057 compare((char[]) test, (char[]) golden); |
|
1058 } else if (test instanceof float[]) { |
|
1059 compare((float[]) test, (float[]) golden); |
|
1060 } else if (test instanceof double[]) { |
|
1061 compare((double[]) test, (double[]) golden); |
|
1062 } else if (test instanceof Integer[]) { |
|
1063 compare((Integer[]) test, (Integer[]) golden); |
|
1064 } else { |
|
1065 failed("Unknow type of array: " + test + " of class " + |
|
1066 test.getClass().getName()); |
|
1067 } |
|
1068 } |
|
1069 |
|
1070 private static void compare(int[] a, int[] b) { |
|
1071 for (int i = 0; i < a.length; i++) { |
|
1072 if (a[i] != b[i]) { |
|
1073 failedCompare(i, "" + a[i], "" + b[i]); |
|
1074 } |
|
1075 } |
|
1076 } |
|
1077 |
|
1078 private static void compare(long[] a, long[] b) { |
|
1079 for (int i = 0; i < a.length; i++) { |
|
1080 if (a[i] != b[i]) { |
|
1081 failedCompare(i, "" + a[i], "" + b[i]); |
|
1082 } |
|
1083 } |
|
1084 } |
|
1085 |
|
1086 private static void compare(short[] a, short[] b) { |
|
1087 for (int i = 0; i < a.length; i++) { |
|
1088 if (a[i] != b[i]) { |
|
1089 failedCompare(i, "" + a[i], "" + b[i]); |
|
1090 } |
|
1091 } |
|
1092 } |
|
1093 |
|
1094 private static void compare(byte[] a, byte[] b) { |
|
1095 for (int i = 0; i < a.length; i++) { |
|
1096 if (a[i] != b[i]) { |
|
1097 failedCompare(i, "" + a[i], "" + b[i]); |
|
1098 } |
|
1099 } |
|
1100 } |
|
1101 |
|
1102 private static void compare(char[] a, char[] b) { |
|
1103 for (int i = 0; i < a.length; i++) { |
|
1104 if (a[i] != b[i]) { |
|
1105 failedCompare(i, "" + a[i], "" + b[i]); |
|
1106 } |
|
1107 } |
|
1108 } |
|
1109 |
|
1110 private static void compare(float[] a, float[] b) { |
|
1111 for (int i = 0; i < a.length; i++) { |
|
1112 if (a[i] != b[i]) { |
|
1113 failedCompare(i, "" + a[i], "" + b[i]); |
|
1114 } |
|
1115 } |
|
1116 } |
|
1117 |
|
1118 private static void compare(double[] a, double[] b) { |
|
1119 for (int i = 0; i < a.length; i++) { |
|
1120 if (a[i] != b[i]) { |
|
1121 failedCompare(i, "" + a[i], "" + b[i]); |
|
1122 } |
|
1123 } |
|
1124 } |
|
1125 |
|
1126 private static void compare(Integer[] a, Integer[] b) { |
|
1127 for (int i = 0; i < a.length; i++) { |
|
1128 if (a[i].compareTo(b[i]) != 0) { |
|
1129 failedCompare(i, "" + a[i], "" + b[i]); |
|
1130 } |
|
1131 } |
|
1132 } |
|
1133 |
|
1134 private static void checkSorted(Object object) { |
|
1135 if (object instanceof int[]) { |
|
1136 checkSorted((int[]) object); |
|
1137 } else if (object instanceof long[]) { |
|
1138 checkSorted((long[]) object); |
|
1139 } else if (object instanceof short[]) { |
|
1140 checkSorted((short[]) object); |
|
1141 } else if (object instanceof byte[]) { |
|
1142 checkSorted((byte[]) object); |
|
1143 } else if (object instanceof char[]) { |
|
1144 checkSorted((char[]) object); |
|
1145 } else if (object instanceof float[]) { |
|
1146 checkSorted((float[]) object); |
|
1147 } else if (object instanceof double[]) { |
|
1148 checkSorted((double[]) object); |
|
1149 } else if (object instanceof Integer[]) { |
|
1150 checkSorted((Integer[]) object); |
|
1151 } else { |
|
1152 failed("Unknow type of array: " + object + " of class " + |
|
1153 object.getClass().getName()); |
|
1154 } |
|
1155 } |
|
1156 |
|
1157 private static void checkSorted(int[] a) { |
|
1158 for (int i = 0; i < a.length - 1; i++) { |
|
1159 if (a[i] > a[i + 1]) { |
|
1160 failedSort(i, "" + a[i], "" + a[i + 1]); |
|
1161 } |
|
1162 } |
|
1163 } |
|
1164 |
|
1165 private static void checkSorted(long[] a) { |
|
1166 for (int i = 0; i < a.length - 1; i++) { |
|
1167 if (a[i] > a[i + 1]) { |
|
1168 failedSort(i, "" + a[i], "" + a[i + 1]); |
|
1169 } |
|
1170 } |
|
1171 } |
|
1172 |
|
1173 private static void checkSorted(short[] a) { |
|
1174 for (int i = 0; i < a.length - 1; i++) { |
|
1175 if (a[i] > a[i + 1]) { |
|
1176 failedSort(i, "" + a[i], "" + a[i + 1]); |
|
1177 } |
|
1178 } |
|
1179 } |
|
1180 |
|
1181 private static void checkSorted(byte[] a) { |
|
1182 for (int i = 0; i < a.length - 1; i++) { |
|
1183 if (a[i] > a[i + 1]) { |
|
1184 failedSort(i, "" + a[i], "" + a[i + 1]); |
|
1185 } |
|
1186 } |
|
1187 } |
|
1188 |
|
1189 private static void checkSorted(char[] a) { |
|
1190 for (int i = 0; i < a.length - 1; i++) { |
|
1191 if (a[i] > a[i + 1]) { |
|
1192 failedSort(i, "" + a[i], "" + a[i + 1]); |
|
1193 } |
|
1194 } |
|
1195 } |
|
1196 |
|
1197 private static void checkSorted(float[] a) { |
|
1198 for (int i = 0; i < a.length - 1; i++) { |
|
1199 if (a[i] > a[i + 1]) { |
|
1200 failedSort(i, "" + a[i], "" + a[i + 1]); |
|
1201 } |
|
1202 } |
|
1203 } |
|
1204 |
|
1205 private static void checkSorted(double[] a) { |
|
1206 for (int i = 0; i < a.length - 1; i++) { |
|
1207 if (a[i] > a[i + 1]) { |
|
1208 failedSort(i, "" + a[i], "" + a[i + 1]); |
|
1209 } |
|
1210 } |
|
1211 } |
|
1212 |
|
1213 private static void checkSorted(Integer[] a) { |
|
1214 for (int i = 0; i < a.length - 1; i++) { |
|
1215 if (a[i].intValue() > a[i + 1].intValue()) { |
|
1216 failedSort(i, "" + a[i], "" + a[i + 1]); |
|
1217 } |
|
1218 } |
|
1219 } |
|
1220 |
|
1221 private static void checkCheckSum(Object test, Object golden) { |
|
1222 if (checkSumXor(test) != checkSumXor(golden)) { |
|
1223 failed("Original and sorted arrays are not identical [xor]"); |
|
1224 } |
|
1225 if (checkSumPlus(test) != checkSumPlus(golden)) { |
|
1226 failed("Original and sorted arrays are not identical [plus]"); |
|
1227 } |
|
1228 } |
|
1229 |
|
1230 private static int checkSumXor(Object object) { |
|
1231 if (object instanceof int[]) { |
|
1232 return checkSumXor((int[]) object); |
|
1233 } else if (object instanceof long[]) { |
|
1234 return checkSumXor((long[]) object); |
|
1235 } else if (object instanceof short[]) { |
|
1236 return checkSumXor((short[]) object); |
|
1237 } else if (object instanceof byte[]) { |
|
1238 return checkSumXor((byte[]) object); |
|
1239 } else if (object instanceof char[]) { |
|
1240 return checkSumXor((char[]) object); |
|
1241 } else if (object instanceof float[]) { |
|
1242 return checkSumXor((float[]) object); |
|
1243 } else if (object instanceof double[]) { |
|
1244 return checkSumXor((double[]) object); |
|
1245 } else if (object instanceof Integer[]) { |
|
1246 return checkSumXor((Integer[]) object); |
|
1247 } else { |
|
1248 failed("Unknow type of array: " + object + " of class " + |
|
1249 object.getClass().getName()); |
|
1250 return -1; |
|
1251 } |
|
1252 } |
|
1253 |
|
1254 private static int checkSumXor(Integer[] a) { |
|
1255 int checkSum = 0; |
|
1256 |
|
1257 for (Integer e : a) { |
|
1258 checkSum ^= e.intValue(); |
|
1259 } |
|
1260 return checkSum; |
|
1261 } |
|
1262 |
|
1263 private static int checkSumXor(int[] a) { |
|
1264 int checkSum = 0; |
|
1265 |
|
1266 for (int e : a) { |
|
1267 checkSum ^= e; |
|
1268 } |
|
1269 return checkSum; |
|
1270 } |
|
1271 |
|
1272 private static int checkSumXor(long[] a) { |
|
1273 long checkSum = 0; |
|
1274 |
|
1275 for (long e : a) { |
|
1276 checkSum ^= e; |
|
1277 } |
|
1278 return (int) checkSum; |
|
1279 } |
|
1280 |
|
1281 private static int checkSumXor(short[] a) { |
|
1282 short checkSum = 0; |
|
1283 |
|
1284 for (short e : a) { |
|
1285 checkSum ^= e; |
|
1286 } |
|
1287 return (int) checkSum; |
|
1288 } |
|
1289 |
|
1290 private static int checkSumXor(byte[] a) { |
|
1291 byte checkSum = 0; |
|
1292 |
|
1293 for (byte e : a) { |
|
1294 checkSum ^= e; |
|
1295 } |
|
1296 return (int) checkSum; |
|
1297 } |
|
1298 |
|
1299 private static int checkSumXor(char[] a) { |
|
1300 char checkSum = 0; |
|
1301 |
|
1302 for (char e : a) { |
|
1303 checkSum ^= e; |
|
1304 } |
|
1305 return (int) checkSum; |
|
1306 } |
|
1307 |
|
1308 private static int checkSumXor(float[] a) { |
|
1309 int checkSum = 0; |
|
1310 |
|
1311 for (float e : a) { |
|
1312 checkSum ^= (int) e; |
|
1313 } |
|
1314 return checkSum; |
|
1315 } |
|
1316 |
|
1317 private static int checkSumXor(double[] a) { |
|
1318 int checkSum = 0; |
|
1319 |
|
1320 for (double e : a) { |
|
1321 checkSum ^= (int) e; |
|
1322 } |
|
1323 return checkSum; |
|
1324 } |
|
1325 |
|
1326 private static int checkSumPlus(Object object) { |
|
1327 if (object instanceof int[]) { |
|
1328 return checkSumPlus((int[]) object); |
|
1329 } else if (object instanceof long[]) { |
|
1330 return checkSumPlus((long[]) object); |
|
1331 } else if (object instanceof short[]) { |
|
1332 return checkSumPlus((short[]) object); |
|
1333 } else if (object instanceof byte[]) { |
|
1334 return checkSumPlus((byte[]) object); |
|
1335 } else if (object instanceof char[]) { |
|
1336 return checkSumPlus((char[]) object); |
|
1337 } else if (object instanceof float[]) { |
|
1338 return checkSumPlus((float[]) object); |
|
1339 } else if (object instanceof double[]) { |
|
1340 return checkSumPlus((double[]) object); |
|
1341 } else if (object instanceof Integer[]) { |
|
1342 return checkSumPlus((Integer[]) object); |
|
1343 } else { |
|
1344 failed("Unknow type of array: " + object + " of class " + |
|
1345 object.getClass().getName()); |
|
1346 return -1; |
|
1347 } |
|
1348 } |
|
1349 |
|
1350 private static int checkSumPlus(int[] a) { |
|
1351 int checkSum = 0; |
|
1352 |
|
1353 for (int e : a) { |
|
1354 checkSum += e; |
|
1355 } |
|
1356 return checkSum; |
|
1357 } |
|
1358 |
|
1359 private static int checkSumPlus(long[] a) { |
|
1360 long checkSum = 0; |
|
1361 |
|
1362 for (long e : a) { |
|
1363 checkSum += e; |
|
1364 } |
|
1365 return (int) checkSum; |
|
1366 } |
|
1367 |
|
1368 private static int checkSumPlus(short[] a) { |
|
1369 short checkSum = 0; |
|
1370 |
|
1371 for (short e : a) { |
|
1372 checkSum += e; |
|
1373 } |
|
1374 return (int) checkSum; |
|
1375 } |
|
1376 |
|
1377 private static int checkSumPlus(byte[] a) { |
|
1378 byte checkSum = 0; |
|
1379 |
|
1380 for (byte e : a) { |
|
1381 checkSum += e; |
|
1382 } |
|
1383 return (int) checkSum; |
|
1384 } |
|
1385 |
|
1386 private static int checkSumPlus(char[] a) { |
|
1387 char checkSum = 0; |
|
1388 |
|
1389 for (char e : a) { |
|
1390 checkSum += e; |
|
1391 } |
|
1392 return (int) checkSum; |
|
1393 } |
|
1394 |
|
1395 private static int checkSumPlus(float[] a) { |
|
1396 int checkSum = 0; |
|
1397 |
|
1398 for (float e : a) { |
|
1399 checkSum += (int) e; |
|
1400 } |
|
1401 return checkSum; |
|
1402 } |
|
1403 |
|
1404 private static int checkSumPlus(double[] a) { |
|
1405 int checkSum = 0; |
|
1406 |
|
1407 for (double e : a) { |
|
1408 checkSum += (int) e; |
|
1409 } |
|
1410 return checkSum; |
|
1411 } |
|
1412 |
|
1413 private static int checkSumPlus(Integer[] a) { |
|
1414 int checkSum = 0; |
|
1415 |
|
1416 for (Integer e : a) { |
|
1417 checkSum += e.intValue(); |
|
1418 } |
|
1419 return checkSum; |
|
1420 } |
|
1421 |
|
1422 private static void sortByInsertionSort(Object object) { |
|
1423 if (object instanceof int[]) { |
|
1424 sortByInsertionSort((int[]) object); |
|
1425 } else if (object instanceof long[]) { |
|
1426 sortByInsertionSort((long[]) object); |
|
1427 } else if (object instanceof short[]) { |
|
1428 sortByInsertionSort((short[]) object); |
|
1429 } else if (object instanceof byte[]) { |
|
1430 sortByInsertionSort((byte[]) object); |
|
1431 } else if (object instanceof char[]) { |
|
1432 sortByInsertionSort((char[]) object); |
|
1433 } else if (object instanceof float[]) { |
|
1434 sortByInsertionSort((float[]) object); |
|
1435 } else if (object instanceof double[]) { |
|
1436 sortByInsertionSort((double[]) object); |
|
1437 } else if (object instanceof Integer[]) { |
|
1438 sortByInsertionSort((Integer[]) object); |
|
1439 } else { |
|
1440 failed("Unknow type of array: " + object + " of class " + |
|
1441 object.getClass().getName()); |
|
1442 } |
|
1443 } |
|
1444 |
|
1445 private static void sortByInsertionSort(int[] a) { |
|
1446 for (int j, i = 1; i < a.length; i++) { |
|
1447 int ai = a[i]; |
|
1448 for (j = i - 1; j >= 0 && ai < a[j]; j--) { |
|
1449 a[j + 1] = a[j]; |
|
1450 } |
|
1451 a[j + 1] = ai; |
|
1452 } |
|
1453 } |
|
1454 |
|
1455 private static void sortByInsertionSort(long[] a) { |
|
1456 for (int j, i = 1; i < a.length; i++) { |
|
1457 long ai = a[i]; |
|
1458 for (j = i - 1; j >= 0 && ai < a[j]; j--) { |
|
1459 a[j + 1] = a[j]; |
|
1460 } |
|
1461 a[j + 1] = ai; |
|
1462 } |
|
1463 } |
|
1464 |
|
1465 private static void sortByInsertionSort(short[] a) { |
|
1466 for (int j, i = 1; i < a.length; i++) { |
|
1467 short ai = a[i]; |
|
1468 for (j = i - 1; j >= 0 && ai < a[j]; j--) { |
|
1469 a[j + 1] = a[j]; |
|
1470 } |
|
1471 a[j + 1] = ai; |
|
1472 } |
|
1473 } |
|
1474 |
|
1475 private static void sortByInsertionSort(byte[] a) { |
|
1476 for (int j, i = 1; i < a.length; i++) { |
|
1477 byte ai = a[i]; |
|
1478 for (j = i - 1; j >= 0 && ai < a[j]; j--) { |
|
1479 a[j + 1] = a[j]; |
|
1480 } |
|
1481 a[j + 1] = ai; |
|
1482 } |
|
1483 } |
|
1484 |
|
1485 private static void sortByInsertionSort(char[] a) { |
|
1486 for (int j, i = 1; i < a.length; i++) { |
|
1487 char ai = a[i]; |
|
1488 for (j = i - 1; j >= 0 && ai < a[j]; j--) { |
|
1489 a[j + 1] = a[j]; |
|
1490 } |
|
1491 a[j + 1] = ai; |
|
1492 } |
|
1493 } |
|
1494 |
|
1495 private static void sortByInsertionSort(float[] a) { |
|
1496 for (int j, i = 1; i < a.length; i++) { |
|
1497 float ai = a[i]; |
|
1498 for (j = i - 1; j >= 0 && ai < a[j]; j--) { |
|
1499 a[j + 1] = a[j]; |
|
1500 } |
|
1501 a[j + 1] = ai; |
|
1502 } |
|
1503 } |
|
1504 |
|
1505 private static void sortByInsertionSort(double[] a) { |
|
1506 for (int j, i = 1; i < a.length; i++) { |
|
1507 double ai = a[i]; |
|
1508 for (j = i - 1; j >= 0 && ai < a[j]; j--) { |
|
1509 a[j + 1] = a[j]; |
|
1510 } |
|
1511 a[j + 1] = ai; |
|
1512 } |
|
1513 } |
|
1514 |
|
1515 private static void sortByInsertionSort(Integer[] a) { |
|
1516 for (int j, i = 1; i < a.length; i++) { |
|
1517 Integer ai = a[i]; |
|
1518 for (j = i - 1; j >= 0 && ai < a[j]; j--) { |
|
1519 a[j + 1] = a[j]; |
|
1520 } |
|
1521 a[j + 1] = ai; |
|
1522 } |
|
1523 } |
|
1524 |
|
1525 private static void sort(Object object) { |
|
1526 if (object instanceof int[]) { |
|
1527 Arrays.parallelSort((int[]) object); |
|
1528 } else if (object instanceof long[]) { |
|
1529 Arrays.parallelSort((long[]) object); |
|
1530 } else if (object instanceof short[]) { |
|
1531 Arrays.parallelSort((short[]) object); |
|
1532 } else if (object instanceof byte[]) { |
|
1533 Arrays.parallelSort((byte[]) object); |
|
1534 } else if (object instanceof char[]) { |
|
1535 Arrays.parallelSort((char[]) object); |
|
1536 } else if (object instanceof float[]) { |
|
1537 Arrays.parallelSort((float[]) object); |
|
1538 } else if (object instanceof double[]) { |
|
1539 Arrays.parallelSort((double[]) object); |
|
1540 } else if (object instanceof Integer[]) { |
|
1541 Arrays.parallelSort((Integer[]) object); |
|
1542 } else { |
|
1543 failed("Unknow type of array: " + object + " of class " + |
|
1544 object.getClass().getName()); |
|
1545 } |
|
1546 } |
|
1547 |
|
1548 private static void sortSubArray(Object object, int fromIndex, int toIndex) { |
|
1549 if (object instanceof int[]) { |
|
1550 Arrays.parallelSort((int[]) object, fromIndex, toIndex); |
|
1551 } else if (object instanceof long[]) { |
|
1552 Arrays.parallelSort((long[]) object, fromIndex, toIndex); |
|
1553 } else if (object instanceof short[]) { |
|
1554 Arrays.parallelSort((short[]) object, fromIndex, toIndex); |
|
1555 } else if (object instanceof byte[]) { |
|
1556 Arrays.parallelSort((byte[]) object, fromIndex, toIndex); |
|
1557 } else if (object instanceof char[]) { |
|
1558 Arrays.parallelSort((char[]) object, fromIndex, toIndex); |
|
1559 } else if (object instanceof float[]) { |
|
1560 Arrays.parallelSort((float[]) object, fromIndex, toIndex); |
|
1561 } else if (object instanceof double[]) { |
|
1562 Arrays.parallelSort((double[]) object, fromIndex, toIndex); |
|
1563 } else if (object instanceof Integer[]) { |
|
1564 Arrays.parallelSort((Integer[]) object, fromIndex, toIndex); |
|
1565 } else { |
|
1566 failed("Unknow type of array: " + object + " of class " + |
|
1567 object.getClass().getName()); |
|
1568 } |
|
1569 } |
|
1570 |
|
1571 private static void checkSubArray(Object object, int fromIndex, int toIndex, int m) { |
|
1572 if (object instanceof int[]) { |
|
1573 checkSubArray((int[]) object, fromIndex, toIndex, m); |
|
1574 } else if (object instanceof long[]) { |
|
1575 checkSubArray((long[]) object, fromIndex, toIndex, m); |
|
1576 } else if (object instanceof short[]) { |
|
1577 checkSubArray((short[]) object, fromIndex, toIndex, m); |
|
1578 } else if (object instanceof byte[]) { |
|
1579 checkSubArray((byte[]) object, fromIndex, toIndex, m); |
|
1580 } else if (object instanceof char[]) { |
|
1581 checkSubArray((char[]) object, fromIndex, toIndex, m); |
|
1582 } else if (object instanceof float[]) { |
|
1583 checkSubArray((float[]) object, fromIndex, toIndex, m); |
|
1584 } else if (object instanceof double[]) { |
|
1585 checkSubArray((double[]) object, fromIndex, toIndex, m); |
|
1586 } else if (object instanceof Integer[]) { |
|
1587 checkSubArray((Integer[]) object, fromIndex, toIndex, m); |
|
1588 } else { |
|
1589 failed("Unknow type of array: " + object + " of class " + |
|
1590 object.getClass().getName()); |
|
1591 } |
|
1592 } |
|
1593 |
|
1594 private static void checkSubArray(Integer[] a, int fromIndex, int toIndex, int m) { |
|
1595 for (int i = 0; i < fromIndex; i++) { |
|
1596 if (a[i].intValue() != 0xDEDA) { |
|
1597 failed("Range sort changes left element on position " + i + |
|
1598 ": " + a[i] + ", must be " + 0xDEDA); |
|
1599 } |
|
1600 } |
|
1601 |
|
1602 for (int i = fromIndex; i < toIndex - 1; i++) { |
|
1603 if (a[i].intValue() > a[i + 1].intValue()) { |
|
1604 failedSort(i, "" + a[i], "" + a[i + 1]); |
|
1605 } |
|
1606 } |
|
1607 |
|
1608 for (int i = toIndex; i < a.length; i++) { |
|
1609 if (a[i].intValue() != 0xBABA) { |
|
1610 failed("Range sort changes right element on position " + i + |
|
1611 ": " + a[i] + ", must be " + 0xBABA); |
|
1612 } |
|
1613 } |
|
1614 } |
|
1615 |
|
1616 private static void checkSubArray(int[] a, int fromIndex, int toIndex, int m) { |
|
1617 for (int i = 0; i < fromIndex; i++) { |
|
1618 if (a[i] != 0xDEDA) { |
|
1619 failed("Range sort changes left element on position " + i + |
|
1620 ": " + a[i] + ", must be " + 0xDEDA); |
|
1621 } |
|
1622 } |
|
1623 |
|
1624 for (int i = fromIndex; i < toIndex - 1; i++) { |
|
1625 if (a[i] > a[i + 1]) { |
|
1626 failedSort(i, "" + a[i], "" + a[i + 1]); |
|
1627 } |
|
1628 } |
|
1629 |
|
1630 for (int i = toIndex; i < a.length; i++) { |
|
1631 if (a[i] != 0xBABA) { |
|
1632 failed("Range sort changes right element on position " + i + |
|
1633 ": " + a[i] + ", must be " + 0xBABA); |
|
1634 } |
|
1635 } |
|
1636 } |
|
1637 |
|
1638 private static void checkSubArray(byte[] a, int fromIndex, int toIndex, int m) { |
|
1639 for (int i = 0; i < fromIndex; i++) { |
|
1640 if (a[i] != (byte) 0xDEDA) { |
|
1641 failed("Range sort changes left element on position " + i + |
|
1642 ": " + a[i] + ", must be " + 0xDEDA); |
|
1643 } |
|
1644 } |
|
1645 |
|
1646 for (int i = fromIndex; i < toIndex - 1; i++) { |
|
1647 if (a[i] > a[i + 1]) { |
|
1648 failedSort(i, "" + a[i], "" + a[i + 1]); |
|
1649 } |
|
1650 } |
|
1651 |
|
1652 for (int i = toIndex; i < a.length; i++) { |
|
1653 if (a[i] != (byte) 0xBABA) { |
|
1654 failed("Range sort changes right element on position " + i + |
|
1655 ": " + a[i] + ", must be " + 0xBABA); |
|
1656 } |
|
1657 } |
|
1658 } |
|
1659 |
|
1660 private static void checkSubArray(long[] a, int fromIndex, int toIndex, int m) { |
|
1661 for (int i = 0; i < fromIndex; i++) { |
|
1662 if (a[i] != (long) 0xDEDA) { |
|
1663 failed("Range sort changes left element on position " + i + |
|
1664 ": " + a[i] + ", must be " + 0xDEDA); |
|
1665 } |
|
1666 } |
|
1667 |
|
1668 for (int i = fromIndex; i < toIndex - 1; i++) { |
|
1669 if (a[i] > a[i + 1]) { |
|
1670 failedSort(i, "" + a[i], "" + a[i + 1]); |
|
1671 } |
|
1672 } |
|
1673 |
|
1674 for (int i = toIndex; i < a.length; i++) { |
|
1675 if (a[i] != (long) 0xBABA) { |
|
1676 failed("Range sort changes right element on position " + i + |
|
1677 ": " + a[i] + ", must be " + 0xBABA); |
|
1678 } |
|
1679 } |
|
1680 } |
|
1681 |
|
1682 private static void checkSubArray(char[] a, int fromIndex, int toIndex, int m) { |
|
1683 for (int i = 0; i < fromIndex; i++) { |
|
1684 if (a[i] != (char) 0xDEDA) { |
|
1685 failed("Range sort changes left element on position " + i + |
|
1686 ": " + a[i] + ", must be " + 0xDEDA); |
|
1687 } |
|
1688 } |
|
1689 |
|
1690 for (int i = fromIndex; i < toIndex - 1; i++) { |
|
1691 if (a[i] > a[i + 1]) { |
|
1692 failedSort(i, "" + a[i], "" + a[i + 1]); |
|
1693 } |
|
1694 } |
|
1695 |
|
1696 for (int i = toIndex; i < a.length; i++) { |
|
1697 if (a[i] != (char) 0xBABA) { |
|
1698 failed("Range sort changes right element on position " + i + |
|
1699 ": " + a[i] + ", must be " + 0xBABA); |
|
1700 } |
|
1701 } |
|
1702 } |
|
1703 |
|
1704 private static void checkSubArray(short[] a, int fromIndex, int toIndex, int m) { |
|
1705 for (int i = 0; i < fromIndex; i++) { |
|
1706 if (a[i] != (short) 0xDEDA) { |
|
1707 failed("Range sort changes left element on position " + i + |
|
1708 ": " + a[i] + ", must be " + 0xDEDA); |
|
1709 } |
|
1710 } |
|
1711 |
|
1712 for (int i = fromIndex; i < toIndex - 1; i++) { |
|
1713 if (a[i] > a[i + 1]) { |
|
1714 failedSort(i, "" + a[i], "" + a[i + 1]); |
|
1715 } |
|
1716 } |
|
1717 |
|
1718 for (int i = toIndex; i < a.length; i++) { |
|
1719 if (a[i] != (short) 0xBABA) { |
|
1720 failed("Range sort changes right element on position " + i + |
|
1721 ": " + a[i] + ", must be " + 0xBABA); |
|
1722 } |
|
1723 } |
|
1724 } |
|
1725 |
|
1726 private static void checkSubArray(float[] a, int fromIndex, int toIndex, int m) { |
|
1727 for (int i = 0; i < fromIndex; i++) { |
|
1728 if (a[i] != (float) 0xDEDA) { |
|
1729 failed("Range sort changes left element on position " + i + |
|
1730 ": " + a[i] + ", must be " + 0xDEDA); |
|
1731 } |
|
1732 } |
|
1733 |
|
1734 for (int i = fromIndex; i < toIndex - 1; i++) { |
|
1735 if (a[i] > a[i + 1]) { |
|
1736 failedSort(i, "" + a[i], "" + a[i + 1]); |
|
1737 } |
|
1738 } |
|
1739 |
|
1740 for (int i = toIndex; i < a.length; i++) { |
|
1741 if (a[i] != (float) 0xBABA) { |
|
1742 failed("Range sort changes right element on position " + i + |
|
1743 ": " + a[i] + ", must be " + 0xBABA); |
|
1744 } |
|
1745 } |
|
1746 } |
|
1747 |
|
1748 private static void checkSubArray(double[] a, int fromIndex, int toIndex, int m) { |
|
1749 for (int i = 0; i < fromIndex; i++) { |
|
1750 if (a[i] != (double) 0xDEDA) { |
|
1751 failed("Range sort changes left element on position " + i + |
|
1752 ": " + a[i] + ", must be " + 0xDEDA); |
|
1753 } |
|
1754 } |
|
1755 |
|
1756 for (int i = fromIndex; i < toIndex - 1; i++) { |
|
1757 if (a[i] > a[i + 1]) { |
|
1758 failedSort(i, "" + a[i], "" + a[i + 1]); |
|
1759 } |
|
1760 } |
|
1761 |
|
1762 for (int i = toIndex; i < a.length; i++) { |
|
1763 if (a[i] != (double) 0xBABA) { |
|
1764 failed("Range sort changes right element on position " + i + |
|
1765 ": " + a[i] + ", must be " + 0xBABA); |
|
1766 } |
|
1767 } |
|
1768 } |
|
1769 |
|
1770 private static void checkRange(Object object, int m) { |
|
1771 if (object instanceof int[]) { |
|
1772 checkRange((int[]) object, m); |
|
1773 } else if (object instanceof long[]) { |
|
1774 checkRange((long[]) object, m); |
|
1775 } else if (object instanceof short[]) { |
|
1776 checkRange((short[]) object, m); |
|
1777 } else if (object instanceof byte[]) { |
|
1778 checkRange((byte[]) object, m); |
|
1779 } else if (object instanceof char[]) { |
|
1780 checkRange((char[]) object, m); |
|
1781 } else if (object instanceof float[]) { |
|
1782 checkRange((float[]) object, m); |
|
1783 } else if (object instanceof double[]) { |
|
1784 checkRange((double[]) object, m); |
|
1785 } else if (object instanceof Integer[]) { |
|
1786 checkRange((Integer[]) object, m); |
|
1787 } else { |
|
1788 failed("Unknow type of array: " + object + " of class " + |
|
1789 object.getClass().getName()); |
|
1790 } |
|
1791 } |
|
1792 |
|
1793 private static void checkRange(Integer[] a, int m) { |
|
1794 try { |
|
1795 Arrays.parallelSort(a, m + 1, m); |
|
1796 |
|
1797 failed("ParallelSort does not throw IllegalArgumentException " + |
|
1798 " as expected: fromIndex = " + (m + 1) + |
|
1799 " toIndex = " + m); |
|
1800 } |
|
1801 catch (IllegalArgumentException iae) { |
|
1802 try { |
|
1803 Arrays.parallelSort(a, -m, a.length); |
|
1804 |
|
1805 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " + |
|
1806 " as expected: fromIndex = " + (-m)); |
|
1807 } |
|
1808 catch (ArrayIndexOutOfBoundsException aoe) { |
|
1809 try { |
|
1810 Arrays.parallelSort(a, 0, a.length + m); |
|
1811 |
|
1812 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " + |
|
1813 " as expected: toIndex = " + (a.length + m)); |
|
1814 } |
|
1815 catch (ArrayIndexOutOfBoundsException aie) { |
|
1816 return; |
|
1817 } |
|
1818 } |
|
1819 } |
|
1820 } |
|
1821 |
|
1822 private static void checkRange(int[] a, int m) { |
|
1823 try { |
|
1824 Arrays.parallelSort(a, m + 1, m); |
|
1825 |
|
1826 failed("ParallelSort does not throw IllegalArgumentException " + |
|
1827 " as expected: fromIndex = " + (m + 1) + |
|
1828 " toIndex = " + m); |
|
1829 } |
|
1830 catch (IllegalArgumentException iae) { |
|
1831 try { |
|
1832 Arrays.parallelSort(a, -m, a.length); |
|
1833 |
|
1834 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " + |
|
1835 " as expected: fromIndex = " + (-m)); |
|
1836 } |
|
1837 catch (ArrayIndexOutOfBoundsException aoe) { |
|
1838 try { |
|
1839 Arrays.parallelSort(a, 0, a.length + m); |
|
1840 |
|
1841 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " + |
|
1842 " as expected: toIndex = " + (a.length + m)); |
|
1843 } |
|
1844 catch (ArrayIndexOutOfBoundsException aie) { |
|
1845 return; |
|
1846 } |
|
1847 } |
|
1848 } |
|
1849 } |
|
1850 |
|
1851 private static void checkRange(long[] a, int m) { |
|
1852 try { |
|
1853 Arrays.parallelSort(a, m + 1, m); |
|
1854 |
|
1855 failed("ParallelSort does not throw IllegalArgumentException " + |
|
1856 " as expected: fromIndex = " + (m + 1) + |
|
1857 " toIndex = " + m); |
|
1858 } |
|
1859 catch (IllegalArgumentException iae) { |
|
1860 try { |
|
1861 Arrays.parallelSort(a, -m, a.length); |
|
1862 |
|
1863 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " + |
|
1864 " as expected: fromIndex = " + (-m)); |
|
1865 } |
|
1866 catch (ArrayIndexOutOfBoundsException aoe) { |
|
1867 try { |
|
1868 Arrays.parallelSort(a, 0, a.length + m); |
|
1869 |
|
1870 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " + |
|
1871 " as expected: toIndex = " + (a.length + m)); |
|
1872 } |
|
1873 catch (ArrayIndexOutOfBoundsException aie) { |
|
1874 return; |
|
1875 } |
|
1876 } |
|
1877 } |
|
1878 } |
|
1879 |
|
1880 private static void checkRange(byte[] a, int m) { |
|
1881 try { |
|
1882 Arrays.parallelSort(a, m + 1, m); |
|
1883 |
|
1884 failed("ParallelSort does not throw IllegalArgumentException " + |
|
1885 " as expected: fromIndex = " + (m + 1) + |
|
1886 " toIndex = " + m); |
|
1887 } |
|
1888 catch (IllegalArgumentException iae) { |
|
1889 try { |
|
1890 Arrays.parallelSort(a, -m, a.length); |
|
1891 |
|
1892 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " + |
|
1893 " as expected: fromIndex = " + (-m)); |
|
1894 } |
|
1895 catch (ArrayIndexOutOfBoundsException aoe) { |
|
1896 try { |
|
1897 Arrays.parallelSort(a, 0, a.length + m); |
|
1898 |
|
1899 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " + |
|
1900 " as expected: toIndex = " + (a.length + m)); |
|
1901 } |
|
1902 catch (ArrayIndexOutOfBoundsException aie) { |
|
1903 return; |
|
1904 } |
|
1905 } |
|
1906 } |
|
1907 } |
|
1908 |
|
1909 private static void checkRange(short[] a, int m) { |
|
1910 try { |
|
1911 Arrays.parallelSort(a, m + 1, m); |
|
1912 |
|
1913 failed("ParallelSort does not throw IllegalArgumentException " + |
|
1914 " as expected: fromIndex = " + (m + 1) + |
|
1915 " toIndex = " + m); |
|
1916 } |
|
1917 catch (IllegalArgumentException iae) { |
|
1918 try { |
|
1919 Arrays.parallelSort(a, -m, a.length); |
|
1920 |
|
1921 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " + |
|
1922 " as expected: fromIndex = " + (-m)); |
|
1923 } |
|
1924 catch (ArrayIndexOutOfBoundsException aoe) { |
|
1925 try { |
|
1926 Arrays.parallelSort(a, 0, a.length + m); |
|
1927 |
|
1928 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " + |
|
1929 " as expected: toIndex = " + (a.length + m)); |
|
1930 } |
|
1931 catch (ArrayIndexOutOfBoundsException aie) { |
|
1932 return; |
|
1933 } |
|
1934 } |
|
1935 } |
|
1936 } |
|
1937 |
|
1938 private static void checkRange(char[] a, int m) { |
|
1939 try { |
|
1940 Arrays.parallelSort(a, m + 1, m); |
|
1941 |
|
1942 failed("ParallelSort does not throw IllegalArgumentException " + |
|
1943 " as expected: fromIndex = " + (m + 1) + |
|
1944 " toIndex = " + m); |
|
1945 } |
|
1946 catch (IllegalArgumentException iae) { |
|
1947 try { |
|
1948 Arrays.parallelSort(a, -m, a.length); |
|
1949 |
|
1950 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " + |
|
1951 " as expected: fromIndex = " + (-m)); |
|
1952 } |
|
1953 catch (ArrayIndexOutOfBoundsException aoe) { |
|
1954 try { |
|
1955 Arrays.parallelSort(a, 0, a.length + m); |
|
1956 |
|
1957 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " + |
|
1958 " as expected: toIndex = " + (a.length + m)); |
|
1959 } |
|
1960 catch (ArrayIndexOutOfBoundsException aie) { |
|
1961 return; |
|
1962 } |
|
1963 } |
|
1964 } |
|
1965 } |
|
1966 |
|
1967 private static void checkRange(float[] a, int m) { |
|
1968 try { |
|
1969 Arrays.parallelSort(a, m + 1, m); |
|
1970 |
|
1971 failed("ParallelSort does not throw IllegalArgumentException " + |
|
1972 " as expected: fromIndex = " + (m + 1) + |
|
1973 " toIndex = " + m); |
|
1974 } |
|
1975 catch (IllegalArgumentException iae) { |
|
1976 try { |
|
1977 Arrays.parallelSort(a, -m, a.length); |
|
1978 |
|
1979 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " + |
|
1980 " as expected: fromIndex = " + (-m)); |
|
1981 } |
|
1982 catch (ArrayIndexOutOfBoundsException aoe) { |
|
1983 try { |
|
1984 Arrays.parallelSort(a, 0, a.length + m); |
|
1985 |
|
1986 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " + |
|
1987 " as expected: toIndex = " + (a.length + m)); |
|
1988 } |
|
1989 catch (ArrayIndexOutOfBoundsException aie) { |
|
1990 return; |
|
1991 } |
|
1992 } |
|
1993 } |
|
1994 } |
|
1995 |
|
1996 private static void checkRange(double[] a, int m) { |
|
1997 try { |
|
1998 Arrays.parallelSort(a, m + 1, m); |
|
1999 |
|
2000 failed("ParallelSort does not throw IllegalArgumentException " + |
|
2001 " as expected: fromIndex = " + (m + 1) + |
|
2002 " toIndex = " + m); |
|
2003 } |
|
2004 catch (IllegalArgumentException iae) { |
|
2005 try { |
|
2006 Arrays.parallelSort(a, -m, a.length); |
|
2007 |
|
2008 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " + |
|
2009 " as expected: fromIndex = " + (-m)); |
|
2010 } |
|
2011 catch (ArrayIndexOutOfBoundsException aoe) { |
|
2012 try { |
|
2013 Arrays.parallelSort(a, 0, a.length + m); |
|
2014 |
|
2015 failed("ParallelSort does not throw ArrayIndexOutOfBoundsException " + |
|
2016 " as expected: toIndex = " + (a.length + m)); |
|
2017 } |
|
2018 catch (ArrayIndexOutOfBoundsException aie) { |
|
2019 return; |
|
2020 } |
|
2021 } |
|
2022 } |
|
2023 } |
|
2024 |
|
2025 private static void outArray(Object[] a) { |
|
2026 for (int i = 0; i < a.length; i++) { |
|
2027 out.print(a[i] + " "); |
|
2028 } |
|
2029 out.println(); |
|
2030 } |
|
2031 |
|
2032 private static void outArray(int[] a) { |
|
2033 for (int i = 0; i < a.length; i++) { |
|
2034 out.print(a[i] + " "); |
|
2035 } |
|
2036 out.println(); |
|
2037 } |
|
2038 |
|
2039 private static void outArray(float[] a) { |
|
2040 for (int i = 0; i < a.length; i++) { |
|
2041 out.print(a[i] + " "); |
|
2042 } |
|
2043 out.println(); |
|
2044 } |
|
2045 |
|
2046 private static void outArray(double[] a) { |
|
2047 for (int i = 0; i < a.length; i++) { |
|
2048 out.print(a[i] + " "); |
|
2049 } |
|
2050 out.println(); |
|
2051 } |
|
2052 |
|
2053 private static class MyRandom extends Random { |
|
2054 MyRandom(long seed) { |
|
2055 super(seed); |
|
2056 mySeed = seed; |
|
2057 } |
|
2058 |
|
2059 long getSeed() { |
|
2060 return mySeed; |
|
2061 } |
|
2062 |
|
2063 private long mySeed; |
|
2064 } |
|
2065 |
|
2066 private static String ourDescription; |
|
2067 } |
|