@@ -32,8 +32,8 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
32
32
33
33
34
34
/ datum / sort_instance/ proc / timSort(start, end)
35
- runBases. len = 0
36
- runLens. len = 0
35
+ runBases. Cut()
36
+ runLens. Cut()
37
37
38
38
var /remaining = end - start
39
39
@@ -59,8 +59,8 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
59
59
runLen = force
60
60
61
61
// add data about run to queue
62
- runBases += start
63
- runLens += runLen
62
+ runBases. Add( start)
63
+ runLens. Add( runLen)
64
64
65
65
// maybe merge
66
66
mergeCollapse ()
@@ -179,10 +179,8 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
179
179
// This method is called each time a new run is pushed onto the stack.
180
180
// So the invariants are guaranteed to hold for i<stackSize upon entry to the method
181
181
/ datum / sort_instance/ proc / mergeCollapse()
182
- var /list /runBases = src . runBases
183
- var /list /runLens = src . runLens
184
- while (length(runBases) >= 2 )
185
- var /n = length(runBases) - 1
182
+ while (runBases. len >= 2 )
183
+ var /n = runBases. len - 1
186
184
if (n > 1 && runLens[n- 1 ] <= runLens[n] + runLens[n+ 1 ])
187
185
if (runLens[n- 1 ] < runLens[n+ 1 ])
188
186
-- n
@@ -196,10 +194,8 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
196
194
// Merges all runs on the stack until only one remains.
197
195
// Called only once, to finalise the sort
198
196
/ datum / sort_instance/ proc / mergeForceCollapse()
199
- var /list /runBases = src . runBases
200
- var /list /runLens = src . runLens
201
- while (length(runBases) >= 2 )
202
- var /n = length(runBases) - 1
197
+ while (runBases. len >= 2 )
198
+ var /n = runBases. len - 1
203
199
if (n > 1 && runLens[n- 1 ] < runLens[n+ 1 ])
204
200
-- n
205
201
mergeAt (n)
@@ -209,9 +205,6 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
209
205
// Run i must be the penultimate or antepenultimate run on the stack
210
206
// In other words, i must be equal to stackSize-2 or stackSize-3
211
207
/ datum / sort_instance/ proc / mergeAt(i)
212
- var /list /runBases = src . runBases
213
- var /list /runLens = src . runLens
214
- var /list /L = src . L
215
208
// ASSERT(runBases.len >= 2)
216
209
// ASSERT(i >= 1)
217
210
// ASSERT(i == runBases.len - 1 || i == runBases.len - 2)
@@ -586,26 +579,24 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
586
579
return
587
580
588
581
var /minRun = minRunLength(remaining)
589
- var /list /runBases = src . runBases
590
- var /list /runLens = src . runLens
591
582
592
583
do
593
584
var /runLen = (remaining <= minRun) ? remaining : minRun
594
585
595
586
binarySort (start, start+ runLen, start)
596
587
597
588
// add data about run to queue
598
- runBases += start
599
- runLens += runLen
589
+ runBases. Add( start)
590
+ runLens. Add( runLen)
600
591
601
592
// Advance to find next run
602
593
start += runLen
603
594
remaining -= runLen
604
595
605
596
while (remaining > 0 )
606
597
607
- while (length( runBases) >= 2 )
608
- var /n = length( runBases) - 1
598
+ while (runBases. len >= 2 )
599
+ var /n = runBases. len - 1
609
600
if (n > 1 && runLens[n- 1 ] <= runLens[n] + runLens[n+ 1 ])
610
601
if (runLens[n- 1 ] < runLens[n+ 1 ])
611
602
-- n
@@ -615,17 +606,15 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
615
606
else
616
607
break // Invariant is established
617
608
618
- while (length( runBases) >= 2 )
619
- var /n = length( runBases) - 1
609
+ while (runBases. len >= 2 )
610
+ var /n = runBases. len - 1
620
611
if (n > 1 && runLens[n- 1 ] < runLens[n+ 1 ])
621
612
-- n
622
613
mergeAt2 (n)
623
614
624
615
return L
625
616
626
617
/ datum / sort_instance/ proc / mergeAt2(i)
627
- var /list /runBases = src . runBases
628
- var /list /runLens = src . runLens
629
618
var /list /L = src . L
630
619
var /cursor1 = runBases[i]
631
620
var /cursor2 = runBases[i+ 1 ]
0 commit comments