WeakValueIdentityDictionary.st
author Claus Gittinger <cg@exept.de>
Tue, 09 Jul 2019 20:55:17 +0200
changeset 24417 03b083548da2
parent 23693 a8085d96ee91
permissions -rw-r--r--
#REFACTORING by exept class: Smalltalk class changed: #recursiveInstallAutoloadedClassesFrom:rememberIn:maxLevels:noAutoload:packageTop:showSplashInLevels: Transcript showCR:(... bindWith:...) -> Transcript showCR:... with:...
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
 COPYRIGHT (c) 1999 by eXept Software AG
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
              All Rights Reserved
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
 This software is furnished under a license and may be used
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 hereby transferred.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
"
19086
7d8bd3e1d3ae #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 9242
diff changeset
    12
"{ Package: 'stx:libbasic' }"
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
19086
7d8bd3e1d3ae #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 9242
diff changeset
    14
"{ NameSpace: Smalltalk }"
6233
0a79cbd07543 *** empty log message ***
martin
parents: 4350
diff changeset
    15
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
IdentityDictionary subclass:#WeakValueIdentityDictionary
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
	instanceVariableNames:''
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
	classVariableNames:''
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
	poolDictionaries:''
4350
5aa2a3b9fd5b category change
Claus Gittinger <cg@exept.de>
parents: 4347
diff changeset
    20
	category:'Collections-Weak'
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
!
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
!WeakValueIdentityDictionary class methodsFor:'documentation'!
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
copyright
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
 COPYRIGHT (c) 1999 by eXept Software AG
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
              All Rights Reserved
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
 This software is furnished under a license and may be used
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
 only in accordance with the terms of that license and with the
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
 inclusion of the above copyright notice.   This software may not
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
 be provided or otherwise made available to, or used by, any
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
 other person.  No title to or ownership of the software is
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
 hereby transferred.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
!
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
documentation
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
    WeakValueIdentityDictionaries behave like IdentityDictionaries, 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
    as long as the values are still referenced by some 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
    other (non-weak) object.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
    However, once the last non-weak reference ceases to exist,
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
    the Dictionary will return nil for the value at position key.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
    (with some delay: it will be removed after the next garbage collect).
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
    [Warning:]
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
      If you use this, be very careful since the collections size changes
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
      'magically' - for example, testing for being nonEmpty and then
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
      removing the first element may fail, since the element may vanish inbetween.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
      In general, never trust the value as returned by the size/isEmpty messages.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
    [author:]
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
        Claus (stolen from Stefans WeakValueDictionary)
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
    [See also:]
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
        WeakArray WeakIdentityDictionary WeakIdentitySet WeakValueDictionary
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
! !
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
!WeakValueIdentityDictionary methodsFor:'adding & removing'!
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
at:key put:anObject
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
    "add the argument anObject under key, aKey to the receiver.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
     Return anObject (sigh).
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
     Redefined to block interrupts, to avoid trouble when dependencies
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
     are added within interrupting high prio processes."
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
    |ret|
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
    (OperatingSystem blockInterrupts) ifTrue:[
19086
7d8bd3e1d3ae #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 9242
diff changeset
    74
        "/ already blocked
7d8bd3e1d3ae #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 9242
diff changeset
    75
        ^ super at:key put:anObject
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
    ].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
    [
19086
7d8bd3e1d3ae #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 9242
diff changeset
    79
        ret := super at:key put:anObject.
7d8bd3e1d3ae #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 9242
diff changeset
    80
    ] ensure:[
7d8bd3e1d3ae #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 9242
diff changeset
    81
        OperatingSystem unblockInterrupts
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
    ].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
    ^ ret
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
    "Modified: 6.5.1996 / 12:22:26 / stefan"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
    "Created: 6.5.1996 / 14:47:37 / stefan"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
    "Modified: 20.10.1996 / 14:05:04 / cg"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
!
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
removeKey:aKey ifAbsent:aBlock
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
    "remove the association under aKey from the collection,
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
     return the value previously stored there.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
     If it was not in the collection return the result 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
     from evaluating aBlock.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
    Redefined to avoid synchronization problems, in case
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
    of interrupts (otherwise, there could be some other operation 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
    on the receiver done by another process, which garbles my contents)."
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
    |ret|
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
    (OperatingSystem blockInterrupts) ifTrue:[
19086
7d8bd3e1d3ae #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 9242
diff changeset
   103
        "/ already blocked
7d8bd3e1d3ae #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 9242
diff changeset
   104
        ^ super removeKey:aKey ifAbsent:aBlock
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
    ].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
    [
19086
7d8bd3e1d3ae #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 9242
diff changeset
   108
        ret := super removeKey:aKey ifAbsent:aBlock
7d8bd3e1d3ae #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 9242
diff changeset
   109
    ] ensure:[
7d8bd3e1d3ae #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 9242
diff changeset
   110
        OperatingSystem unblockInterrupts
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
    ].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
    ^ ret
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
    "Modified: 6.5.1996 / 12:44:07 / stefan"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
    "Created: 6.5.1996 / 14:47:37 / stefan"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
!
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
removeValue:aKey ifAbsent:aBlock
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
    "remove the association under aValue from the collection,
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
     return the key previously stored there.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
     If it was not in the collection return the result 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
     from evaluating aBlock.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
    Redefined to avoid synchronization problems, in case
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
    of interrupts (otherwise, there could be some other operation 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
    on the receiver done by another process, which garbles my contents)."
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
    |ret|
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
    (OperatingSystem blockInterrupts) ifTrue:[
19086
7d8bd3e1d3ae #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 9242
diff changeset
   131
        "/ already blocked
7d8bd3e1d3ae #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 9242
diff changeset
   132
        ^ super removeValue:aKey ifAbsent:aBlock
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
    ].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
    [
19086
7d8bd3e1d3ae #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 9242
diff changeset
   136
        ret := super removeValue:aKey ifAbsent:aBlock
7d8bd3e1d3ae #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 9242
diff changeset
   137
    ] ensure:[
7d8bd3e1d3ae #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 9242
diff changeset
   138
        OperatingSystem unblockInterrupts
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
    ].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
    ^ ret.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
    "Created: 6.5.1996 / 14:47:37 / stefan"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
    "Modified: 8.5.1996 / 14:54:09 / stefan"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
! !
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
!WeakValueIdentityDictionary methodsFor:'element disposal'!
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
update:something with:aParameter from:changedObject
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
    "an element (either key or value) died - clear out slots for
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
     disposed keys."
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
    |wasBlocked|
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
    something == #ElementExpired ifTrue:[
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
        "
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
         have to block here - dispose may be done at a low priority
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
         from the background finalizer. If new items are added by a 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
         higher prio process, the dictionary might get corrupted otherwise
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
        "
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
        wasBlocked := OperatingSystem blockInterrupts.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
        keyArray 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
            forAllDeadIndicesDo:[:idx | 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
                                    valueArray basicAt:idx put:nil.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
                                    tally := tally - 1.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
                                ]
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
            replacingCorpsesWith:DeletedEntry.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
    ]
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
    "Created: 7.1.1997 / 16:59:30 / stefan"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
! !
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
!WeakValueIdentityDictionary methodsFor:'private'!
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
valueContainerOfSize:n
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
    "return a container for values of size n.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
     use WeakArrays here."
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
    |a|
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
    a := WeakArray new:n.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
    a addDependent:self.
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
    ^ a
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
    "Created: 6.5.1996 / 14:47:37 / stefan"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
! !
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
23693
a8085d96ee91 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 19544
diff changeset
   194
!WeakValueIdentityDictionary methodsFor:'queries'!
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
includes:anObject
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
    "redefined to block interrupts 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
     (avoid change of the dictionary while accessing)"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
    |val|
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
    (OperatingSystem blockInterrupts) ifTrue:[
19540
fe1b6939c296 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19086
diff changeset
   203
        "/ already blocked
fe1b6939c296 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19086
diff changeset
   204
        ^ super includes:anObject.
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
    ].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
    [
19540
fe1b6939c296 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19086
diff changeset
   208
        val := super includes:anObject.
fe1b6939c296 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19086
diff changeset
   209
    ] ensure:[
fe1b6939c296 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19086
diff changeset
   210
        OperatingSystem unblockInterrupts.
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
    ].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
    ^ val
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
    "Modified: 6.5.1996 / 12:22:26 / stefan"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
    "Modified: 1.7.1997 / 10:45:52 / cg"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
    "Created: 1.7.1997 / 15:41:14 / cg"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
!
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
includesKey:key
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
    "redefined to block interrupts 
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
     (avoid change of the dictionary while accessing)"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
    |val|
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
    (OperatingSystem blockInterrupts) ifTrue:[
19540
fe1b6939c296 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19086
diff changeset
   226
        "/ already blocked
fe1b6939c296 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19086
diff changeset
   227
        ^ super includesKey:key.
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
    ].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
    [
19540
fe1b6939c296 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19086
diff changeset
   231
        val := super includesKey:key.
fe1b6939c296 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19086
diff changeset
   232
    ] ensure:[
fe1b6939c296 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19086
diff changeset
   233
        OperatingSystem unblockInterrupts.
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
    ].
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
    ^ val
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
    "Modified: 6.5.1996 / 12:22:26 / stefan"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
    "Modified: 1.7.1997 / 10:45:52 / cg"
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
    "Created: 1.7.1997 / 15:41:32 / cg"
23693
a8085d96ee91 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 19544
diff changeset
   240
! !
a8085d96ee91 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 19544
diff changeset
   241
a8085d96ee91 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 19544
diff changeset
   242
!WeakValueIdentityDictionary methodsFor:'testing'!
9242
19e873fe5e21 +isWeakCollection
Claus Gittinger <cg@exept.de>
parents: 6233
diff changeset
   243
19e873fe5e21 +isWeakCollection
Claus Gittinger <cg@exept.de>
parents: 6233
diff changeset
   244
isWeakCollection
19e873fe5e21 +isWeakCollection
Claus Gittinger <cg@exept.de>
parents: 6233
diff changeset
   245
    "return true, if the receiver has weak references to its elements."
19e873fe5e21 +isWeakCollection
Claus Gittinger <cg@exept.de>
parents: 6233
diff changeset
   246
19e873fe5e21 +isWeakCollection
Claus Gittinger <cg@exept.de>
parents: 6233
diff changeset
   247
    ^ true
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
! !
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
!WeakValueIdentityDictionary class methodsFor:'documentation'!
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
version
19086
7d8bd3e1d3ae #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 9242
diff changeset
   253
    ^ '$Header$'
19544
92065f3083d5 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19540
diff changeset
   254
!
92065f3083d5 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19540
diff changeset
   255
92065f3083d5 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19540
diff changeset
   256
version_CVS
92065f3083d5 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 19540
diff changeset
   257
    ^ '$Header$'
4347
b7e45eadd0e0 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
! !
19086
7d8bd3e1d3ae #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 9242
diff changeset
   259