|
Class: MethodDictionary
Object
|
+--Collection
|
+--KeyedCollection
|
+--MethodDictionary
- Package:
- stx:libbasic
- Category:
- Kernel-Methods
- Version:
- rev:
1.41
date: 2019/07/27 23:00:14
- user: cg
- file: MethodDictionary.st directory: libbasic
- module: stx stc-classLibrary: libbasic
- Author:
- Stefan Vogel
Instances of MethodDictionary store selector/method associations
in classes. Conceptionally, they behave like IdentityDictionaries, but are
implemented using a single array (instead of Dictionary, which uses
two arrays to store keys and values separately).
Also, they do not use hashing, since due to caching in the VM, hashing
does not make too much of a difference in speed, but complicates the
VM implementation.
Dictionary
IdentityDictionary
Behavior
Class
Method
Symbol
instance creation
-
new
-
create and return an empty methodDictionary.
Because mDicts cannot grow, we return a singleton
(if any selectors are added later, a new instance
will be created anyway).
Using a singleton will speed up dynamic creation of
new classes which will be filled in later
-
new: sz
-
create and return a new methodDictionary holding sz
key->value associations
-
newWithCapacity: size
-
return a new empty Collection with capacity for n elements.
-
withAll: aDictionary
-
create a MethodDictionary from another Dictionary
-
withKeys: keys andValues: values
-
create a MethodDictionary from a key (selector) array and value (method) array
queries
-
isBuiltInClass
-
this class is known by the run-time-system
accessing
-
at: key ifAbsent: exceptionBlock
-
return the element indexed by aKey -
return result of exceptionBlock if no element is stored under aKey
-
at: key put: value
-
set the value for a given key, which is supposed to be a symbol.
In contrast to dictionaries, we allow adding elements only, if there is an
empty slot (nil key) present.
-
at: key putOrAppend: value
-
set the value for a given key, which is supposed to be a symbol.
In contrast to dictionaries, we allow adding elements only, if there is an
empty slot (nil key) present.
Otherwise a new MethodDictionary is created & returned
-
keyAtIdenticalValue: value ifAbsent: exceptionBlock
-
return the first key with value -
return result of exceptionBlock if no key can be found.
This is a slow access, since the receiver is searched sequentially.
NOTICE:
The value is searched using identity compare
-
keyAtValue: value
-
return the key under which value is stored.
Raise an error if not found.
This is a slow access, since the receiver is searched sequentially.
NOTICE:
The value is searched using identity compare.
use #keyAtEqualValue:ifAbsent: to compare for equality.
-
keyAtValue: value ifAbsent: exceptionBlock
-
return the key under which value is stored.
If not found, return the value from evaluating exceptionBlock.
This is a slow access, since the receiver is searched sequentially.
NOTICE:
The value is searched using identity compare;
use #keyAtEqualValue:ifAbsent: to compare for equality.
enumerating
-
do: aBlock
-
evaluate aBlock for each value (i.e. each method)
-
keysAndValuesDo: aBlock
-
evaluate the 2 arg block aBlock for each key (i.e. each selector)
and each value (i.e. each method)
-
keysDo: aBlock
-
evaluate aBlock for each key (i.e. each selector)
private
-
atIndex: idx putKey: key andValue: value
-
set the key, which is supposed to be a symbol,
and the value at idx.
Only use this to initialize a methodDictionary fast,
when the set of methods is known beforehand
(avoids search for nil slots)
-
compressed
-
compress - return either the myself or a new, compressed MethodDictionary
queries
-
size
-
return the number of elements (associations) in the receiver
-
speciesForCollecting
-
(comment from inherited method)
like species, but used when doing collect operations.
Redefined for collections which return a different classes object when doing collect.
removing
-
removeKey: key ifAbsent: failBlock
-
remove key from dictionary,
return the value previously stored there.
If it was not in the collection return the result
from evaluating failBlock.
We actually do not remove it, but set it to nil.
-
removeKeyAndCompress: key
-
remove key from dictionary.
A new, compressed MethodDictionary will be returned,
or nil, if key is not present.
|