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
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
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."
43 _@(ByteArray traits) defaultElement [16r00].
45 _@(ByteArray traits) accepts: i@(SmallInteger traits)
46 [i between: 16r00 and: 16rFF].
48 a@(ByteArray traits) at: 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?"
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
94 ((a byteAt: offset ) byteShift: 1 ) +
95 (a byteAt: offset + 1)
98 a@(ByteArray traits) bigEndianInt32At: offset
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
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)
123 a byteAt: offset put: (word byteAt: 1).
124 a byteAt: offset + 1 put: (word byteAt: 0).
128 a@(ByteArray traits) bigEndianInt16At: offset put: word@(Integer traits)
131 a byteAt: offset put: (word bitShift: -8) intoByte.
132 a byteAt: offset + 1 put: word intoByte.
136 a@(ByteArray traits) bigEndianInt32At: offset put: word@(ByteArray traits)
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).
146 a@(ByteArray traits) bigEndianInt32At: offset put: word@(Integer traits)
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.
156 a@(ByteArray traits) bigEndianInt64At: offset put: word@(ByteArray traits)
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).
170 a@(ByteArray traits) bigEndianInt64At: offset put: word@(Integer traits)
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.
184 a@(ByteArray traits) littleEndianInt16At: offset
187 (a byteAt: offset ) +
188 ((a byteAt: offset + 1) byteShift: 1)
191 a@(ByteArray traits) littleEndianInt32At: offset
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
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)
216 a byteAt: offset put: (word byteAt: 0).
217 a byteAt: offset + 1 put: (word byteAt: 1).
221 a@(ByteArray traits) littleEndianInt16At: offset put: word@(Integer traits)
224 a byteAt: offset put: word intoByte.
225 a byteAt: offset + 1 put: (word bitShift: -8) intoByte.
229 a@(ByteArray traits) littleEndianInt32At: offset put: word@(ByteArray traits)
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).
239 a@(ByteArray traits) littleEndianInt32At: offset put: word@(Integer traits)
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.
249 a@(ByteArray traits) littleEndianInt64At: offset put: word@(ByteArray traits)
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).
263 a@(ByteArray traits) littleEndianInt64At: offset put: word@(Integer traits)
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.
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
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:
313 ifTrue: [byte bitOr: bitMask]
314 ifFalse: [byte bitAnd: bitMask bitNot]).
318 a@(BitArray traits) at: i put: obj
319 [a cannotAccept: obj in: i].
321 a@(BitArray traits) at: i put: n@(Integer traits)
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}.