Inline some arithmetic primitives in the interpreter. Fix oversight
[panda.git] / st / ArrayedCollection.st
blob6fd6e87f18701ee9ad85173bbc1a474b637b5afa
3 "instance creation"
5 ArrayedCollection classMethod!
6 new
7         ^ self new: 0!
9 ArrayedCollection classMethod!
10 with: anObject
11         ^ (self new: 1)
12         at: 1 put: anObject;
13         yourself!
15 ArrayedCollection classMethod!
16 with: firstObject with: secondObject
17         ^ (self new: 2)
18         at: 1 put: firstObject;
19         at: 2 put: secondObject;
20         yourself!
22 ArrayedCollection classMethod!
23 with: firstObject with: secondObject with: thirdObject
24         ^ (self new: 3)
25         at: 1 put: firstObject;
26         at: 2 put: secondObject;
27         at: 3 put: thirdObject;
28         yourself!
30 ArrayedCollection classMethod!
31 with: firstObject with: secondObject with: thirdObject with: fourthObject
32         ^ (self new: 4)
33         at: 1 put: firstObject;
34         at: 2 put: secondObject;
35         at: 3 put: thirdObject;
36         at: 4 put: fourthObject;
37         yourself!
39 "adding"
41 ArrayedCollection method!
42 add: anObject
43         ^ self shouldNotImplement!
46 "sorting"
48 ArrayedCollection method!
49 sort
50         self sortBy: [ :u :v | u <= v ]!
52 ArrayedCollection method!
53 sortBy: aBlock
54         self mergeSortWithBuffer: (Array new: self size)
55                  low: 1
56                  high: self size
57              sortBlock: aBlock!
59 ArrayedCollection method!
60 mergeSortWithBuffer: buf low: lo high: hi sortBlock: aBlock
61         "Merge Sort
62      Copyright (C) Jeffrey Stedfast
63      http://jeffreystedfast.blogspot.com/2007/02/merge-sort.html"
64      
65         | mid i l h |
67         lo >= hi
68                 ifTrue: [^ self].
70         mid := lo + ((hi - lo) // 2).
72         self mergeSortWithBuffer: buf
73                  low: lo
74                  high: mid
75              sortBlock: aBlock.
76         self mergeSortWithBuffer: buf
77                  low: mid + 1
78                  high: hi
79              sortBlock: aBlock.
81         l := lo.
82         h := mid + 1.
83         i := 1.
85         [(l <= mid) & (h <= hi)]
86                 whileTrue:
87                         [(aBlock value: (self at: l) value: (self at: h))
88                                 ifTrue: [buf at: i put: (self at: l). l := l + 1]
89                                 ifFalse: [buf at: i put: (self at: h). h := h + 1].
90                          i := i + 1].
92         [l <= mid]
93                 whileTrue:
94                         [buf at: i put: (self at: l). i := i + 1. l := l + 1].
95         [h <= hi]
96                 whileTrue:
97                         [buf at: i put: (self at: h). i := i + 1. h := h + 1].
99         self replaceFrom: lo
100              to: lo + (i - 2)
101              with: buf
102              startingAt: 1!