1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
const TAConstructors = [
Int8Array,
Uint8Array,
Int16Array,
Uint16Array,
Int32Array,
Uint32Array,
Uint8ClampedArray,
Float32Array,
Float64Array,
BigInt64Array,
BigUint64Array,
];
// Use different size classes to catch any implementation-specific
// optimisations.
const sizes = [
4, 8, 64, 128, 1024
];
function ToNumeric(TA) {
if (TA === BigInt64Array || TA === BigUint64Array) {
return BigInt;
}
return Number;
}
function ascending(a, b) {
return a < b ? -1 : a > b ? 1 : 0;
}
function descending(a, b) {
return -ascending(a, b);
}
for (let TA of TAConstructors) {
let toNumeric = ToNumeric(TA);
for (let size of sizes) {
let sorted = new TA(size);
// Fill with |1..size| and then sort to account for wrap-arounds.
for (let i = 0; i < size; ++i) {
sorted[i] = toNumeric(i + 1);
}
sorted.sort();
// Create a copy in descending order.
let ta = new TA(sorted);
ta.sort(descending);
// Sort the copy in ascending order and on the first call reset all
// elements to zero.
let called = false;
ta.sort(function(a, b) {
if (!called) {
called = true;
ta.fill(toNumeric(0));
}
return ascending(a, b);
});
// Ensure the comparator function was called.
assertEq(called, true);
// All elements should be sorted correctly. No elements should be zero.
for (let i = 0; i < size; ++i) {
assertEq(ta[i], sorted[i], `${TA.name} at index ${i} for size ${size}`);
}
}
}
if (typeof reportCompare === "function")
reportCompare(true, true);
|