Add st-handle.h
[panda.git] / st / Dictionary.st
bloba7661113222e18f2636ee83398c7721280a7b123
2 "accessing"
4 Dictionary method!
5 at: key
6         | assoc |
8         assoc := array at: (self find: key).
9         assoc ifNil: [^ nil].
11         ^ assoc value!
13 Dictionary method!
14 at: key put: anObject
15         | index assoc |
17         index := self find: key.
18         assoc := array at: index.
20         assoc ifNotNil: [assoc value: anObject. ^ anObject].
22         self at: index include: (Association key: key value: anObject).
24         ^ anObject!
26 Dictionary method!
27 keys
28         | keys |
29         keys := Set new.
30         self do: [ :assoc | keys include: assoc key ].
31         ^ keys!
33 Dictionary method!
34 values
35         | values |
37         values := WriteStream on: (Array new: self size).
38         self do: [ :assoc | values nextPut: assoc value ].
39         ^ values contents!
42 "enumerating"
44 Dictionary method!
45 keysDo: aBlock
46         self do: [ :assoc | aBlock value: assoc key ]!
48 Dictionary method!
49 valuesDo: aBlock
50         self do: [ :assoc | aBlock value: assoc value ]!
52 Dictionary method!
53 select: aBlock
54         | stream |
55         
56         stream := WriteStream on: (Array new: self size).
57         self do: [ :assoc |
58                                 (aBlock value: assoc value)
59                                         ifTrue: [stream nextPut: assoc value]].
61         ^ stream contents!
62                                 
66 "testing"
68 Dictionary method!
69 includesKey: anObject
70         | index assoc |
72         (array at: (self find: anObject)) ifNil: [^ false].
74         ^ true!
76 "private"
78 Dictionary method!
79 remove: anObject ifAbsent: aBlock
80         self shouldNotImplement!
82 Dictionary method!
83 removeKey: anObject ifAbsent: aBlock
84         | index assoc |
86         index := self find: anObject.
87         assoc := array at: index.
88         assoc ifNil: [^ aBlock value]. 
90         self removeAtIndex: index.
92         ^ assoc value!
94 Dictionary method!
95 removeKey: anObject
96         ^ self removeKey: anObject ifAbsent: [self error: 'key not found']!
98 Dictionary method!
99 find: anObject in: anArray
100         | i mask |
102         mask := anArray size - 1.
104         i := (anObject hash bitAnd: mask) + 1.
106         [ | object | 
108           object := anArray at: i.
110           (object == nil)
111                   ifTrue: [^ i].
112           (object key = anObject) 
113                   ifTrue: [^ i].
115           i := (i + 106720 bitAnd: mask) + 1.
117         ] repeat!