Uses of ::= in core.
[cslatevm.git] / src / core / arrayed.slate
blob63b7e4231fac67afc0a99069c1ede4b7d76f5235
2 Array traitsWindow _delegates := {Mapping traits. Collection traits. Sequence traits. Array traits}.
4 "Ensures that the primitive Array type has the behaviors and features of a
5 Sequence."
7 a@(Array traits) new &capacity: n
8 "Array capacity is its size, and newSize: is a primitive."
9 [a newSize: (n ifNil: [0])].
11 a@(Array traits) new* [| *rest | rest].
13 a@(Array traits) copy [a clone].
15 a@(Array traits) arrayType [a].
17 _@(Array traits) elementType [Root].
19 a@(Array traits) hasIndexedSlots [a ~== Array traits].
21 _@(Root traits) hasIndexedSlots [False].
23 ByteArray traitsWindow _delegates := {Mapping traits. Collection traits. Sequence traits. ByteArray traits}.
25 "Ensures that the primitive ByteArray type has the behaviors and features of
26 a Sequence."
28 a@(ByteArray traits) new &capacity: n
29 "Array capacity is its size, and newSize: is a primitive."
30 [a newSize: (n ifNil: [0])].
32 a@(ByteArray traits) copy [a clone].
34 a@(ByteArray traits) arrayType [a].
36 _@(ByteArray traits) elementType [SmallInteger].
38 _@(ByteArray traits) hasIndexedSlots
39 "TODO: This is done since hasIndexedSlots callers cannot reliably handle a
40 BitArray and/or ByteArray yet."
41 [False].
43 _@(ByteArray traits) defaultElement [16r00].
45 _@(ByteArray traits) accepts: i@(SmallInteger traits)
46 [i between: 16r00 and: 16rFF].
48 a@(ByteArray traits) at: i
49 [a byteAt: i].
51 a@(ByteArray traits) at: i put: obj
52 [a cannotAccept: obj in: i].
54 a@(ByteArray traits) at: i put: byte@(Integer traits)
55 [a byteAt: i put: byte].
57 a@(ByteArray traits) isLittleEndian
58 "TODO: factor this out, maybe use Platform current endianness?"
59 [-1.0 first isZero].
61 a@(ByteArray traits) int16At: offset
63   a isLittleEndian ifTrue: [a littleEndianInt16At: offset] ifFalse: [a bigEndianInt16At: offset]
66 a@(ByteArray traits) int32At: offset
68   a isLittleEndian ifTrue: [a littleEndianInt32At: offset] ifFalse: [a bigEndianInt32At: offset]
71 a@(ByteArray traits) int64At: offset
73   a isLittleEndian ifTrue: [a littleEndianInt64At: offset] ifFalse: [a bigEndianInt64At: offset]
76 a@(ByteArray traits) int16At: offset put: value
78   a isLittleEndian ifTrue: [a littleEndianInt16At: offset put: value] ifFalse: [a bigEndianInt16At: offset put: value]
81 a@(ByteArray traits) int32At: offset put: value
83   a isLittleEndian ifTrue: [a littleEndianInt32At: offset put: value] ifFalse: [a bigEndianInt32At: offset put: value]
86 a@(ByteArray traits) int64At: offset put: value
88   a isLittleEndian ifTrue: [a littleEndianInt64At: offset put: value] ifFalse: [a bigEndianInt64At: offset put: value]
91 a@(ByteArray traits) bigEndianInt16At: offset
93   offset *= 2.
94   ((a byteAt: offset    ) byteShift: 1 ) +
95    (a byteAt: offset + 1)
98 a@(ByteArray traits) bigEndianInt32At: offset
100   offset *= 4.
101   ((a byteAt: offset    ) byteShift: 3) +
102   ((a byteAt: offset + 1) byteShift: 2) +
103   ((a byteAt: offset + 2) byteShift: 1) +
104    (a byteAt: offset + 3)
107 a@(ByteArray traits) bigEndianInt64At: offset
109   offset *= 8.
110   ((a byteAt: offset    ) byteShift: 7) +
111   ((a byteAt: offset + 1) byteShift: 6) +
112   ((a byteAt: offset + 2) byteShift: 5) +
113   ((a byteAt: offset + 3) byteShift: 4) +
114   ((a byteAt: offset + 4) byteShift: 3) +
115   ((a byteAt: offset + 5) byteShift: 2) +
116   ((a byteAt: offset + 6) byteShift: 1) +
117    (a byteAt: offset + 7)
120 a@(ByteArray traits) bigEndianInt16At: offset put: word@(ByteArray traits)
122   offset *= 2.
123   a byteAt: offset     put: (word byteAt: 1).
124   a byteAt: offset + 1 put: (word byteAt: 0).
125   word
128 a@(ByteArray traits) bigEndianInt16At: offset put: word@(Integer traits)
130   offset *= 2.
131   a byteAt: offset     put: (word bitShift: -8) intoByte.
132   a byteAt: offset + 1 put: word intoByte.
133   word
136 a@(ByteArray traits) bigEndianInt32At: offset put: word@(ByteArray traits)
138   offset *= 4.
139   a byteAt: offset     put: (word byteAt: 3).
140   a byteAt: offset + 1 put: (word byteAt: 2).
141   a byteAt: offset + 2 put: (word byteAt: 1).
142   a byteAt: offset + 3 put: (word byteAt: 0).
143   word
146 a@(ByteArray traits) bigEndianInt32At: offset put: word@(Integer traits)
148   offset *= 4.
149   a byteAt: offset     put: (word bitShift: -24) intoByte.
150   a byteAt: offset + 1 put: (word bitShift: -16) intoByte.
151   a byteAt: offset + 2 put: (word bitShift: -8) intoByte.
152   a byteAt: offset + 3 put: word intoByte.
153   word
156 a@(ByteArray traits) bigEndianInt64At: offset put: word@(ByteArray traits)
158   offset *= 8.
159   a byteAt: offset     put: (word byteAt: 7).
160   a byteAt: offset + 1 put: (word byteAt: 6).
161   a byteAt: offset + 2 put: (word byteAt: 5).
162   a byteAt: offset + 3 put: (word byteAt: 4).
163   a byteAt: offset + 4 put: (word byteAt: 3).
164   a byteAt: offset + 5 put: (word byteAt: 2).
165   a byteAt: offset + 6 put: (word byteAt: 1).
166   a byteAt: offset + 7 put: (word byteAt: 0).
167   word
170 a@(ByteArray traits) bigEndianInt64At: offset put: word@(Integer traits)
172   offset *= 8.
173   a byteAt: offset     put: (word bitShift: -56) intoByte.
174   a byteAt: offset + 1 put: (word bitShift: -48) intoByte.
175   a byteAt: offset + 2 put: (word bitShift: -40) intoByte.
176   a byteAt: offset + 3 put: (word bitShift: -32) intoByte.
177   a byteAt: offset + 4 put: (word bitShift: -24) intoByte.
178   a byteAt: offset + 5 put: (word bitShift: -16) intoByte.
179   a byteAt: offset + 6 put: (word bitShift: -8) intoByte.
180   a byteAt: offset + 7 put: word intoByte.
181   word
184 a@(ByteArray traits) littleEndianInt16At: offset
186   offset *= 2.
187    (a byteAt: offset    )               +
188   ((a byteAt: offset + 1) byteShift: 1)
191 a@(ByteArray traits) littleEndianInt32At: offset
193   offset *= 4.
194    (a byteAt: offset    )               +
195   ((a byteAt: offset + 1) byteShift: 1) +
196   ((a byteAt: offset + 2) byteShift: 2) +
197   ((a byteAt: offset + 3) byteShift: 3)
200 a@(ByteArray traits) littleEndianInt64At: offset
202   offset *= 8.
203    (a byteAt: offset    )               +
204   ((a byteAt: offset + 1) byteShift: 1) +
205   ((a byteAt: offset + 2) byteShift: 2) +
206   ((a byteAt: offset + 3) byteShift: 3) +
207   ((a byteAt: offset + 4) byteShift: 4) +
208   ((a byteAt: offset + 5) byteShift: 5) +
209   ((a byteAt: offset + 6) byteShift: 6) +
210   ((a byteAt: offset + 7) byteShift: 7)
213 a@(ByteArray traits) littleEndianInt16At: offset put: word@(ByteArray traits)
215   offset *= 2.
216   a byteAt: offset     put: (word byteAt: 0).
217   a byteAt: offset + 1 put: (word byteAt: 1).
218   word
221 a@(ByteArray traits) littleEndianInt16At: offset put: word@(Integer traits)
223   offset *= 2.
224   a byteAt: offset     put: word intoByte.
225   a byteAt: offset + 1 put: (word bitShift: -8) intoByte.
226   word
229 a@(ByteArray traits) littleEndianInt32At: offset put: word@(ByteArray traits)
231   offset *= 4.
232   a byteAt: offset     put: (word byteAt: 0).
233   a byteAt: offset + 1 put: (word byteAt: 1).
234   a byteAt: offset + 2 put: (word byteAt: 2).
235   a byteAt: offset + 3 put: (word byteAt: 3).
236   word
239 a@(ByteArray traits) littleEndianInt32At: offset put: word@(Integer traits)
241   offset *= 4.
242   a byteAt: offset     put: word intoByte.
243   a byteAt: offset + 1 put: (word bitShift: -8) intoByte.
244   a byteAt: offset + 2 put: (word bitShift: -16) intoByte.
245   a byteAt: offset + 3 put: (word bitShift: -24) intoByte.
246   word
249 a@(ByteArray traits) littleEndianInt64At: offset put: word@(ByteArray traits)
251   offset *= 8.
252   a byteAt: offset     put: (word byteAt: 0).
253   a byteAt: offset + 1 put: (word byteAt: 1).
254   a byteAt: offset + 2 put: (word byteAt: 2).
255   a byteAt: offset + 3 put: (word byteAt: 3).
256   a byteAt: offset + 4 put: (word byteAt: 4).
257   a byteAt: offset + 5 put: (word byteAt: 5).
258   a byteAt: offset + 6 put: (word byteAt: 6).
259   a byteAt: offset + 7 put: (word byteAt: 7).
260   word
263 a@(ByteArray traits) littleEndianInt64At: offset put: word@(Integer traits)
265   offset *= 8.
266   a byteAt: offset     put: word intoByte.
267   a byteAt: offset + 1 put: (word bitShift: -8) intoByte.
268   a byteAt: offset + 2 put: (word bitShift: -16) intoByte.
269   a byteAt: offset + 3 put: (word bitShift: -24) intoByte.
270   a byteAt: offset + 4 put: (word bitShift: -32) intoByte.
271   a byteAt: offset + 5 put: (word bitShift: -40) intoByte.
272   a byteAt: offset + 6 put: (word bitShift: -48) intoByte.
273   a byteAt: offset + 7 put: (word bitShift: -56) intoByte.
274   word
277 collections define: #BitArray &parents: {ByteArray} &slots: {#bitSize -> 0} &basedOn: ByteArray.
278 "Uses byte-contents to implement an array of direct binary values (Booleans)."
280 a@(BitArray traits) new &capacity: bitSize
282   bitSize `defaultsTo: 0.
283   byteSize ::= (n + 7) // 8.
284   (a newSize: byteSize) `>> [bitSize := bitSize. ]
287 a@(BitArray traits) size [a bitSize].
288 a@(BitArray traits) arrayType [a].
289 _@(BitArray traits) elementType [Boolean].
290 _@(BitArray traits) defaultElement [False].
291 _@(BitArray traits) accepts: _ [False].
292 _@(BitArray traits) accepts: _@(Boolean traits) [True].
294 a@(BitArray traits) includesKey: i
296   i < a bitSize
299 a@(BitArray traits) at: i
301   (a includesKey: i) ifFalse: [^ (i keyNotFoundOn: a)].
302   ((a byteAt: i // 8) bitAnd: 1 << (i \\ 8)) isZero not
305 a@(BitArray traits) at: i put: bool@(Boolean traits)
307   (a includesKey: i) ifFalse: [^ (i keyNotFoundOn: a)].
308   byteOffset ::= i // 8.
309   bitMask ::= 1 << (i \\ 8).
310   byte ::= a byteAt: byteOffset.
311   a byteAt: byteOffset put:
312     (bool
313        ifTrue: [byte bitOr: bitMask]
314        ifFalse: [byte bitAnd: bitMask bitNot]).
315   bool
318 a@(BitArray traits) at: i put: obj
319 [a cannotAccept: obj in: i].
321 a@(BitArray traits) at: i put: n@(Integer traits)
323   n caseOf: {
324     0 -> [a at: i put: False].
325     1 -> [a at: i put: True]
326   } otherwise: [resend]
329 LexicalContext traitsWindow _delegates :=
330  {Cloneable. Root traits. Derivable traits. Cloneable traits. Mapping traits. Collection traits. Sequence traits. Array traits. LexicalContext traits}.
332 Closure traitsWindow _delegates :=
333  {Cloneable. Root traits. Derivable traits. Cloneable traits. Mapping traits. Collection traits. Sequence traits. Array traits. Method traits. Closure traits}.
335 "a float is a byte array, and we need to be able to call #newWithSize: to create floats in the bootstrapper."
336 SingleFloat traitsWindow _delegates :=
337  {ByteArray traits. Sequence traits. CoercibleNumberMixin traits. Comparable traits. Number traits. Float traits. SingleFloat traits}.