--- a/WeakIdentitySet.st Thu Aug 11 06:44:08 2016 +0200
+++ b/WeakIdentitySet.st Fri Aug 12 06:44:59 2016 +0200
@@ -11,6 +11,8 @@
"
"{ Package: 'stx:libbasic' }"
+"{ NameSpace: Smalltalk }"
+
IdentitySet subclass:#WeakIdentitySet
instanceVariableNames:''
classVariableNames:''
@@ -225,7 +227,7 @@
Grow the receiver, if key was not found, and no unused slots were present.
Warning: an empty slot MUST be filled by the sender - it is only to be sent
- by at:put: / add: - like methods."
+ by at:put: / add: - like methods."
|index "{ Class:SmallInteger }"
length "{ Class:SmallInteger }"
@@ -233,11 +235,11 @@
delIndex "{ Class:SmallInteger }"|
(OperatingSystem blockInterrupts) ifFalse:[
- "/
- "/ may never be entered with interrupts enabled
- "/
- OperatingSystem unblockInterrupts.
- self error:'unblocked call of findKeyOrNil'.
+ "/
+ "/ may never be entered with interrupts enabled
+ "/
+ OperatingSystem unblockInterrupts.
+ self error:'unblocked call of findKeyOrNil'.
].
delIndex := 0.
@@ -246,37 +248,100 @@
startIndex := index := self initialIndexForKey:key.
[
- probe := keyArray basicAt:index.
- key == probe ifTrue:[^ index].
- probe isNil ifTrue:[
- delIndex == 0 ifTrue:[^ index].
- keyArray basicAt:delIndex put:nil.
- ^ delIndex
- ].
+ probe := keyArray basicAt:index.
+ key == probe ifTrue:[^ index].
+ probe isNil ifTrue:[
+ delIndex == 0 ifTrue:[^ index].
+ keyArray basicAt:delIndex put:nil.
+ ^ delIndex
+ ].
+
+ probe class == SmallInteger ifTrue:[
+ probe := DeletedEntry.
+ keyArray basicAt:index put:probe.
+ tally := tally - 1.
+ ].
+ delIndex == 0 ifTrue:[
+ probe == DeletedEntry ifTrue:[
+ delIndex := index
+ ]
+ ].
+
+ index == length ifTrue:[
+ index := 1
+ ] ifFalse:[
+ index := index + 1
+ ].
+ index == startIndex ifTrue:[
+ delIndex ~~ 0 ifTrue:[
+ keyArray basicAt:delIndex put:nil.
+ ^ delIndex
+ ].
+ self grow.
+ length := keyArray basicSize.
+ startIndex := index := self initialIndexForKey:key.
+ ].
+ ] loop.
+
+ "Modified: 30.1.1997 / 15:04:38 / cg"
+!
+
+findKeyOrNilOrDeletedEntry:key
+ "Look for the key in the receiver.
+ If it is found, return return the index, otherwise
+ the index of the first unused slot.
+ Grow the receiver, if key was not found, and no unused slots were present"
- probe class == SmallInteger ifTrue:[
- probe := DeletedEntry.
- keyArray basicAt:index put:probe.
- tally := tally - 1.
- ].
- delIndex == 0 ifTrue:[
- probe == DeletedEntry ifTrue:[
- delIndex := index
- ]
- ].
+ |index "{ Class:SmallInteger }"
+ length "{ Class:SmallInteger }"
+ startIndex probe
+ delIndex "{ Class:SmallInteger }"|
+
+ (OperatingSystem blockInterrupts) ifFalse:[
+ "/
+ "/ may never be entered with interrupts enabled
+ "/
+ OperatingSystem unblockInterrupts.
+ self error:'unblocked call of findKeyOrNil'.
+ ].
+
+ delIndex := 0.
+
+ length := keyArray basicSize.
+ startIndex := index := self initialIndexForKey:key.
- index == length ifTrue:[
- index := 1
- ] ifFalse:[
- index := index + 1
- ].
- index == startIndex ifTrue:[
- delIndex ~~ 0 ifTrue:[
- keyArray basicAt:delIndex put:nil.
- ^ delIndex
- ].
- ^ self grow findKeyOrNil:key
- ].
+ [
+ probe := keyArray basicAt:index.
+ key == probe ifTrue:[^ index].
+ probe isNil ifTrue:[
+ delIndex == 0 ifTrue:[^ index].
+ ^ delIndex
+ ].
+
+ probe class == SmallInteger ifTrue:[
+ probe := DeletedEntry.
+ keyArray basicAt:index put:probe.
+ tally := tally - 1.
+ ].
+ delIndex == 0 ifTrue:[
+ probe == DeletedEntry ifTrue:[
+ delIndex := index
+ ]
+ ].
+
+ index == length ifTrue:[
+ index := 1
+ ] ifFalse:[
+ index := index + 1
+ ].
+ index == startIndex ifTrue:[
+ delIndex ~~ 0 ifTrue:[
+ ^ delIndex
+ ].
+ self grow.
+ length := keyArray basicSize.
+ startIndex := index := self initialIndexForKey:key.
+ ].
] loop.
"Modified: 30.1.1997 / 15:04:38 / cg"