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