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