@@ -18,7 +18,7 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
18
18
var /cmp = GLOBAL_PROC_REF (cmp_numeric_asc)
19
19
20
20
// whether we are sorting list keys (0: L[i]) or associated values (1: L[L[i]])
21
- var /associative = 0
21
+ var /associative = FALSE
22
22
23
23
// This controls when we get *into* galloping mode. It is initialized to MIN_GALLOP.
24
24
// The mergeLo and mergeHi methods nudge it higher for random data, and lower for highly structured data.
@@ -32,8 +32,10 @@ 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
+ var /list /runBases = src . runBases
36
+ var /list /runLens = src . runLens
37
+ runBases. len = 0
38
+ runLens. len = 0
37
39
38
40
var /remaining = end - start
39
41
@@ -59,8 +61,8 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
59
61
runLen = force
60
62
61
63
// add data about run to queue
62
- runBases. Add( start)
63
- runLens. Add( runLen)
64
+ runBases += start
65
+ runLens += runLen
64
66
65
67
// maybe merge
66
68
mergeCollapse ()
@@ -101,6 +103,7 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
101
103
if (start <= lo)
102
104
start = lo + 1
103
105
106
+ var /list /L = src . L
104
107
for (,start < hi, ++ start)
105
108
var /pivot = fetchElement(L,start)
106
109
@@ -140,6 +143,7 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
140
143
if (runHi >= hi)
141
144
return 1
142
145
146
+ var /list /L = src . L
143
147
var /last = fetchElement(L,lo)
144
148
var /current = fetchElement(L,runHi++ )
145
149
@@ -177,8 +181,10 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
177
181
// This method is called each time a new run is pushed onto the stack.
178
182
// So the invariants are guaranteed to hold for i<stackSize upon entry to the method
179
183
/ datum / sort_instance/ proc / mergeCollapse()
180
- while (runBases. len >= 2 )
181
- var /n = runBases. len - 1
184
+ var /list /runBases = src . runBases
185
+ var /list /runLens = src . runLens
186
+ while (length(runBases) >= 2 )
187
+ var /n = length(runBases) - 1
182
188
if (n > 1 && runLens[n- 1 ] <= runLens[n] + runLens[n+ 1 ])
183
189
if (runLens[n- 1 ] < runLens[n+ 1 ])
184
190
-- n
@@ -192,8 +198,10 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
192
198
// Merges all runs on the stack until only one remains.
193
199
// Called only once, to finalise the sort
194
200
/ datum / sort_instance/ proc / mergeForceCollapse()
195
- while (runBases. len >= 2 )
196
- var /n = runBases. len - 1
201
+ var /list /runBases = src . runBases
202
+ var /list /runLens = src . runLens
203
+ while (length(runBases) >= 2 )
204
+ var /n = length(runBases) - 1
197
205
if (n > 1 && runLens[n- 1 ] < runLens[n+ 1 ])
198
206
-- n
199
207
mergeAt (n)
@@ -206,6 +214,9 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
206
214
// ASSERT(runBases.len >= 2)
207
215
// ASSERT(i >= 1)
208
216
// ASSERT(i == runBases.len - 1 || i == runBases.len - 2)
217
+ var /list /runBases = src . runBases
218
+ var /list /runLens = src . runLens
219
+ var /list /L = src . L
209
220
210
221
var /base1 = runBases[i]
211
222
var /base2 = runBases[i+ 1 ]
@@ -261,6 +272,7 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
261
272
262
273
var /lastOffset = 0
263
274
var /offset = 1
275
+ var /list /L = src . L
264
276
if (call (cmp)(key, fetchElement(L,base+ hint)) > 0 )
265
277
var /maxOffset = len - hint
266
278
while (offset < maxOffset && call (cmp)(key, fetchElement(L,base+ hint+ offset)) > 0 )
@@ -320,6 +332,7 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
320
332
321
333
var /offset = 1
322
334
var /lastOffset = 0
335
+ var /list /L = src . L
323
336
if (call (cmp)(key, fetchElement(L,base+ hint)) < 0 ) // key <= L[base+hint]
324
337
var /maxOffset = hint + 1 // therefore we want to insert somewhere in the range [base,base+hint] = [base+,base+(hint+1))
325
338
while (offset < maxOffset && call (cmp)(key, fetchElement(L,base+ hint- offset)) < 0 ) // we are iterating backwards
@@ -368,6 +381,7 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
368
381
369
382
var /cursor1 = base1
370
383
var /cursor2 = base2
384
+ var /list /L = src . L
371
385
372
386
// degenerate cases
373
387
if (len2 == 1 )
@@ -384,7 +398,7 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
384
398
-- len2
385
399
386
400
outer:
387
- while (1 )
401
+ while (TRUE )
388
402
var /count1 = 0 // # of times in a row that first run won
389
403
var /count2 = 0 // " " " " " " second run won
390
404
@@ -471,6 +485,7 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
471
485
var /cursor1 = base1 + len1 - 1 // start at end of sublists
472
486
var /cursor2 = base2 + len2 - 1
473
487
488
+ var /list /L = src . L
474
489
// degenerate cases
475
490
if (len2 == 1 )
476
491
move_element (L, base2, base1)
@@ -484,7 +499,7 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
484
499
-- len1
485
500
486
501
outer:
487
- while (1 )
502
+ while (TRUE )
488
503
var /count1 = 0 // # of times in a row that first run won
489
504
var /count2 = 0 // " " " " " " second run won
490
505
@@ -574,24 +589,26 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
574
589
return
575
590
576
591
var /minRun = minRunLength(remaining)
592
+ var /list /runBases = src . runBases
593
+ var /list /runLens = src . runLens
577
594
578
595
do
579
596
var /runLen = (remaining <= minRun) ? remaining : minRun
580
597
581
598
binarySort (start, start+ runLen, start)
582
599
583
600
// add data about run to queue
584
- runBases. Add( start)
585
- runLens. Add( runLen)
601
+ runBases += start
602
+ runLens += runLen
586
603
587
604
// Advance to find next run
588
605
start += runLen
589
606
remaining -= runLen
590
607
591
608
while (remaining > 0 )
592
609
593
- while (runBases. len >= 2 )
594
- var /n = runBases. len - 1
610
+ while (length( runBases) >= 2 )
611
+ var /n = length( runBases) - 1
595
612
if (n > 1 && runLens[n- 1 ] <= runLens[n] + runLens[n+ 1 ])
596
613
if (runLens[n- 1 ] < runLens[n+ 1 ])
597
614
-- n
@@ -601,15 +618,19 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sort_instance, new())
601
618
else
602
619
break // Invariant is established
603
620
604
- while (runBases. len >= 2 )
605
- var /n = runBases. len - 1
621
+ while (length( runBases) >= 2 )
622
+ var /n = length( runBases) - 1
606
623
if (n > 1 && runLens[n- 1 ] < runLens[n+ 1 ])
607
624
-- n
608
625
mergeAt2 (n)
609
626
610
627
return L
611
628
612
629
/ datum / sort_instance/ proc / mergeAt2(i)
630
+ var /list /runBases = src . runBases
631
+ var /list /runLens = src . runLens
632
+ var /list /L = src . L
633
+
613
634
var /cursor1 = runBases[i]
614
635
var /cursor2 = runBases[i+ 1 ]
615
636
0 commit comments