Skip to content

Commit 6b774d4

Browse files
authored
fix: new sorting algorithm (#1904)
1 parent bf24bb9 commit 6b774d4

14 files changed

+40288
-20183
lines changed

std/assembly/array.ts

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -440,19 +440,7 @@ export class Array<T> {
440440
}
441441

442442
sort(comparator: (a: T, b: T) => i32 = COMPARATOR<T>()): this {
443-
var length = this.length_;
444-
if (length <= 1) return this;
445-
var base = this.dataStart;
446-
if (length == 2) {
447-
let a: T = load<T>(base, sizeof<T>()); // a = arr[1]
448-
let b: T = load<T>(base); // b = arr[0]
449-
if (comparator(a, b) < 0) {
450-
store<T>(base, b, sizeof<T>()); // arr[1] = b;
451-
store<T>(base, a); // arr[0] = a;
452-
}
453-
return this;
454-
}
455-
SORT<T>(base, length, comparator);
443+
SORT<T>(this.dataStart, this.length_, comparator);
456444
return this;
457445
}
458446

std/assembly/typedarray.ts

Lines changed: 24 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { COMPARATOR, SORT as SORT_IMPL } from "./util/sort";
1+
import { COMPARATOR, SORT } from "./util/sort";
22
import { E_INDEXOUTOFRANGE, E_INVALIDLENGTH, E_NOTIMPLEMENTED } from "./util/error";
33
import { joinIntegerArray, joinFloatArray } from "./util/string";
44
import { idof } from "./builtins";
@@ -65,7 +65,8 @@ export class Int8Array extends ArrayBufferView {
6565
}
6666

6767
sort(comparator: (a: i8, b: i8) => i32 = COMPARATOR<i8>()): Int8Array {
68-
return SORT<Int8Array, i8>(this, comparator);
68+
SORT<i8>(this.dataStart, this.length, comparator);
69+
return this;
6970
}
7071

7172
slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Int8Array {
@@ -200,7 +201,8 @@ export class Uint8Array extends ArrayBufferView {
200201
}
201202

202203
sort(comparator: (a: u8, b: u8) => i32 = COMPARATOR<u8>()): Uint8Array {
203-
return SORT<Uint8Array, u8>(this, comparator);
204+
SORT<u8>(this.dataStart, this.length, comparator);
205+
return this;
204206
}
205207

206208
slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Uint8Array {
@@ -334,8 +336,9 @@ export class Uint8ClampedArray extends ArrayBufferView {
334336
return FILL<Uint8ClampedArray, u8>(this, value, start, end);
335337
}
336338

337-
sort(fn: (a: u8, b: u8) => i32 = COMPARATOR<u8>()): Uint8ClampedArray {
338-
return SORT<Uint8ClampedArray, u8>(this, fn);
339+
sort(comparator: (a: u8, b: u8) => i32 = COMPARATOR<u8>()): Uint8ClampedArray {
340+
SORT<u8>(this.dataStart, this.length, comparator);
341+
return this;
339342
}
340343

341344
slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Uint8ClampedArray {
@@ -470,7 +473,8 @@ export class Int16Array extends ArrayBufferView {
470473
}
471474

472475
sort(comparator: (a: i16, b: i16) => i32 = COMPARATOR<i16>()): Int16Array {
473-
return SORT<Int16Array, i16>(this, comparator);
476+
SORT<i16>(this.dataStart, this.length, comparator);
477+
return this;
474478
}
475479

476480
slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Int16Array {
@@ -605,7 +609,8 @@ export class Uint16Array extends ArrayBufferView {
605609
}
606610

607611
sort(comparator: (a: u16, b: u16) => i32 = COMPARATOR<u16>()): Uint16Array {
608-
return SORT<Uint16Array, u16>(this, comparator);
612+
SORT<u16>(this.dataStart, this.length, comparator);
613+
return this;
609614
}
610615

611616
slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Uint16Array {
@@ -740,7 +745,8 @@ export class Int32Array extends ArrayBufferView {
740745
}
741746

742747
sort(comparator: (a: i32, b: i32) => i32 = COMPARATOR<i32>()): Int32Array {
743-
return SORT<Int32Array, i32>(this, comparator);
748+
SORT<i32>(this.dataStart, this.length, comparator);
749+
return this;
744750
}
745751

746752
slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Int32Array {
@@ -875,7 +881,8 @@ export class Uint32Array extends ArrayBufferView {
875881
}
876882

877883
sort(comparator: (a: u32, b: u32) => i32 = COMPARATOR<u32>()): Uint32Array {
878-
return SORT<Uint32Array, u32>(this, comparator);
884+
SORT<u32>(this.dataStart, this.length, comparator);
885+
return this;
879886
}
880887

881888
slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Uint32Array {
@@ -1010,7 +1017,8 @@ export class Int64Array extends ArrayBufferView {
10101017
}
10111018

10121019
sort(comparator: (a: i64, b: i64) => i32 = COMPARATOR<i64>()): Int64Array {
1013-
return SORT<Int64Array, i64>(this, comparator);
1020+
SORT<i64>(this.dataStart, this.length, comparator);
1021+
return this;
10141022
}
10151023

10161024
slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Int64Array {
@@ -1145,7 +1153,8 @@ export class Uint64Array extends ArrayBufferView {
11451153
}
11461154

11471155
sort(comparator: (a: u64, b: u64) => i32 = COMPARATOR<u64>()): Uint64Array {
1148-
return SORT<Uint64Array, u64>(this, comparator);
1156+
SORT<u64>(this.dataStart, this.length, comparator);
1157+
return this;
11491158
}
11501159

11511160
slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Uint64Array {
@@ -1280,7 +1289,8 @@ export class Float32Array extends ArrayBufferView {
12801289
}
12811290

12821291
sort(comparator: (a: f32, b: f32) => i32 = COMPARATOR<f32>()): Float32Array {
1283-
return SORT<Float32Array, f32>(this, comparator);
1292+
SORT<f32>(this.dataStart, this.length, comparator);
1293+
return this;
12841294
}
12851295

12861296
slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Float32Array {
@@ -1415,7 +1425,8 @@ export class Float64Array extends ArrayBufferView {
14151425
}
14161426

14171427
sort(comparator: (a: f64, b: f64) => i32 = COMPARATOR<f64>()): Float64Array {
1418-
return SORT<Float64Array, f64>(this, comparator);
1428+
SORT<f64>(this.dataStart, this.length, comparator);
1429+
return this;
14191430
}
14201431

14211432
slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Float64Array {
@@ -1511,28 +1522,6 @@ function FILL<TArray extends ArrayBufferView, T extends number>(
15111522
return array;
15121523
}
15131524

1514-
// @ts-ignore: decorator
1515-
@inline
1516-
function SORT<TArray extends ArrayBufferView, T>(
1517-
array: TArray,
1518-
comparator: (a: T, b: T) => i32
1519-
): TArray {
1520-
var len = array.length;
1521-
if (len <= 1) return array;
1522-
var base = array.dataStart;
1523-
if (len == 2) {
1524-
let a: T = load<T>(base, sizeof<T>()); // a = arr[1]
1525-
let b: T = load<T>(base); // b = arr[0]
1526-
if (comparator(a, b) < 0) {
1527-
store<T>(base, b, sizeof<T>()); // arr[1] = b
1528-
store<T>(base, a); // arr[0] = a
1529-
}
1530-
return array;
1531-
}
1532-
SORT_IMPL<T>(base, len, comparator);
1533-
return array;
1534-
}
1535-
15361525
// @ts-ignore: decorator
15371526
@inline
15381527
function SLICE<TArray extends ArrayBufferView, T>(

0 commit comments

Comments
 (0)