Set.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 22 Sep 2015 16:28:42 +0100
branchjv
changeset 18759 c1217211909c
parent 18473 ff8f0323cadd
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:
18221
5299a2514ed2 class: Set
Stefan Vogel <sv@exept.de>
parents: 17413
diff changeset
     1
"{ Encoding: utf8 }"
5299a2514ed2 class: Set
Stefan Vogel <sv@exept.de>
parents: 17413
diff changeset
     2
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     3
"
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
     4
 COPYRIGHT (c) 1991 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
     5
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
"
5471
a57eeb01c5ab General encoding method (#encodeOn:with:)
Stefan Vogel <sv@exept.de>
parents: 5335
diff changeset
    14
"{ Package: 'stx:libbasic' }"
a57eeb01c5ab General encoding method (#encodeOn:with:)
Stefan Vogel <sv@exept.de>
parents: 5335
diff changeset
    15
17263
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
    16
"{ NameSpace: Smalltalk }"
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
    17
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
Collection subclass:#Set
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
    19
	instanceVariableNames:'tally keyArray'
14314
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
    20
	classVariableNames:'DeletedEntry NilEntry'
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
    21
	poolDictionaries:''
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
    22
	category:'Collections-Unordered'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
2272
9942d9c853c3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2262
diff changeset
    25
Object subclass:#EmptySlot
2259
685b96fb41b6 a better deletedClass
Claus Gittinger <cg@exept.de>
parents: 1975
diff changeset
    26
	instanceVariableNames:''
4017
cdf103ce2e30 there can be only one EmptySlot
Claus Gittinger <cg@exept.de>
parents: 3726
diff changeset
    27
	classVariableNames:'TheOneAndOnlyInstance'
2259
685b96fb41b6 a better deletedClass
Claus Gittinger <cg@exept.de>
parents: 1975
diff changeset
    28
	poolDictionaries:''
685b96fb41b6 a better deletedClass
Claus Gittinger <cg@exept.de>
parents: 1975
diff changeset
    29
	privateIn:Set
685b96fb41b6 a better deletedClass
Claus Gittinger <cg@exept.de>
parents: 1975
diff changeset
    30
!
685b96fb41b6 a better deletedClass
Claus Gittinger <cg@exept.de>
parents: 1975
diff changeset
    31
14314
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
    32
Object subclass:#NilKey
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
    33
	instanceVariableNames:''
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
    34
	classVariableNames:'TheOneAndOnlyInstance'
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
    35
	poolDictionaries:''
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
    36
	privateIn:Set
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
    37
!
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
    38
2259
685b96fb41b6 a better deletedClass
Claus Gittinger <cg@exept.de>
parents: 1975
diff changeset
    39
!Set class methodsFor:'documentation'!
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    40
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    41
copyright
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    42
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    43
 COPYRIGHT (c) 1991 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
    44
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    45
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    46
 This software is furnished under a license and may be used
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    47
 only in accordance with the terms of that license and with the
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    48
 inclusion of the above copyright notice.   This software may not
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    49
 be provided or otherwise made available to, or used by, any
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    50
 other person.  No title to or ownership of the software is
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    51
 hereby transferred.
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    52
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    53
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    54
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    55
documentation
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    56
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    57
    a Set is a collection where each element occurs at most once.
14300
5b7ebcd0d2e0 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 14134
diff changeset
    58
    The inclusion test is done using equality (=) for comparison; 
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    59
    see IdentitySet for sets using identity compare.
6191
28ac2bdae9e9 comments;
Claus Gittinger <cg@exept.de>
parents: 6127
diff changeset
    60
    Keep in mind, that a regular Set therefore treats 3.0 and 3 as equal
28ac2bdae9e9 comments;
Claus Gittinger <cg@exept.de>
parents: 6127
diff changeset
    61
    and therefore:
14300
5b7ebcd0d2e0 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 14134
diff changeset
    62
        (Set with:3.0) includes:3
6191
28ac2bdae9e9 comments;
Claus Gittinger <cg@exept.de>
parents: 6127
diff changeset
    63
    will return true (since 3.0 and 3 are equal).
28ac2bdae9e9 comments;
Claus Gittinger <cg@exept.de>
parents: 6127
diff changeset
    64
    In contrast, an IdentitySet will return false, because 3.0 and 3 are not
28ac2bdae9e9 comments;
Claus Gittinger <cg@exept.de>
parents: 6127
diff changeset
    65
    identical.
28ac2bdae9e9 comments;
Claus Gittinger <cg@exept.de>
parents: 6127
diff changeset
    66
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    67
    Sets use hashing for fast access, this access is considerably faster,
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    68
    if a good hash-number is returned by the elements.
362
claus
parents: 359
diff changeset
    69
claus
parents: 359
diff changeset
    70
    Notice that the default hash (Object>>hash) is not perfect; due to
claus
parents: 359
diff changeset
    71
    the implementation of hash-keys in ST/X, increased hash collisions
claus
parents: 359
diff changeset
    72
    are to be expected for large sets (say: > 20000 element). 
claus
parents: 359
diff changeset
    73
    If your objects are heavyly used in sets or dictionaries, and you need
claus
parents: 359
diff changeset
    74
    big collections, your instances may provide a better hash values.
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    75
345
claus
parents: 324
diff changeset
    76
    Performance hints: 
657
449935f15b9e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 635
diff changeset
    77
      If only symbols or smallIntegers are used as keys, 
362
claus
parents: 359
diff changeset
    78
      use an instance of IdentitySet for slightly better performance, 
claus
parents: 359
diff changeset
    79
      since both hashing and comparison is faster.
345
claus
parents: 324
diff changeset
    80
claus
parents: 324
diff changeset
    81
      If you have a rough idea how big the set is going to grow,
claus
parents: 324
diff changeset
    82
      create it using #new: instead of #new. Even if the size given is a
claus
parents: 324
diff changeset
    83
      poor guess (say half of the real size), there is some 20-30% performance
14300
5b7ebcd0d2e0 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 14134
diff changeset
    84
      win to expect, since many resizing operations of the set are avoided
5b7ebcd0d2e0 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 14134
diff changeset
    85
      (resizing is expensive, as the set does a rehash).
345
claus
parents: 324
diff changeset
    86
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    87
    Examples:
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    88
14300
5b7ebcd0d2e0 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 14134
diff changeset
    89
        |s|
5b7ebcd0d2e0 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 14134
diff changeset
    90
        s := Set new.
5b7ebcd0d2e0 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 14134
diff changeset
    91
        s add:'hello'.
5b7ebcd0d2e0 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 14134
diff changeset
    92
        s add:'world'.
5b7ebcd0d2e0 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 14134
diff changeset
    93
        s add:#foo.
5b7ebcd0d2e0 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 14134
diff changeset
    94
        s add:1.2345678.
5b7ebcd0d2e0 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 14134
diff changeset
    95
        s add:'hello'.
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    96
14300
5b7ebcd0d2e0 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 14134
diff changeset
    97
        s printCR.
5b7ebcd0d2e0 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 14134
diff changeset
    98
        's size -> ' print. s size printCR.
5b7ebcd0d2e0 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 14134
diff changeset
    99
        '(s includes:''hello'') -> ' print. (s includes:'hello') printCR.
5b7ebcd0d2e0 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 14134
diff changeset
   100
        '(s includes:#foo)    -> ' print. (s includes:#foo) printCR.
5b7ebcd0d2e0 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 14134
diff changeset
   101
        '(s includes:''foo'')   -> ' print. (s includes:'foo') printCR.
5b7ebcd0d2e0 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 14134
diff changeset
   102
        '(s includes:#bar)    -> ' print. (s includes:#bar) printCR.
1290
15ba3221b89b documentation
Claus Gittinger <cg@exept.de>
parents: 1164
diff changeset
   103
15ba3221b89b documentation
Claus Gittinger <cg@exept.de>
parents: 1164
diff changeset
   104
    [author:]
14300
5b7ebcd0d2e0 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 14134
diff changeset
   105
        Claus Gittinger
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
   106
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
   107
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   108
2259
685b96fb41b6 a better deletedClass
Claus Gittinger <cg@exept.de>
parents: 1975
diff changeset
   109
!Set class methodsFor:'initialization'!
41
a14247b04d03 *** empty log message ***
claus
parents: 13
diff changeset
   110
a14247b04d03 *** empty log message ***
claus
parents: 13
diff changeset
   111
initialize
a14247b04d03 *** empty log message ***
claus
parents: 13
diff changeset
   112
    "initialize the Set class"
a14247b04d03 *** empty log message ***
claus
parents: 13
diff changeset
   113
a14247b04d03 *** empty log message ***
claus
parents: 13
diff changeset
   114
    DeletedEntry isNil ifTrue:[
14314
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
   115
        DeletedEntry := EmptySlot new.
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
   116
        NilEntry := NilKey new.
41
a14247b04d03 *** empty log message ***
claus
parents: 13
diff changeset
   117
    ].
a14247b04d03 *** empty log message ***
claus
parents: 13
diff changeset
   118
14314
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
   119
    "
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
   120
        Set initialize
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
   121
    "
2259
685b96fb41b6 a better deletedClass
Claus Gittinger <cg@exept.de>
parents: 1975
diff changeset
   122
685b96fb41b6 a better deletedClass
Claus Gittinger <cg@exept.de>
parents: 1975
diff changeset
   123
    "Modified: 24.1.1997 / 21:09:00 / cg"
41
a14247b04d03 *** empty log message ***
claus
parents: 13
diff changeset
   124
! !
a14247b04d03 *** empty log message ***
claus
parents: 13
diff changeset
   125
2259
685b96fb41b6 a better deletedClass
Claus Gittinger <cg@exept.de>
parents: 1975
diff changeset
   126
!Set class methodsFor:'instance creation'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   127
6083
98a14d57e673 added: literalArrayEncoding
tm
parents: 5845
diff changeset
   128
decodeFromLiteralArray:anArray
98a14d57e673 added: literalArrayEncoding
tm
parents: 5845
diff changeset
   129
    "create & return a new instance from information encoded in anArray."
98a14d57e673 added: literalArrayEncoding
tm
parents: 5845
diff changeset
   130
8831
918f291920c2 Speed up #decodeFromLiteralArray:
Stefan Vogel <sv@exept.de>
parents: 8606
diff changeset
   131
    |set 
918f291920c2 Speed up #decodeFromLiteralArray:
Stefan Vogel <sv@exept.de>
parents: 8606
diff changeset
   132
     sz "{ Class: SmallInteger }"|
6083
98a14d57e673 added: literalArrayEncoding
tm
parents: 5845
diff changeset
   133
8831
918f291920c2 Speed up #decodeFromLiteralArray:
Stefan Vogel <sv@exept.de>
parents: 8606
diff changeset
   134
    sz := anArray size.
918f291920c2 Speed up #decodeFromLiteralArray:
Stefan Vogel <sv@exept.de>
parents: 8606
diff changeset
   135
    set := self new:sz-1.
918f291920c2 Speed up #decodeFromLiteralArray:
Stefan Vogel <sv@exept.de>
parents: 8606
diff changeset
   136
    2 to:sz do:[:idx| set add:(anArray at:idx) decodeAsLiteralArray].
918f291920c2 Speed up #decodeFromLiteralArray:
Stefan Vogel <sv@exept.de>
parents: 8606
diff changeset
   137
    ^ set
6083
98a14d57e673 added: literalArrayEncoding
tm
parents: 5845
diff changeset
   138
98a14d57e673 added: literalArrayEncoding
tm
parents: 5845
diff changeset
   139
    "
98a14d57e673 added: literalArrayEncoding
tm
parents: 5845
diff changeset
   140
     (Set with:1234
8831
918f291920c2 Speed up #decodeFromLiteralArray:
Stefan Vogel <sv@exept.de>
parents: 8606
diff changeset
   141
          with:(1 @ 2)
918f291920c2 Speed up #decodeFromLiteralArray:
Stefan Vogel <sv@exept.de>
parents: 8606
diff changeset
   142
          with:'hello'
6083
98a14d57e673 added: literalArrayEncoding
tm
parents: 5845
diff changeset
   143
     ) literalArrayEncoding decodeAsLiteralArray    
98a14d57e673 added: literalArrayEncoding
tm
parents: 5845
diff changeset
   144
    "
98a14d57e673 added: literalArrayEncoding
tm
parents: 5845
diff changeset
   145
!
98a14d57e673 added: literalArrayEncoding
tm
parents: 5845
diff changeset
   146
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   147
new
a27a279701f8 Initial revision
claus
parents:
diff changeset
   148
    "return a new empty Set"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   149
a27a279701f8 Initial revision
claus
parents:
diff changeset
   150
    ^ self new:7
a27a279701f8 Initial revision
claus
parents:
diff changeset
   151
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   152
a27a279701f8 Initial revision
claus
parents:
diff changeset
   153
new:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   154
    "return a new empty Set with space for anInteger elements"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   155
159
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
   156
    "
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
   157
     make it somewhat bigger; hashing works better if fill grade is
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
   158
     below 10% (make it 75% here ..)
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
   159
    "
18331
521e3c40ea23 class: Set
Claus Gittinger <cg@exept.de>
parents: 18221
diff changeset
   160
    ^ self basicNew initializeForCapacity:(anInteger * 4 // 3)
159
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
   161
! !
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
   162
2259
685b96fb41b6 a better deletedClass
Claus Gittinger <cg@exept.de>
parents: 1975
diff changeset
   163
!Set class methodsFor:'queries'!
252
   164
   165
goodSizeFrom:arg 
   166
    "return a good array size for the given argument.
   167
     Returns the next prime after arg, since prime sizes are good for hashing."
   168
302
1f76060d58a4 *** empty log message ***
claus
parents: 252
diff changeset
   169
    |n|
1f76060d58a4 *** empty log message ***
claus
parents: 252
diff changeset
   170
2461
2d65e1845502 minimum goodSize reduced to 7.
Claus Gittinger <cg@exept.de>
parents: 2459
diff changeset
   171
    "/ arg <= 11 ifTrue:[^ 11].
2d65e1845502 minimum goodSize reduced to 7.
Claus Gittinger <cg@exept.de>
parents: 2459
diff changeset
   172
    "/ n := arg * 3 // 2.
252
   173
2461
2d65e1845502 minimum goodSize reduced to 7.
Claus Gittinger <cg@exept.de>
parents: 2459
diff changeset
   174
    arg <= 7 ifTrue:[^ 7].
2d65e1845502 minimum goodSize reduced to 7.
Claus Gittinger <cg@exept.de>
parents: 2459
diff changeset
   175
    n := arg.
302
1f76060d58a4 *** empty log message ***
claus
parents: 252
diff changeset
   176
252
   177
    "
   178
     mhmh - this returns good numbers for collections with up-to about
   179
     500k elements; if you have bigger ones, add some more primes here ...
   180
    "
302
1f76060d58a4 *** empty log message ***
claus
parents: 252
diff changeset
   181
    n <= 524288 ifTrue:[
9318
42d7dac12b73 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9310
diff changeset
   182
           "2  4  8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288"
42d7dac12b73 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9310
diff changeset
   183
        ^ #(7  7 11 17 37 67 131 257 521 1031 2053 4099 8209 16411 32771 65537 131101 262147 524309) at:(n highBit)
252
   184
    ].
2461
2d65e1845502 minimum goodSize reduced to 7.
Claus Gittinger <cg@exept.de>
parents: 2459
diff changeset
   185
9318
42d7dac12b73 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9310
diff changeset
   186
    ^ n nextPrime
252
   187
! !
   188
3048
88c3a9c669e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2475
diff changeset
   189
!Set class methodsFor:'utilities'!
88c3a9c669e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2475
diff changeset
   190
88c3a9c669e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2475
diff changeset
   191
rehashAllSubInstances
88c3a9c669e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2475
diff changeset
   192
    "rehash all sets & dictionaries.
88c3a9c669e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2475
diff changeset
   193
     Useful utility if hash/identityHash method was changed
88c3a9c669e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2475
diff changeset
   194
     of some object which is known to be kept in a set"
88c3a9c669e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2475
diff changeset
   195
88c3a9c669e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2475
diff changeset
   196
     self allSubInstances do:[:s | s rehash]
88c3a9c669e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2475
diff changeset
   197
88c3a9c669e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2475
diff changeset
   198
    "
88c3a9c669e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2475
diff changeset
   199
     Set rehashAllSubInstances
88c3a9c669e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2475
diff changeset
   200
    "
88c3a9c669e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2475
diff changeset
   201
88c3a9c669e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2475
diff changeset
   202
    "Created: / 24.10.1997 / 23:13:44 / cg"
88c3a9c669e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2475
diff changeset
   203
! !
88c3a9c669e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2475
diff changeset
   204
7268
4a2b7acd6913 method category rename
Claus Gittinger <cg@exept.de>
parents: 7260
diff changeset
   205
!Set methodsFor:'Compatibility-ST80'!
6991
e95313d7c780 comment and category change only
Claus Gittinger <cg@exept.de>
parents: 6917
diff changeset
   206
e95313d7c780 comment and category change only
Claus Gittinger <cg@exept.de>
parents: 6917
diff changeset
   207
initialIndexFor:hashKey boundedBy:length
e95313d7c780 comment and category change only
Claus Gittinger <cg@exept.de>
parents: 6917
diff changeset
   208
    "for ST-80 compatibility only; it is (currently) not used in this
e95313d7c780 comment and category change only
Claus Gittinger <cg@exept.de>
parents: 6917
diff changeset
   209
     implementation of sets. Therefore, in ST/X it does not make sense
e95313d7c780 comment and category change only
Claus Gittinger <cg@exept.de>
parents: 6917
diff changeset
   210
     to redefine it. (which may be a bad design decision, but slightly
e95313d7c780 comment and category change only
Claus Gittinger <cg@exept.de>
parents: 6917
diff changeset
   211
     improves performance, by avoiding an extra message send ...)"
e95313d7c780 comment and category change only
Claus Gittinger <cg@exept.de>
parents: 6917
diff changeset
   212
e95313d7c780 comment and category change only
Claus Gittinger <cg@exept.de>
parents: 6917
diff changeset
   213
    |index "{ Class:SmallInteger }"|
e95313d7c780 comment and category change only
Claus Gittinger <cg@exept.de>
parents: 6917
diff changeset
   214
e95313d7c780 comment and category change only
Claus Gittinger <cg@exept.de>
parents: 6917
diff changeset
   215
    index := hashKey bitAnd:16r3FFFFFFF.
e95313d7c780 comment and category change only
Claus Gittinger <cg@exept.de>
parents: 6917
diff changeset
   216
    index < 16r1FFFFFFF ifTrue:[
6994
0f08c1d8c2ac Remove unused method var
Stefan Vogel <sv@exept.de>
parents: 6991
diff changeset
   217
	index := index * 2
6991
e95313d7c780 comment and category change only
Claus Gittinger <cg@exept.de>
parents: 6917
diff changeset
   218
    ].
e95313d7c780 comment and category change only
Claus Gittinger <cg@exept.de>
parents: 6917
diff changeset
   219
    index := index \\ length + 1.
e95313d7c780 comment and category change only
Claus Gittinger <cg@exept.de>
parents: 6917
diff changeset
   220
    ^ index.
e95313d7c780 comment and category change only
Claus Gittinger <cg@exept.de>
parents: 6917
diff changeset
   221
e95313d7c780 comment and category change only
Claus Gittinger <cg@exept.de>
parents: 6917
diff changeset
   222
    "Modified: 1.3.1997 / 01:01:13 / cg"
e95313d7c780 comment and category change only
Claus Gittinger <cg@exept.de>
parents: 6917
diff changeset
   223
! !
e95313d7c780 comment and category change only
Claus Gittinger <cg@exept.de>
parents: 6917
diff changeset
   224
7311
6878116b0a27 +copyWithout/copyWithoutAll:
Claus Gittinger <cg@exept.de>
parents: 7268
diff changeset
   225
!Set methodsFor:'Compatibility-Squeak'!
6878116b0a27 +copyWithout/copyWithoutAll:
Claus Gittinger <cg@exept.de>
parents: 7268
diff changeset
   226
11052
0c44bf26275c comment
Claus Gittinger <cg@exept.de>
parents: 10868
diff changeset
   227
copyWithout:elementToSkip
0c44bf26275c comment
Claus Gittinger <cg@exept.de>
parents: 10868
diff changeset
   228
    "return a new collection consisting of a copy of the receiver, with
0c44bf26275c comment
Claus Gittinger <cg@exept.de>
parents: 10868
diff changeset
   229
     ALL elements equal to elementToSkip are left out.
0c44bf26275c comment
Claus Gittinger <cg@exept.de>
parents: 10868
diff changeset
   230
     No error is reported, if elementToSkip is not in the collection."
0c44bf26275c comment
Claus Gittinger <cg@exept.de>
parents: 10868
diff changeset
   231
0c44bf26275c comment
Claus Gittinger <cg@exept.de>
parents: 10868
diff changeset
   232
    ^ self select:[:each | each ~= elementToSkip]
7311
6878116b0a27 +copyWithout/copyWithoutAll:
Claus Gittinger <cg@exept.de>
parents: 7268
diff changeset
   233
6878116b0a27 +copyWithout/copyWithoutAll:
Claus Gittinger <cg@exept.de>
parents: 7268
diff changeset
   234
    "
6878116b0a27 +copyWithout/copyWithoutAll:
Claus Gittinger <cg@exept.de>
parents: 7268
diff changeset
   235
     #(1 2 3 4 5 6 7) asSet copyWithout:5
6878116b0a27 +copyWithout/copyWithoutAll:
Claus Gittinger <cg@exept.de>
parents: 7268
diff changeset
   236
    "
6878116b0a27 +copyWithout/copyWithoutAll:
Claus Gittinger <cg@exept.de>
parents: 7268
diff changeset
   237
!
6878116b0a27 +copyWithout/copyWithoutAll:
Claus Gittinger <cg@exept.de>
parents: 7268
diff changeset
   238
14019
9b08cdb0db50 changed: #copyWithoutAll:
Stefan Vogel <sv@exept.de>
parents: 14017
diff changeset
   239
copyWithoutAll:elementsToSkip
9b08cdb0db50 changed: #copyWithoutAll:
Stefan Vogel <sv@exept.de>
parents: 14017
diff changeset
   240
    "return a new collection consisting of a copy of the receiver, with
9b08cdb0db50 changed: #copyWithoutAll:
Stefan Vogel <sv@exept.de>
parents: 14017
diff changeset
   241
     ALL elements equal to elementToSkip are left out.
9b08cdb0db50 changed: #copyWithoutAll:
Stefan Vogel <sv@exept.de>
parents: 14017
diff changeset
   242
     No error is reported, if elementsToSkip is not in the collection."
9b08cdb0db50 changed: #copyWithoutAll:
Stefan Vogel <sv@exept.de>
parents: 14017
diff changeset
   243
9b08cdb0db50 changed: #copyWithoutAll:
Stefan Vogel <sv@exept.de>
parents: 14017
diff changeset
   244
    elementsToSkip size * self size > 10000 ifTrue:[
9b08cdb0db50 changed: #copyWithoutAll:
Stefan Vogel <sv@exept.de>
parents: 14017
diff changeset
   245
        "speed up everything"
9b08cdb0db50 changed: #copyWithoutAll:
Stefan Vogel <sv@exept.de>
parents: 14017
diff changeset
   246
        ^ self \ (elementsToSkip asSet).
9b08cdb0db50 changed: #copyWithoutAll:
Stefan Vogel <sv@exept.de>
parents: 14017
diff changeset
   247
    ].
9b08cdb0db50 changed: #copyWithoutAll:
Stefan Vogel <sv@exept.de>
parents: 14017
diff changeset
   248
    ^ self \ elementsToSkip
7311
6878116b0a27 +copyWithout/copyWithoutAll:
Claus Gittinger <cg@exept.de>
parents: 7268
diff changeset
   249
6878116b0a27 +copyWithout/copyWithoutAll:
Claus Gittinger <cg@exept.de>
parents: 7268
diff changeset
   250
    "
6878116b0a27 +copyWithout/copyWithoutAll:
Claus Gittinger <cg@exept.de>
parents: 7268
diff changeset
   251
     #(1 2 3 4 5 6 7) asSet copyWithoutAll:#(3 5 7 9)
14019
9b08cdb0db50 changed: #copyWithoutAll:
Stefan Vogel <sv@exept.de>
parents: 14017
diff changeset
   252
     #(a b c d e f) asIdentitySet copyWithoutAll:#(d e f)
9b08cdb0db50 changed: #copyWithoutAll:
Stefan Vogel <sv@exept.de>
parents: 14017
diff changeset
   253
     #('a' 'b' 'c' 'd' 'e' 'f') asIdentitySet copyWithoutAll:#('d' 'e' 'f')
9b08cdb0db50 changed: #copyWithoutAll:
Stefan Vogel <sv@exept.de>
parents: 14017
diff changeset
   254
     #('a' 'b' 'c' 'd' 'e' 'f') asSet copyWithoutAll:#('d' 'e' 'f')
7311
6878116b0a27 +copyWithout/copyWithoutAll:
Claus Gittinger <cg@exept.de>
parents: 7268
diff changeset
   255
    "
12342
10c0bdcf6c37 added: #like:
Claus Gittinger <cg@exept.de>
parents: 11472
diff changeset
   256
!
10c0bdcf6c37 added: #like:
Claus Gittinger <cg@exept.de>
parents: 11472
diff changeset
   257
10c0bdcf6c37 added: #like:
Claus Gittinger <cg@exept.de>
parents: 11472
diff changeset
   258
like:anObject
10c0bdcf6c37 added: #like:
Claus Gittinger <cg@exept.de>
parents: 11472
diff changeset
   259
    "Answer an object in the receiver that is equal to anObject,
10c0bdcf6c37 added: #like:
Claus Gittinger <cg@exept.de>
parents: 11472
diff changeset
   260
     nil if no such object is found. 
10c0bdcf6c37 added: #like:
Claus Gittinger <cg@exept.de>
parents: 11472
diff changeset
   261
     Relies heavily on hash properties (i.e. that two object's hashes are equal
10c0bdcf6c37 added: #like:
Claus Gittinger <cg@exept.de>
parents: 11472
diff changeset
   262
     if the two object compare equal)"
10c0bdcf6c37 added: #like:
Claus Gittinger <cg@exept.de>
parents: 11472
diff changeset
   263
10c0bdcf6c37 added: #like:
Claus Gittinger <cg@exept.de>
parents: 11472
diff changeset
   264
    ^ self elementAt:anObject ifAbsent:[ nil ]
10c0bdcf6c37 added: #like:
Claus Gittinger <cg@exept.de>
parents: 11472
diff changeset
   265
10c0bdcf6c37 added: #like:
Claus Gittinger <cg@exept.de>
parents: 11472
diff changeset
   266
    "
10c0bdcf6c37 added: #like:
Claus Gittinger <cg@exept.de>
parents: 11472
diff changeset
   267
     (Set withAll:#(10.0 20.0 30.0 40.0)) like:20
10c0bdcf6c37 added: #like:
Claus Gittinger <cg@exept.de>
parents: 11472
diff changeset
   268
    "
7311
6878116b0a27 +copyWithout/copyWithoutAll:
Claus Gittinger <cg@exept.de>
parents: 7268
diff changeset
   269
! !
6878116b0a27 +copyWithout/copyWithoutAll:
Claus Gittinger <cg@exept.de>
parents: 7268
diff changeset
   270
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   271
!Set methodsFor:'accessing'!
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   272
12734
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   273
addFirst:anObject
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   274
    "add the argument, anObject to the receiver.
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   275
     If the receiver is ordered, the new element will be added at the beginning.
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   276
     An error is raised here - it does not make sense for unordered collections"
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   277
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   278
    ^ self shouldNotImplement
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   279
!
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   280
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   281
at:index
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   282
    "report an error: at: is not allowed for Sets"
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   283
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   284
    ^ self errorNotKeyed
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   285
!
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   286
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   287
at:index put:anObject
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   288
    "report an error: at:put: is not allowed for Sets"
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   289
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   290
    ^ self errorNotKeyed
2469
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   291
!
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   292
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   293
elementAt:anObject
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   294
    "return the element, if contained in the set.
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   295
     If there is none, report an error.
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   296
     This may seem confusing at first - however, it is useful with
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   297
     non-identitysets, to find an existing element, for a 
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   298
     given equal (but not identical) object.
12342
10c0bdcf6c37 added: #like:
Claus Gittinger <cg@exept.de>
parents: 11472
diff changeset
   299
     This is the same functionality as provided by the goodies/KeyedSet goody."
2469
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   300
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   301
    ^ self elementAt:anObject ifAbsent:[^ self errorNotFound].
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   302
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   303
    "Modified: 20.3.1997 / 20:35:24 / cg"
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   304
!
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   305
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   306
elementAt:anObject ifAbsent:exceptionBlock
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   307
    "return the element, if contained in the set.
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   308
     If there is none, return the result from evaluating exceptionBlock.
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   309
     This may seem confusing at first - however, it is useful with
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   310
     non-identitysets, to find an existing element, for a 
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   311
     given equal (but not identical) object.
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   312
     This is the same functionality as provided by the goodies/KeyedSet
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   313
     goody."
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   314
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   315
    |index "{ Class: SmallInteger }"  ret|
2469
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   316
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   317
    index := self find:(anObject ? NilEntry)ifAbsent:0.
2469
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   318
    index == 0 ifTrue:[
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   319
        ^ exceptionBlock value
2469
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   320
    ].
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   321
    ret := keyArray basicAt:index.
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   322
    ret == NilEntry ifTrue:[
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   323
        ret := nil.
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   324
    ].
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   325
    ^ ret.
2469
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   326
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   327
    "Created: 20.3.1997 / 20:34:07 / cg"
ecca86d50852 added #elementAt: / #elementAt:ifAbsent:
Claus Gittinger <cg@exept.de>
parents: 2461
diff changeset
   328
    "Modified: 20.3.1997 / 20:35:49 / cg"
12734
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   329
!
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   330
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   331
removeLast
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   332
    "remove the last element from the receiver.
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   333
     Return the removed element.
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   334
     An error is raised here - it does not make sense for unordered collections"
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   335
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   336
    ^ self shouldNotImplement
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   337
!
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   338
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   339
reverseDo:aBlock
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   340
    "evaluate the argument, aBlock for each element in reverse order.
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   341
     An error is raised here - it does not make sense for unordered collections"
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   342
Claus Gittinger <cg@exept.de>
parents: 12342
diff changeset
   343
    ^ self shouldNotImplement
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   344
! !
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   345
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   346
!Set methodsFor:'adding & removing'!
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   347
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   348
add:keyArg
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   349
    "add the argument, anObject to the receiver.
14895
1112f18b10d1 comment/format in: #add:
Claus Gittinger <cg@exept.de>
parents: 14656
diff changeset
   350
     Return the added element.
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   351
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   352
     WARNING: do not add elements while iterating over the receiver.
10868
0f72216e1c1d *** empty log message ***
sr
parents: 10588
diff changeset
   353
              Iterate over a copy to do this."
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   354
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   355
    |key index "{ Class: SmallInteger }"|
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   356
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   357
    keyArg isNil ifTrue:[
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   358
        key := NilEntry.
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   359
    ] ifFalse:[
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   360
        key := keyArg.
5335
fae7e0698241 added a warning: adding nil will soon be an error.
Claus Gittinger <cg@exept.de>
parents: 5298
diff changeset
   361
    ].
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   362
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   363
    index := self findKeyOrNil:key.
5335
fae7e0698241 added a warning: adding nil will soon be an error.
Claus Gittinger <cg@exept.de>
parents: 5298
diff changeset
   364
    (keyArray basicAt:index) isNil ifTrue:[
10868
0f72216e1c1d *** empty log message ***
sr
parents: 10588
diff changeset
   365
        "/ not already there
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   366
        keyArray basicAt:index put:key.
10868
0f72216e1c1d *** empty log message ***
sr
parents: 10588
diff changeset
   367
        tally := tally + 1.
5335
fae7e0698241 added a warning: adding nil will soon be an error.
Claus Gittinger <cg@exept.de>
parents: 5298
diff changeset
   368
17263
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
   369
        self possiblyGrow.
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   370
    ].
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   371
    ^ keyArg
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   372
2328
0fd1d715e5a9 oops - the last one was not good
Claus Gittinger <cg@exept.de>
parents: 2323
diff changeset
   373
    "Modified: 30.1.1997 / 14:58:08 / cg"
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   374
!
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   375
17410
9c4592a7b540 class: Set
Stefan Vogel <sv@exept.de>
parents: 17263
diff changeset
   376
clearContents
9c4592a7b540 class: Set
Stefan Vogel <sv@exept.de>
parents: 17263
diff changeset
   377
    "remove all elements from the receiver, but do not resize.
9c4592a7b540 class: Set
Stefan Vogel <sv@exept.de>
parents: 17263
diff changeset
   378
     Returns the receiver."
9c4592a7b540 class: Set
Stefan Vogel <sv@exept.de>
parents: 17263
diff changeset
   379
9c4592a7b540 class: Set
Stefan Vogel <sv@exept.de>
parents: 17263
diff changeset
   380
    keyArray atAllPut:nil.
17413
8048855efc47 class: Set
Stefan Vogel <sv@exept.de>
parents: 17410
diff changeset
   381
    tally := 0.
17410
9c4592a7b540 class: Set
Stefan Vogel <sv@exept.de>
parents: 17263
diff changeset
   382
!
9c4592a7b540 class: Set
Stefan Vogel <sv@exept.de>
parents: 17263
diff changeset
   383
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   384
remove:oldObjectArg ifAbsent:exceptionBlock
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   385
    "remove oldObject from the collection and return it.
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   386
     If it was not in the collection return the value of exceptionBlock.
6191
28ac2bdae9e9 comments;
Claus Gittinger <cg@exept.de>
parents: 6127
diff changeset
   387
     Notice, that the returned object could be non-identical to the argument
28ac2bdae9e9 comments;
Claus Gittinger <cg@exept.de>
parents: 6127
diff changeset
   388
     (although it will always be equal).
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   389
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   390
     WARNING: do not remove elements while iterating over the receiver.
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   391
              See #saveRemove: to do this."
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   392
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   393
    |oldObject index next removedObject|
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   394
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   395
    oldObjectArg isNil ifTrue:[
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   396
        oldObject := NilEntry.
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   397
    ] ifFalse:[
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   398
        oldObject := oldObjectArg.
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   399
    ].
3265
18d96c910653 handle attempt to remove nil.
Claus Gittinger <cg@exept.de>
parents: 3261
diff changeset
   400
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   401
    index := self find:oldObject ifAbsent:0.
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   402
    index == 0 ifTrue:[^ exceptionBlock value].
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   403
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   404
    removedObject := keyArray basicAt:index.
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   405
    keyArray basicAt:index put:nil.
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   406
    tally := tally - 1.
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   407
    tally == 0 ifTrue:[
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   408
        keyArray := self keyContainerOfSize:(self class goodSizeFrom:0). 
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   409
    ] ifFalse:[
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   410
        index == keyArray basicSize ifTrue:[
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   411
            next := 1
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   412
        ] ifFalse:[
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   413
            next := index + 1.
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   414
        ].
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   415
        (keyArray basicAt:next) notNil ifTrue:[
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   416
            keyArray basicAt:index put:DeletedEntry.
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   417
        ].
17263
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
   418
        self possiblyShrink
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   419
    ].
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   420
    removedObject == NilEntry ifTrue:[
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   421
        removedObject := nil.
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   422
    ].
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   423
    ^ removedObject
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   424
6191
28ac2bdae9e9 comments;
Claus Gittinger <cg@exept.de>
parents: 6127
diff changeset
   425
    "Modified: / 16.11.2001 / 10:14:24 / cg"
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   426
!
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   427
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   428
removeAll
1164
38c54a4f1273 commentary
Claus Gittinger <cg@exept.de>
parents: 1144
diff changeset
   429
    "remove all elements from the receiver. Returns the receiver."
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   430
18331
521e3c40ea23 class: Set
Claus Gittinger <cg@exept.de>
parents: 18221
diff changeset
   431
    self initializeForCapacity:7.
1164
38c54a4f1273 commentary
Claus Gittinger <cg@exept.de>
parents: 1144
diff changeset
   432
38c54a4f1273 commentary
Claus Gittinger <cg@exept.de>
parents: 1144
diff changeset
   433
    "Modified: 12.4.1996 / 13:35:06 / cg"
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   434
!
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   435
15806
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   436
removeIdentical:oldObjectArg ifAbsent:exceptionBlock
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   437
    "remove oldObject from the collection and return it.
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   438
     If it was not in the collection return the value of exceptionBlock.
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   439
     Uses identity compare (==) to search for an occurrence.
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   440
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   441
     WARNING: do not remove elements while iterating over the receiver.
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   442
              See #saveRemove: to do this."
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   443
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   444
    |oldObject index next|
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   445
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   446
    oldObjectArg isNil ifTrue:[
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   447
        oldObject := NilEntry.
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   448
    ] ifFalse:[
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   449
        oldObject := oldObjectArg.
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   450
    ].
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   451
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   452
    "first a quick check. 
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   453
     There is a high possibility that objects, which are
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   454
     equal are also identical"
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   455
    index := self find:oldObject ifAbsent:0.
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   456
    index ~~ 0 ifTrue:[
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   457
        oldObject ~~ (keyArray basicAt:index) ifTrue:[
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   458
            index := 0.
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   459
        ]
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   460
    ].
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   461
    index == 0 ifTrue:[
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   462
        "have to go the long and hard path..."
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   463
        index := self findIdentical:oldObject ifAbsent:0.
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   464
        index == 0 ifTrue:[^ exceptionBlock value].
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   465
    ].
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   466
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   467
    keyArray basicAt:index put:nil.
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   468
    tally := tally - 1.
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   469
    tally == 0 ifTrue:[
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   470
        keyArray := self keyContainerOfSize:(self class goodSizeFrom:0). 
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   471
    ] ifFalse:[
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   472
        index == keyArray basicSize ifTrue:[
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   473
            next := 1
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   474
        ] ifFalse:[
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   475
            next := index + 1.
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   476
        ].
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   477
        (keyArray basicAt:next) notNil ifTrue:[
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   478
            keyArray basicAt:index put:DeletedEntry.
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   479
        ].
17263
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
   480
        self possiblyShrink
15806
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   481
    ].
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   482
    ^ oldObjectArg
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   483
!
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   484
16515
6641d9cd92a6 class: Set
Stefan Vogel <sv@exept.de>
parents: 16241
diff changeset
   485
safeRemove:oldObject 
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   486
    "remove the element, oldObject from the collection.
6191
28ac2bdae9e9 comments;
Claus Gittinger <cg@exept.de>
parents: 6127
diff changeset
   487
     Return the element 
28ac2bdae9e9 comments;
Claus Gittinger <cg@exept.de>
parents: 6127
diff changeset
   488
     (could be non-identical to oldObject, since I hash on equality, not on identity).
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   489
     If it was not in the collection return nil.
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   490
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   491
     In contrast to #remove:, this does not resize the underlying collection
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   492
     and therefore does NOT rehash & change the elements order.
14319
9edc09830441 added: #saveRemove:ifAbsent:
Stefan Vogel <sv@exept.de>
parents: 14315
diff changeset
   493
     Therefor this can be used while enumerating the receiver,
9edc09830441 added: #saveRemove:ifAbsent:
Stefan Vogel <sv@exept.de>
parents: 14315
diff changeset
   494
     which is not possible if #remove: is used.
9edc09830441 added: #saveRemove:ifAbsent:
Stefan Vogel <sv@exept.de>
parents: 14315
diff changeset
   495
9edc09830441 added: #saveRemove:ifAbsent:
Stefan Vogel <sv@exept.de>
parents: 14315
diff changeset
   496
     WARNING: since no resizing is done, the physical amount of memory used
9edc09830441 added: #saveRemove:ifAbsent:
Stefan Vogel <sv@exept.de>
parents: 14315
diff changeset
   497
              by the container remains the same, although the logical size shrinks.
9edc09830441 added: #saveRemove:ifAbsent:
Stefan Vogel <sv@exept.de>
parents: 14315
diff changeset
   498
              You may want to manually resize the receiver using #emptyCheck.
9edc09830441 added: #saveRemove:ifAbsent:
Stefan Vogel <sv@exept.de>
parents: 14315
diff changeset
   499
              (after the loop)"
9edc09830441 added: #saveRemove:ifAbsent:
Stefan Vogel <sv@exept.de>
parents: 14315
diff changeset
   500
16515
6641d9cd92a6 class: Set
Stefan Vogel <sv@exept.de>
parents: 16241
diff changeset
   501
    ^ self safeRemove:oldObject ifAbsent:[].
14319
9edc09830441 added: #saveRemove:ifAbsent:
Stefan Vogel <sv@exept.de>
parents: 14315
diff changeset
   502
9edc09830441 added: #saveRemove:ifAbsent:
Stefan Vogel <sv@exept.de>
parents: 14315
diff changeset
   503
    "Created: / 16.11.2001 / 10:23:48 / cg"
9edc09830441 added: #saveRemove:ifAbsent:
Stefan Vogel <sv@exept.de>
parents: 14315
diff changeset
   504
    "Modified: / 16.11.2001 / 10:24:03 / cg"
9edc09830441 added: #saveRemove:ifAbsent:
Stefan Vogel <sv@exept.de>
parents: 14315
diff changeset
   505
!
9edc09830441 added: #saveRemove:ifAbsent:
Stefan Vogel <sv@exept.de>
parents: 14315
diff changeset
   506
16515
6641d9cd92a6 class: Set
Stefan Vogel <sv@exept.de>
parents: 16241
diff changeset
   507
safeRemove:oldObjectArg ifAbsent:exceptionValueProvider
14319
9edc09830441 added: #saveRemove:ifAbsent:
Stefan Vogel <sv@exept.de>
parents: 14315
diff changeset
   508
    "remove the element, oldObject from the collection.
9edc09830441 added: #saveRemove:ifAbsent:
Stefan Vogel <sv@exept.de>
parents: 14315
diff changeset
   509
     Return the element 
9edc09830441 added: #saveRemove:ifAbsent:
Stefan Vogel <sv@exept.de>
parents: 14315
diff changeset
   510
     (could be non-identical to oldObject, since I hash on equality, not on identity).
9edc09830441 added: #saveRemove:ifAbsent:
Stefan Vogel <sv@exept.de>
parents: 14315
diff changeset
   511
     If it was not in the collection return the value of exceptionValueProvider.
9edc09830441 added: #saveRemove:ifAbsent:
Stefan Vogel <sv@exept.de>
parents: 14315
diff changeset
   512
9edc09830441 added: #saveRemove:ifAbsent:
Stefan Vogel <sv@exept.de>
parents: 14315
diff changeset
   513
     In contrast to #remove:, this does not resize the underlying collection
9edc09830441 added: #saveRemove:ifAbsent:
Stefan Vogel <sv@exept.de>
parents: 14315
diff changeset
   514
     and therefore does NOT rehash & change the elements order.
12963
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   515
     Therefore this can be used while enumerating the receiver,
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   516
     which is not possible if #remove: is used.
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   517
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   518
     WARNING: since no resizing is done, the physical amount of memory used
12963
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   519
              by the container remains the same, although the logical size shrinks.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   520
              You may want to manually resize the receiver using #emptyCheck.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   521
              (after the loop)"
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   522
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   523
    |oldObject
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   524
     index "{ Class:SmallInteger }"
6191
28ac2bdae9e9 comments;
Claus Gittinger <cg@exept.de>
parents: 6127
diff changeset
   525
     next  "{ Class:SmallInteger }"
28ac2bdae9e9 comments;
Claus Gittinger <cg@exept.de>
parents: 6127
diff changeset
   526
     removedObject|
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   527
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   528
    oldObjectArg isNil ifTrue:[
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   529
        oldObject := NilEntry.
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   530
    ] ifFalse:[
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   531
        oldObject := oldObjectArg.
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   532
    ].
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   533
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   534
    index := self find:oldObject ifAbsent:0.
14319
9edc09830441 added: #saveRemove:ifAbsent:
Stefan Vogel <sv@exept.de>
parents: 14315
diff changeset
   535
    index == 0 ifTrue:[^ exceptionValueProvider value].
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   536
6191
28ac2bdae9e9 comments;
Claus Gittinger <cg@exept.de>
parents: 6127
diff changeset
   537
    removedObject := keyArray basicAt:index.
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   538
    keyArray basicAt:index put:nil.
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   539
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   540
    tally := tally - 1.
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   541
    tally ~~ 0 ifTrue:[
12963
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   542
        index == keyArray basicSize ifTrue:[
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   543
            next := 1
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   544
        ] ifFalse:[
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   545
            next := index + 1.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   546
        ].
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   547
        (keyArray basicAt:next) notNil ifTrue:[
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   548
            keyArray basicAt:index put:DeletedEntry
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   549
        ].
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   550
    ].
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   551
    removedObject == NilEntry ifTrue:[
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   552
        removedObject := nil.
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   553
    ].
6191
28ac2bdae9e9 comments;
Claus Gittinger <cg@exept.de>
parents: 6127
diff changeset
   554
    ^ removedObject
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   555
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   556
    "does NOT work:
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   557
12963
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   558
        |s|
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   559
12963
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   560
        s := Set new.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   561
        s add:1.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   562
        s add:2.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   563
        s add:3.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   564
        s add:4.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   565
        s add:5.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   566
        s add:6.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   567
        s add:7.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   568
        s add:8.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   569
        s add:9.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   570
        s do:[:v |
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   571
            v odd ifTrue:[
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   572
                s remove:v 
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   573
            ]
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   574
        ].
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   575
        s inspect
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   576
    "
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   577
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   578
    "DOES work:
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   579
12963
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   580
        |s|
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   581
12963
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   582
        s := Set new.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   583
        s add:1.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   584
        s add:2.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   585
        s add:3.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   586
        s add:4.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   587
        s add:5.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   588
        s add:6.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   589
        s add:7.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   590
        s add:8.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   591
        s add:9.
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   592
        s do:[:v |
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   593
            v odd ifTrue:[
16515
6641d9cd92a6 class: Set
Stefan Vogel <sv@exept.de>
parents: 16241
diff changeset
   594
                s safeRemove:v 
12963
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   595
            ]
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   596
        ].
8ff7dc77ce1d added: #addAllNonNilElements:
Stefan Vogel <sv@exept.de>
parents: 12734
diff changeset
   597
        s inspect
1052
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   598
    "
7d43187f7e11 added saveRemove: & commentaries
Claus Gittinger <cg@exept.de>
parents: 969
diff changeset
   599
6191
28ac2bdae9e9 comments;
Claus Gittinger <cg@exept.de>
parents: 6127
diff changeset
   600
    "Created: / 1.3.1996 / 21:14:26 / cg"
28ac2bdae9e9 comments;
Claus Gittinger <cg@exept.de>
parents: 6127
diff changeset
   601
    "Modified: / 16.11.2001 / 10:22:59 / cg"
10588
7043b70ff150 New: #testAndAdd:
Stefan Vogel <sv@exept.de>
parents: 10090
diff changeset
   602
!
7043b70ff150 New: #testAndAdd:
Stefan Vogel <sv@exept.de>
parents: 10090
diff changeset
   603
16515
6641d9cd92a6 class: Set
Stefan Vogel <sv@exept.de>
parents: 16241
diff changeset
   604
saveRemove:oldObject 
6641d9cd92a6 class: Set
Stefan Vogel <sv@exept.de>
parents: 16241
diff changeset
   605
    <resource: #obsolete>
6641d9cd92a6 class: Set
Stefan Vogel <sv@exept.de>
parents: 16241
diff changeset
   606
    "bad spelling - kept for backward compatibility (2014-06-04)"
6641d9cd92a6 class: Set
Stefan Vogel <sv@exept.de>
parents: 16241
diff changeset
   607
6641d9cd92a6 class: Set
Stefan Vogel <sv@exept.de>
parents: 16241
diff changeset
   608
    ^ self safeRemove:oldObject.
6641d9cd92a6 class: Set
Stefan Vogel <sv@exept.de>
parents: 16241
diff changeset
   609
!
6641d9cd92a6 class: Set
Stefan Vogel <sv@exept.de>
parents: 16241
diff changeset
   610
6641d9cd92a6 class: Set
Stefan Vogel <sv@exept.de>
parents: 16241
diff changeset
   611
saveRemove:oldObjectArg ifAbsent:exceptionValueProvider
6641d9cd92a6 class: Set
Stefan Vogel <sv@exept.de>
parents: 16241
diff changeset
   612
    <resource: #obsolete>
6641d9cd92a6 class: Set
Stefan Vogel <sv@exept.de>
parents: 16241
diff changeset
   613
    "bad spelling - kept for backward compatibility (2014-06-04)"
6641d9cd92a6 class: Set
Stefan Vogel <sv@exept.de>
parents: 16241
diff changeset
   614
6641d9cd92a6 class: Set
Stefan Vogel <sv@exept.de>
parents: 16241
diff changeset
   615
    ^ self safeRemove:oldObjectArg ifAbsent:exceptionValueProvider.
6641d9cd92a6 class: Set
Stefan Vogel <sv@exept.de>
parents: 16241
diff changeset
   616
!
6641d9cd92a6 class: Set
Stefan Vogel <sv@exept.de>
parents: 16241
diff changeset
   617
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   618
testAndAdd:keyArg
10588
7043b70ff150 New: #testAndAdd:
Stefan Vogel <sv@exept.de>
parents: 10090
diff changeset
   619
    "add the argument, anObject to the receiver.
7043b70ff150 New: #testAndAdd:
Stefan Vogel <sv@exept.de>
parents: 10090
diff changeset
   620
     Answer true, if the element did already exist in the collection,
7043b70ff150 New: #testAndAdd:
Stefan Vogel <sv@exept.de>
parents: 10090
diff changeset
   621
     false otherwise.
7043b70ff150 New: #testAndAdd:
Stefan Vogel <sv@exept.de>
parents: 10090
diff changeset
   622
7043b70ff150 New: #testAndAdd:
Stefan Vogel <sv@exept.de>
parents: 10090
diff changeset
   623
     WARNING: do not add elements while iterating over the receiver.
7043b70ff150 New: #testAndAdd:
Stefan Vogel <sv@exept.de>
parents: 10090
diff changeset
   624
              Iterate over a copy to do this."
7043b70ff150 New: #testAndAdd:
Stefan Vogel <sv@exept.de>
parents: 10090
diff changeset
   625
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   626
    |key index "{ Class: SmallInteger }"|
10588
7043b70ff150 New: #testAndAdd:
Stefan Vogel <sv@exept.de>
parents: 10090
diff changeset
   627
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   628
    keyArg isNil ifTrue:[
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   629
        key := NilEntry.
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   630
    ] ifFalse:[
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   631
        key := keyArg.
10588
7043b70ff150 New: #testAndAdd:
Stefan Vogel <sv@exept.de>
parents: 10090
diff changeset
   632
    ].
7043b70ff150 New: #testAndAdd:
Stefan Vogel <sv@exept.de>
parents: 10090
diff changeset
   633
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   634
    index := self findKeyOrNil:key.
10588
7043b70ff150 New: #testAndAdd:
Stefan Vogel <sv@exept.de>
parents: 10090
diff changeset
   635
    (keyArray basicAt:index) isNil ifTrue:[
7043b70ff150 New: #testAndAdd:
Stefan Vogel <sv@exept.de>
parents: 10090
diff changeset
   636
        "/ not already there
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   637
        keyArray basicAt:index put:key.
10588
7043b70ff150 New: #testAndAdd:
Stefan Vogel <sv@exept.de>
parents: 10090
diff changeset
   638
        tally := tally + 1.
7043b70ff150 New: #testAndAdd:
Stefan Vogel <sv@exept.de>
parents: 10090
diff changeset
   639
17263
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
   640
        self possiblyGrow.
10588
7043b70ff150 New: #testAndAdd:
Stefan Vogel <sv@exept.de>
parents: 10090
diff changeset
   641
        ^ false.
7043b70ff150 New: #testAndAdd:
Stefan Vogel <sv@exept.de>
parents: 10090
diff changeset
   642
    ].
7043b70ff150 New: #testAndAdd:
Stefan Vogel <sv@exept.de>
parents: 10090
diff changeset
   643
    ^ true.
7043b70ff150 New: #testAndAdd:
Stefan Vogel <sv@exept.de>
parents: 10090
diff changeset
   644
7043b70ff150 New: #testAndAdd:
Stefan Vogel <sv@exept.de>
parents: 10090
diff changeset
   645
    "Modified: 30.1.1997 / 14:58:08 / cg"
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   646
! !
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   647
11052
0c44bf26275c comment
Claus Gittinger <cg@exept.de>
parents: 10868
diff changeset
   648
5280
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   649
!Set methodsFor:'comparing'!
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   650
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   651
= aCollection
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   652
    "return true, if the argument is a Set containing the same elements
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   653
     as I do"
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   654
14134
72811a1ed607 changed:
Stefan Vogel <sv@exept.de>
parents: 14019
diff changeset
   655
    aCollection species ~~ self species ifTrue:[^ false].
72811a1ed607 changed:
Stefan Vogel <sv@exept.de>
parents: 14019
diff changeset
   656
    aCollection size ~~ self size ifTrue:[^ false].
5280
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   657
    "/ same number of elements; since I am a Set, all of
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   658
    "/ of my elements must be in the other collection ...
14134
72811a1ed607 changed:
Stefan Vogel <sv@exept.de>
parents: 14019
diff changeset
   659
    self do:[:eachElement | (aCollection includes:eachElement) ifFalse:[^ false]].
72811a1ed607 changed:
Stefan Vogel <sv@exept.de>
parents: 14019
diff changeset
   660
    ^ true.
5280
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   661
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   662
    "
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   663
     #(1 2 3 4 5) asSet = #(2 3 4 5 1) asSet
18221
5299a2514ed2 class: Set
Stefan Vogel <sv@exept.de>
parents: 17413
diff changeset
   664
     #(nil 1 2 3 4 5) asSet = #(2 3 4 5 1) asSet
5280
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   665
     #(1 2 3 4 5) asSet = #(2 3 4 5 1.0) asSet 
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   666
     #(1 2 3 4 5) asSet = #(2 3 4 5 'one') asSet 
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   667
    "
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   668
    "
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   669
     |d1 d2|
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   670
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   671
     d1 := Dictionary new.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   672
     d2 := Dictionary new.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   673
     d1 at:1 put:'one'.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   674
     d1 at:'one' put:1.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   675
     d1 at:2 put:#two.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   676
     d1 at:1 put:'one'.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   677
     d1 at:'one' put:1.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   678
     d1 at:2 put:#two.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   679
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   680
     d2 at:1 put:'one'.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   681
     d2 at:'one' put:1.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   682
     d2 at:2 put:#two.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   683
     d2 at:1 put:'one'.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   684
     d2 at:'one' put:1.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   685
     d2 at:2 put:#two.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   686
     d1 = d2     
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   687
    "
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   688
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   689
    "
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   690
     |d1 d2|
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   691
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   692
     d1 := Dictionary new.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   693
     d2 := Dictionary new.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   694
     d1 at:1 put:'uno'.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   695
     d1 at:'one' put:1.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   696
     d1 at:2 put:#two.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   697
     d1 at:1 put:'one'.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   698
     d1 at:'one' put:1.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   699
     d1 at:2 put:#two.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   700
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   701
     d2 at:1 put:'one'.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   702
     d2 at:'one' put:1.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   703
     d2 at:2 put:#two.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   704
     d2 at:1 put:'one'.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   705
     d2 at:'one' put:1.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   706
     d2 at:2 put:#two.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   707
     d1 = d2     
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   708
    "
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   709
10090
af5b9428e8ae code cleanup: use #contains/#conform instead of explicit loop
Claus Gittinger <cg@exept.de>
parents: 9933
diff changeset
   710
    "Modified: / 13-10-2006 / 12:58:43 / cg"
5280
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   711
!
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   712
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   713
hash
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   714
    "return a hash key for the receiver"
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   715
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   716
    "this hash is stupid - but for larger collections, the hashing
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   717
     time can become much bigger than the time lost in added probing.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   718
     Time will show ...
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   719
     Notice & warning:
14134
72811a1ed607 changed:
Stefan Vogel <sv@exept.de>
parents: 14019
diff changeset
   720
        if the #= method is ever changed to compare non-dictionaries equal,
72811a1ed607 changed:
Stefan Vogel <sv@exept.de>
parents: 14019
diff changeset
   721
        the code below must be changed to assert that the same hash-value is 
72811a1ed607 changed:
Stefan Vogel <sv@exept.de>
parents: 14019
diff changeset
   722
        still returned.
72811a1ed607 changed:
Stefan Vogel <sv@exept.de>
parents: 14019
diff changeset
   723
        (which may be hard to acomplish)
5280
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   724
    "
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   725
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   726
    |mySize|
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   727
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   728
    mySize := self size.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   729
    mySize == 0 ifTrue:[^ 0].
14134
72811a1ed607 changed:
Stefan Vogel <sv@exept.de>
parents: 14019
diff changeset
   730
    ^ (self anElement hash times:mySize) bitAnd:16r3FFFFFFF
5280
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   731
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   732
    "
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   733
     |d|
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   734
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   735
     d := Dictionary new.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   736
     d at:1 put:'one'.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   737
     d at:'one' put:1.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   738
     d at:2 put:#two.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   739
     d at:'two' put:2.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   740
     d hash     
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   741
    "
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   742
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   743
    "
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   744
     |d|
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   745
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   746
     d := Dictionary new.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   747
     d at:1 put:'uno'.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   748
     d at:'one' put:1.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   749
     d at:2 put:#two.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   750
     d at:'two' put:2.
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   751
     d hash     
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   752
    "
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   753
! !
ad806c9b992e added #= & #hash; EXPERIMENTAL
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   754
15000
4d10fba9aed4 class: Set
Stefan Vogel <sv@exept.de>
parents: 14895
diff changeset
   755
!Set methodsFor:'converting'!
4d10fba9aed4 class: Set
Stefan Vogel <sv@exept.de>
parents: 14895
diff changeset
   756
4d10fba9aed4 class: Set
Stefan Vogel <sv@exept.de>
parents: 14895
diff changeset
   757
asNewSet
4d10fba9aed4 class: Set
Stefan Vogel <sv@exept.de>
parents: 14895
diff changeset
   758
    "make sure to return a unique new set"
4d10fba9aed4 class: Set
Stefan Vogel <sv@exept.de>
parents: 14895
diff changeset
   759
4d10fba9aed4 class: Set
Stefan Vogel <sv@exept.de>
parents: 14895
diff changeset
   760
    "could be an instance of a subclass..."
4d10fba9aed4 class: Set
Stefan Vogel <sv@exept.de>
parents: 14895
diff changeset
   761
    self class == Set ifTrue:[
4d10fba9aed4 class: Set
Stefan Vogel <sv@exept.de>
parents: 14895
diff changeset
   762
        ^ self copy
4d10fba9aed4 class: Set
Stefan Vogel <sv@exept.de>
parents: 14895
diff changeset
   763
    ].
4d10fba9aed4 class: Set
Stefan Vogel <sv@exept.de>
parents: 14895
diff changeset
   764
    ^ super asSet
4d10fba9aed4 class: Set
Stefan Vogel <sv@exept.de>
parents: 14895
diff changeset
   765
4d10fba9aed4 class: Set
Stefan Vogel <sv@exept.de>
parents: 14895
diff changeset
   766
    " 
4d10fba9aed4 class: Set
Stefan Vogel <sv@exept.de>
parents: 14895
diff changeset
   767
        |s|
4d10fba9aed4 class: Set
Stefan Vogel <sv@exept.de>
parents: 14895
diff changeset
   768
        s := #(1 2 3 4) asSet.
4d10fba9aed4 class: Set
Stefan Vogel <sv@exept.de>
parents: 14895
diff changeset
   769
        self assert:(s ~~ s asNewSet).
4d10fba9aed4 class: Set
Stefan Vogel <sv@exept.de>
parents: 14895
diff changeset
   770
        self assert:(s = s asNewSet).
4d10fba9aed4 class: Set
Stefan Vogel <sv@exept.de>
parents: 14895
diff changeset
   771
     "
15036
f86ace435ad0 class: Set
Stefan Vogel <sv@exept.de>
parents: 15000
diff changeset
   772
!
f86ace435ad0 class: Set
Stefan Vogel <sv@exept.de>
parents: 15000
diff changeset
   773
f86ace435ad0 class: Set
Stefan Vogel <sv@exept.de>
parents: 15000
diff changeset
   774
asSet 
f86ace435ad0 class: Set
Stefan Vogel <sv@exept.de>
parents: 15000
diff changeset
   775
    "return the receiver as a Set"
f86ace435ad0 class: Set
Stefan Vogel <sv@exept.de>
parents: 15000
diff changeset
   776
f86ace435ad0 class: Set
Stefan Vogel <sv@exept.de>
parents: 15000
diff changeset
   777
    "could be an instance of a subclass..."
f86ace435ad0 class: Set
Stefan Vogel <sv@exept.de>
parents: 15000
diff changeset
   778
    self class == Set ifTrue:[
f86ace435ad0 class: Set
Stefan Vogel <sv@exept.de>
parents: 15000
diff changeset
   779
        ^ self
f86ace435ad0 class: Set
Stefan Vogel <sv@exept.de>
parents: 15000
diff changeset
   780
    ].
f86ace435ad0 class: Set
Stefan Vogel <sv@exept.de>
parents: 15000
diff changeset
   781
    ^ super asSet
15000
4d10fba9aed4 class: Set
Stefan Vogel <sv@exept.de>
parents: 14895
diff changeset
   782
! !
4d10fba9aed4 class: Set
Stefan Vogel <sv@exept.de>
parents: 14895
diff changeset
   783
159
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
   784
!Set methodsFor:'copying'!
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
   785
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
   786
postCopy
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
   787
    "have to copy the keyArray too"
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
   788
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
   789
    keyArray := keyArray shallowCopy
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   790
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   791
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   792
!Set methodsFor:'enumerating'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   793
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   794
do:aBlock
1056
991ed2a9318b commentary
Claus Gittinger <cg@exept.de>
parents: 1055
diff changeset
   795
    "perform the block for all members in the collection.
991ed2a9318b commentary
Claus Gittinger <cg@exept.de>
parents: 1055
diff changeset
   796
991ed2a9318b commentary
Claus Gittinger <cg@exept.de>
parents: 1055
diff changeset
   797
     WARNING: do not add/remove elements while iterating over the receiver.
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   798
              Iterate over a copy to do this."
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   799
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   800
    |sz "{ Class: SmallInteger }"
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   801
     element|
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   802
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   803
    sz := keyArray size.
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   804
    1 to:sz do:[:index |
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   805
        element := keyArray at:index.
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   806
        (element notNil and:[element ~~ DeletedEntry]) ifTrue:[
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   807
            element == NilEntry ifTrue:[
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   808
                element := nil.
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   809
            ].
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   810
            aBlock value:element
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   811
        ]
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   812
    ]
1056
991ed2a9318b commentary
Claus Gittinger <cg@exept.de>
parents: 1055
diff changeset
   813
991ed2a9318b commentary
Claus Gittinger <cg@exept.de>
parents: 1055
diff changeset
   814
    "Modified: 1.3.1996 / 21:41:13 / cg"
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   815
! !
61
claus
parents: 50
diff changeset
   816
969
6c285e945e8f Use SetInspectorView.
Stefan Vogel <sv@exept.de>
parents: 657
diff changeset
   817
7169
74576ccad3c0 Clean up set operations
Stefan Vogel <sv@exept.de>
parents: 7167
diff changeset
   818
!Set methodsFor:'obsolete set operations'!
74576ccad3c0 Clean up set operations
Stefan Vogel <sv@exept.de>
parents: 7167
diff changeset
   819
74576ccad3c0 Clean up set operations
Stefan Vogel <sv@exept.de>
parents: 7167
diff changeset
   820
+ aCollection
8606
6612bbac2d71 comments
Claus Gittinger <cg@exept.de>
parents: 8499
diff changeset
   821
    "Kept for backward compatibility. 
6612bbac2d71 comments
Claus Gittinger <cg@exept.de>
parents: 8499
diff changeset
   822
     Use #union: instead, to isolate arithmethic and set operations"
7169
74576ccad3c0 Clean up set operations
Stefan Vogel <sv@exept.de>
parents: 7167
diff changeset
   823
74576ccad3c0 Clean up set operations
Stefan Vogel <sv@exept.de>
parents: 7167
diff changeset
   824
    <resource: #obsolete>
17202
c35f2b3fb28d class: Set
sr
parents: 17201
diff changeset
   825
7169
74576ccad3c0 Clean up set operations
Stefan Vogel <sv@exept.de>
parents: 7167
diff changeset
   826
    ^ self union:aCollection.
74576ccad3c0 Clean up set operations
Stefan Vogel <sv@exept.de>
parents: 7167
diff changeset
   827
!
74576ccad3c0 Clean up set operations
Stefan Vogel <sv@exept.de>
parents: 7167
diff changeset
   828
74576ccad3c0 Clean up set operations
Stefan Vogel <sv@exept.de>
parents: 7167
diff changeset
   829
- aCollection
8606
6612bbac2d71 comments
Claus Gittinger <cg@exept.de>
parents: 8499
diff changeset
   830
    "Kept for backward compatibility. 
6612bbac2d71 comments
Claus Gittinger <cg@exept.de>
parents: 8499
diff changeset
   831
     Use #\ instead, to isolate arithmethic and set operations"
7169
74576ccad3c0 Clean up set operations
Stefan Vogel <sv@exept.de>
parents: 7167
diff changeset
   832
74576ccad3c0 Clean up set operations
Stefan Vogel <sv@exept.de>
parents: 7167
diff changeset
   833
    <resource: #obsolete>
74576ccad3c0 Clean up set operations
Stefan Vogel <sv@exept.de>
parents: 7167
diff changeset
   834
74576ccad3c0 Clean up set operations
Stefan Vogel <sv@exept.de>
parents: 7167
diff changeset
   835
    ^ self \ aCollection
74576ccad3c0 Clean up set operations
Stefan Vogel <sv@exept.de>
parents: 7167
diff changeset
   836
! !
74576ccad3c0 Clean up set operations
Stefan Vogel <sv@exept.de>
parents: 7167
diff changeset
   837
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   838
!Set methodsFor:'private'!
2
claus
parents: 1
diff changeset
   839
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   840
find:key ifAbsent:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   841
    "Look for the key in the receiver.  If it is found, return
a27a279701f8 Initial revision
claus
parents:
diff changeset
   842
     the index of the slot containing the key, otherwise
a27a279701f8 Initial revision
claus
parents:
diff changeset
   843
     return the value of evaluating aBlock."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   844
61
claus
parents: 50
diff changeset
   845
    |index  "{ Class:SmallInteger }"
claus
parents: 50
diff changeset
   846
     length "{ Class:SmallInteger }"
claus
parents: 50
diff changeset
   847
     startIndex probe|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   848
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   849
    length := keyArray basicSize.
1126
497de696dff0 OOPS - could add elements twice after a remove (shame on me: how could that go unnoticed for so long ...)
Claus Gittinger <cg@exept.de>
parents: 1056
diff changeset
   850
497de696dff0 OOPS - could add elements twice after a remove (shame on me: how could that go unnoticed for so long ...)
Claus Gittinger <cg@exept.de>
parents: 1056
diff changeset
   851
"/
497de696dff0 OOPS - could add elements twice after a remove (shame on me: how could that go unnoticed for so long ...)
Claus Gittinger <cg@exept.de>
parents: 1056
diff changeset
   852
"/  length < 10 ifTrue:[
362
claus
parents: 359
diff changeset
   853
"/      "assuming, that for small collections the overhead of hashing
claus
parents: 359
diff changeset
   854
"/       is larger ... maybe that proves wrong 
claus
parents: 359
diff changeset
   855
"/       (if overhead of comparing is higher)"
claus
parents: 359
diff changeset
   856
"/      ^ keyArray indexOf:key ifAbsent:aBlock
1126
497de696dff0 OOPS - could add elements twice after a remove (shame on me: how could that go unnoticed for so long ...)
Claus Gittinger <cg@exept.de>
parents: 1056
diff changeset
   857
"/  ].
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   858
6917
979bfb9267e3 refactored to invoke #hash/#identityHash only from one place
Claus Gittinger <cg@exept.de>
parents: 6577
diff changeset
   859
    startIndex := index := self initialIndexForKey:key.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   860
16241
7f73a12c32e1 [true] whileTrue: -> #loop
Stefan Vogel <sv@exept.de>
parents: 15815
diff changeset
   861
    [
7654
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   862
        probe := (keyArray basicAt:index).
13279
10d204f50776 changed: #find:ifAbsent:
sr
parents: 12963
diff changeset
   863
        (probe notNil and:[probe ~~ DeletedEntry and:[key = probe]]) ifTrue:[^ index].
7654
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   864
        (self slotIsEmpty:probe) ifTrue:[^ aBlock value].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   865
7654
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   866
        index == length ifTrue:[
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   867
            index := 1
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   868
        ] ifFalse:[
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   869
            index := index + 1
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   870
        ].
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   871
        index == startIndex ifTrue:[^ aBlock value].
16241
7f73a12c32e1 [true] whileTrue: -> #loop
Stefan Vogel <sv@exept.de>
parents: 15815
diff changeset
   872
    ] loop.
13279
10d204f50776 changed: #find:ifAbsent:
sr
parents: 12963
diff changeset
   873
10d204f50776 changed: #find:ifAbsent:
sr
parents: 12963
diff changeset
   874
    "Modified: / 03-02-2011 / 13:53:18 / sr"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   875
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   876
15806
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   877
findIdentical:key ifAbsent:aBlock
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   878
    "Look for the key in the receiver.  If it is found, return
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   879
     the index of the slot containing the key, otherwise
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   880
     return the value of evaluating aBlock."
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   881
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   882
    ^ keyArray identityIndexOf:key ifAbsent:aBlock
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   883
!
62bc6058e34f class: Set
Stefan Vogel <sv@exept.de>
parents: 15036
diff changeset
   884
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   885
findKeyOrNil:key
1126
497de696dff0 OOPS - could add elements twice after a remove (shame on me: how could that go unnoticed for so long ...)
Claus Gittinger <cg@exept.de>
parents: 1056
diff changeset
   886
    "Look for the key in the receiver.  
3082
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
   887
     If it is found, return the index of the first unused slot. 
1126
497de696dff0 OOPS - could add elements twice after a remove (shame on me: how could that go unnoticed for so long ...)
Claus Gittinger <cg@exept.de>
parents: 1056
diff changeset
   888
     Grow the receiver, if key was not found, and no unused slots were present"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   889
61
claus
parents: 50
diff changeset
   890
    |index  "{ Class:SmallInteger }"
claus
parents: 50
diff changeset
   891
     length "{ Class:SmallInteger }"
1126
497de696dff0 OOPS - could add elements twice after a remove (shame on me: how could that go unnoticed for so long ...)
Claus Gittinger <cg@exept.de>
parents: 1056
diff changeset
   892
     startIndex probe 
6917
979bfb9267e3 refactored to invoke #hash/#identityHash only from one place
Claus Gittinger <cg@exept.de>
parents: 6577
diff changeset
   893
     delIndex|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   894
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   895
    length := keyArray basicSize.
6917
979bfb9267e3 refactored to invoke #hash/#identityHash only from one place
Claus Gittinger <cg@exept.de>
parents: 6577
diff changeset
   896
    startIndex := index := self initialIndexForKey:key.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   897
16241
7f73a12c32e1 [true] whileTrue: -> #loop
Stefan Vogel <sv@exept.de>
parents: 15815
diff changeset
   898
    [
7654
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   899
        probe := keyArray basicAt:index.
13311
53dece2ccaa1 changed: #findKeyOrNil:
Claus Gittinger <cg@exept.de>
parents: 13279
diff changeset
   900
        (probe notNil and:[probe ~~ DeletedEntry and:[key = probe]]) ifTrue:[^ index].
7654
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   901
        (self slotIsEmpty:probe) ifTrue:[
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   902
            delIndex isNil ifTrue:[^ index].
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   903
            keyArray basicAt:delIndex put:nil.
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   904
            ^ delIndex
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   905
        ].
1126
497de696dff0 OOPS - could add elements twice after a remove (shame on me: how could that go unnoticed for so long ...)
Claus Gittinger <cg@exept.de>
parents: 1056
diff changeset
   906
7654
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   907
        probe == DeletedEntry ifTrue:[
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   908
            delIndex isNil ifTrue:[
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   909
                delIndex := index
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   910
            ]
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   911
        ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   912
7654
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   913
        index == length ifTrue:[
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   914
            index := 1
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   915
        ] ifFalse:[
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   916
            index := index + 1
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   917
        ].
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   918
        index == startIndex ifTrue:[
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   919
            delIndex notNil ifTrue:[
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   920
                keyArray basicAt:delIndex put:nil.
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   921
                ^ delIndex
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   922
            ].
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   923
            ^ self grow findKeyOrNil:key
41441d702cfc avoid need for elements to know how to compare against nil.
Claus Gittinger <cg@exept.de>
parents: 7598
diff changeset
   924
        ].
16241
7f73a12c32e1 [true] whileTrue: -> #loop
Stefan Vogel <sv@exept.de>
parents: 15815
diff changeset
   925
    ] loop.
1450
18c2a1da8be2 first look for nil-entry in findKeyOrNil: - saves a compare in the good case, when adding new elements
Claus Gittinger <cg@exept.de>
parents: 1319
diff changeset
   926
13311
53dece2ccaa1 changed: #findKeyOrNil:
Claus Gittinger <cg@exept.de>
parents: 13279
diff changeset
   927
    "Modified: / 27-02-2011 / 15:30:42 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   928
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   929
a27a279701f8 Initial revision
claus
parents:
diff changeset
   930
findNil:key
2475
dffcb8b97178 use #hashFor: in #findNil:
Claus Gittinger <cg@exept.de>
parents: 2469
diff changeset
   931
    "Look for the next slot usable for key.  
dffcb8b97178 use #hashFor: in #findNil:
Claus Gittinger <cg@exept.de>
parents: 2469
diff changeset
   932
     WARNING:
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   933
        This method assumes that key is not already in the receiver 
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   934
        AND that keyArray does not have previously removed entries 
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   935
        AND that there is an empty slot.
2475
dffcb8b97178 use #hashFor: in #findNil:
Claus Gittinger <cg@exept.de>
parents: 2469
diff changeset
   936
     To be used ONLY while growing/rehashing to enter elements into a fresh
dffcb8b97178 use #hashFor: in #findNil:
Claus Gittinger <cg@exept.de>
parents: 2469
diff changeset
   937
     collection - if any of the above conditions is not met, the method
dffcb8b97178 use #hashFor: in #findNil:
Claus Gittinger <cg@exept.de>
parents: 2469
diff changeset
   938
     loops forever."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   939
2475
dffcb8b97178 use #hashFor: in #findNil:
Claus Gittinger <cg@exept.de>
parents: 2469
diff changeset
   940
    |index  "{ Class:SmallInteger }"
61
claus
parents: 50
diff changeset
   941
     length "{ Class:SmallInteger }"|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   942
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   943
    length := keyArray basicSize.
6917
979bfb9267e3 refactored to invoke #hash/#identityHash only from one place
Claus Gittinger <cg@exept.de>
parents: 6577
diff changeset
   944
    index := self initialIndexForKey:key.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   945
5772
e45edba144f1 nope - not better.
Claus Gittinger <cg@exept.de>
parents: 5771
diff changeset
   946
"/    index := keyArray identityIndexOf:nil startingAt:index.
e45edba144f1 nope - not better.
Claus Gittinger <cg@exept.de>
parents: 5771
diff changeset
   947
"/    index == 0 ifTrue:[
e45edba144f1 nope - not better.
Claus Gittinger <cg@exept.de>
parents: 5771
diff changeset
   948
"/        index := keyArray identityIndexOf:nil startingAt:1 endingAt:index.
e45edba144f1 nope - not better.
Claus Gittinger <cg@exept.de>
parents: 5771
diff changeset
   949
"/    ].
e45edba144f1 nope - not better.
Claus Gittinger <cg@exept.de>
parents: 5771
diff changeset
   950
    "/ that code is completely inlined by stc ...
e45edba144f1 nope - not better.
Claus Gittinger <cg@exept.de>
parents: 5771
diff changeset
   951
    [(keyArray basicAt:index) notNil] whileTrue:[
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   952
        index == length ifTrue:[
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   953
            index := 1
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   954
        ] ifFalse:[
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   955
            index := index + 1
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   956
        ].
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   957
        "notice: no check for no nil found - we must find one since
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
   958
         this is only called after growing"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   959
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   960
    ^ index
1055
d3784a235a2e commentary
Claus Gittinger <cg@exept.de>
parents: 1052
diff changeset
   961
2475
dffcb8b97178 use #hashFor: in #findNil:
Claus Gittinger <cg@exept.de>
parents: 2469
diff changeset
   962
    "Modified: 21.3.1997 / 10:32:58 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   963
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   964
2459
0a38e8602aac findNil: no need to check for wraparound;
Claus Gittinger <cg@exept.de>
parents: 2427
diff changeset
   965
hashFor:aKey
6991
e95313d7c780 comment and category change only
Claus Gittinger <cg@exept.de>
parents: 6917
diff changeset
   966
    "return the arguments hash value.
e95313d7c780 comment and category change only
Claus Gittinger <cg@exept.de>
parents: 6917
diff changeset
   967
     Redefined in subclasses, which use a different comparison (i.e. identity compare)"
2459
0a38e8602aac findNil: no need to check for wraparound;
Claus Gittinger <cg@exept.de>
parents: 2427
diff changeset
   968
0a38e8602aac findNil: no need to check for wraparound;
Claus Gittinger <cg@exept.de>
parents: 2427
diff changeset
   969
    ^ aKey hash
0a38e8602aac findNil: no need to check for wraparound;
Claus Gittinger <cg@exept.de>
parents: 2427
diff changeset
   970
0a38e8602aac findNil: no need to check for wraparound;
Claus Gittinger <cg@exept.de>
parents: 2427
diff changeset
   971
    "Created: 19.3.1997 / 15:03:03 / cg"
0a38e8602aac findNil: no need to check for wraparound;
Claus Gittinger <cg@exept.de>
parents: 2427
diff changeset
   972
!
0a38e8602aac findNil: no need to check for wraparound;
Claus Gittinger <cg@exept.de>
parents: 2427
diff changeset
   973
0a38e8602aac findNil: no need to check for wraparound;
Claus Gittinger <cg@exept.de>
parents: 2427
diff changeset
   974
initialIndexForKey:aKey
0a38e8602aac findNil: no need to check for wraparound;
Claus Gittinger <cg@exept.de>
parents: 2427
diff changeset
   975
    "return an initial index given a key."
0a38e8602aac findNil: no need to check for wraparound;
Claus Gittinger <cg@exept.de>
parents: 2427
diff changeset
   976
0a38e8602aac findNil: no need to check for wraparound;
Claus Gittinger <cg@exept.de>
parents: 2427
diff changeset
   977
    |index  "{ Class:SmallInteger }"
0a38e8602aac findNil: no need to check for wraparound;
Claus Gittinger <cg@exept.de>
parents: 2427
diff changeset
   978
     length "{ Class:SmallInteger }"|
0a38e8602aac findNil: no need to check for wraparound;
Claus Gittinger <cg@exept.de>
parents: 2427
diff changeset
   979
0a38e8602aac findNil: no need to check for wraparound;
Claus Gittinger <cg@exept.de>
parents: 2427
diff changeset
   980
    length := keyArray basicSize.
6917
979bfb9267e3 refactored to invoke #hash/#identityHash only from one place
Claus Gittinger <cg@exept.de>
parents: 6577
diff changeset
   981
    index := (self hashFor:aKey) bitAnd:16r3FFFFFFF.
14656
f5cab05e380f class: Set
Stefan Vogel <sv@exept.de>
parents: 14654
diff changeset
   982
f5cab05e380f class: Set
Stefan Vogel <sv@exept.de>
parents: 14654
diff changeset
   983
    "multiply by a large prime to spread the keys over the whole range.
f5cab05e380f class: Set
Stefan Vogel <sv@exept.de>
parents: 14654
diff changeset
   984
     This causes maxChainLength to reduce from about 2000 to 6 for an
f5cab05e380f class: Set
Stefan Vogel <sv@exept.de>
parents: 14654
diff changeset
   985
     IdentitySet of 9000 Smalltalk classes"
f5cab05e380f class: Set
Stefan Vogel <sv@exept.de>
parents: 14654
diff changeset
   986
    index := index times:31415821.
2459
0a38e8602aac findNil: no need to check for wraparound;
Claus Gittinger <cg@exept.de>
parents: 2427
diff changeset
   987
    index := index \\ length + 1.
0a38e8602aac findNil: no need to check for wraparound;
Claus Gittinger <cg@exept.de>
parents: 2427
diff changeset
   988
    ^ index.
0a38e8602aac findNil: no need to check for wraparound;
Claus Gittinger <cg@exept.de>
parents: 2427
diff changeset
   989
14656
f5cab05e380f class: Set
Stefan Vogel <sv@exept.de>
parents: 14654
diff changeset
   990
    "
f5cab05e380f class: Set
Stefan Vogel <sv@exept.de>
parents: 14654
diff changeset
   991
        Smalltalk allClasses maxChainLength
f5cab05e380f class: Set
Stefan Vogel <sv@exept.de>
parents: 14654
diff changeset
   992
    "
f5cab05e380f class: Set
Stefan Vogel <sv@exept.de>
parents: 14654
diff changeset
   993
2459
0a38e8602aac findNil: no need to check for wraparound;
Claus Gittinger <cg@exept.de>
parents: 2427
diff changeset
   994
    "Modified: 1.3.1997 / 01:01:13 / cg"
0a38e8602aac findNil: no need to check for wraparound;
Claus Gittinger <cg@exept.de>
parents: 2427
diff changeset
   995
    "Created: 19.3.1997 / 15:02:41 / cg"
0a38e8602aac findNil: no need to check for wraparound;
Claus Gittinger <cg@exept.de>
parents: 2427
diff changeset
   996
!
0a38e8602aac findNil: no need to check for wraparound;
Claus Gittinger <cg@exept.de>
parents: 2427
diff changeset
   997
18331
521e3c40ea23 class: Set
Claus Gittinger <cg@exept.de>
parents: 18221
diff changeset
   998
initializeForCapacity:minSize
521e3c40ea23 class: Set
Claus Gittinger <cg@exept.de>
parents: 18221
diff changeset
   999
    "initialize the contents array (for at least minSize slots) 
521e3c40ea23 class: Set
Claus Gittinger <cg@exept.de>
parents: 18221
diff changeset
  1000
     and set tally to zero.
521e3c40ea23 class: Set
Claus Gittinger <cg@exept.de>
parents: 18221
diff changeset
  1001
     The size is increased to the next prime for better hashing behavior."
521e3c40ea23 class: Set
Claus Gittinger <cg@exept.de>
parents: 18221
diff changeset
  1002
521e3c40ea23 class: Set
Claus Gittinger <cg@exept.de>
parents: 18221
diff changeset
  1003
    |n|
521e3c40ea23 class: Set
Claus Gittinger <cg@exept.de>
parents: 18221
diff changeset
  1004
521e3c40ea23 class: Set
Claus Gittinger <cg@exept.de>
parents: 18221
diff changeset
  1005
    n := self class goodSizeFrom:minSize.
521e3c40ea23 class: Set
Claus Gittinger <cg@exept.de>
parents: 18221
diff changeset
  1006
    n == keyArray size ifTrue:[
521e3c40ea23 class: Set
Claus Gittinger <cg@exept.de>
parents: 18221
diff changeset
  1007
        keyArray atAllPut:nil.
521e3c40ea23 class: Set
Claus Gittinger <cg@exept.de>
parents: 18221
diff changeset
  1008
    ] ifFalse:[
521e3c40ea23 class: Set
Claus Gittinger <cg@exept.de>
parents: 18221
diff changeset
  1009
        keyArray := self keyContainerOfSize:n. 
521e3c40ea23 class: Set
Claus Gittinger <cg@exept.de>
parents: 18221
diff changeset
  1010
    ].
521e3c40ea23 class: Set
Claus Gittinger <cg@exept.de>
parents: 18221
diff changeset
  1011
    tally := 0
521e3c40ea23 class: Set
Claus Gittinger <cg@exept.de>
parents: 18221
diff changeset
  1012
521e3c40ea23 class: Set
Claus Gittinger <cg@exept.de>
parents: 18221
diff changeset
  1013
    "Modified: / 4.8.1998 / 22:07:25 / cg"
521e3c40ea23 class: Set
Claus Gittinger <cg@exept.de>
parents: 18221
diff changeset
  1014
!
521e3c40ea23 class: Set
Claus Gittinger <cg@exept.de>
parents: 18221
diff changeset
  1015
5845
64a385f14970 Use #invalidElementError to warn about illegal use of nil in Sets
Stefan Vogel <sv@exept.de>
parents: 5834
diff changeset
  1016
invalidElementError
64a385f14970 Use #invalidElementError to warn about illegal use of nil in Sets
Stefan Vogel <sv@exept.de>
parents: 5834
diff changeset
  1017
    "this is send when a nil is used with a Set.
64a385f14970 Use #invalidElementError to warn about illegal use of nil in Sets
Stefan Vogel <sv@exept.de>
parents: 5834
diff changeset
  1018
     For now this is just an info-Message. Will become an error sometimes."
64a385f14970 Use #invalidElementError to warn about illegal use of nil in Sets
Stefan Vogel <sv@exept.de>
parents: 5834
diff changeset
  1019
64a385f14970 Use #invalidElementError to warn about illegal use of nil in Sets
Stefan Vogel <sv@exept.de>
parents: 5834
diff changeset
  1020
    "/ self elementBoundError.
64a385f14970 Use #invalidElementError to warn about illegal use of nil in Sets
Stefan Vogel <sv@exept.de>
parents: 5834
diff changeset
  1021
9086
cd770483c45d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8831
diff changeset
  1022
    InfoPrinting ifTrue:[
cd770483c45d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8831
diff changeset
  1023
        'Set [warning]: nil is not a valid element - will be an error in later versions' errorPrintCR.
11472
d30ca682c65f showWhereWeCameFrom moved
Claus Gittinger <cg@exept.de>
parents: 11052
diff changeset
  1024
        Context showWhereWeCameFrom.
6540
cf1a6a1a8645 better invalidElementError message
Claus Gittinger <cg@exept.de>
parents: 6519
diff changeset
  1025
    ].
5845
64a385f14970 Use #invalidElementError to warn about illegal use of nil in Sets
Stefan Vogel <sv@exept.de>
parents: 5834
diff changeset
  1026
!
64a385f14970 Use #invalidElementError to warn about illegal use of nil in Sets
Stefan Vogel <sv@exept.de>
parents: 5834
diff changeset
  1027
3261
7e4e57c041df added access to my (private) keyArray instVar (sorry)
Claus Gittinger <cg@exept.de>
parents: 3082
diff changeset
  1028
keyArray
7e4e57c041df added access to my (private) keyArray instVar (sorry)
Claus Gittinger <cg@exept.de>
parents: 3082
diff changeset
  1029
    ^ keyArray
7e4e57c041df added access to my (private) keyArray instVar (sorry)
Claus Gittinger <cg@exept.de>
parents: 3082
diff changeset
  1030
7e4e57c041df added access to my (private) keyArray instVar (sorry)
Claus Gittinger <cg@exept.de>
parents: 3082
diff changeset
  1031
    "Created: / 2.2.1998 / 14:50:55 / cg"
7e4e57c041df added access to my (private) keyArray instVar (sorry)
Claus Gittinger <cg@exept.de>
parents: 3082
diff changeset
  1032
!
7e4e57c041df added access to my (private) keyArray instVar (sorry)
Claus Gittinger <cg@exept.de>
parents: 3082
diff changeset
  1033
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1034
keyContainerOfSize:n
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1035
    "return a container for keys of size n.
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1036
     Extracted to make life of weak subclasses easier ..."
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1037
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1038
    ^ Array basicNew:n
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1039
!
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1040
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1041
rehash
61
claus
parents: 50
diff changeset
  1042
    "rehash is done by re-adding all elements to a new empty set.
claus
parents: 50
diff changeset
  1043
     Rehash is needed after a binaryRead, for example."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1044
3082
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1045
    |element oldKeyArray newKeyArray newIdx
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1046
     n "{ Class:SmallInteger }"|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1047
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1048
    oldKeyArray := keyArray.
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1049
    n := oldKeyArray size.
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1050
    keyArray := newKeyArray := self keyContainerOfSize:n.
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
  1051
2
claus
parents: 1
diff changeset
  1052
    1 to:n do:[:index |
6994
0f08c1d8c2ac Remove unused method var
Stefan Vogel <sv@exept.de>
parents: 6991
diff changeset
  1053
	element := oldKeyArray at:index.
0f08c1d8c2ac Remove unused method var
Stefan Vogel <sv@exept.de>
parents: 6991
diff changeset
  1054
	(element notNil and:[element ~~ DeletedEntry]) ifTrue:[
0f08c1d8c2ac Remove unused method var
Stefan Vogel <sv@exept.de>
parents: 6991
diff changeset
  1055
	    "cannot be already there"
0f08c1d8c2ac Remove unused method var
Stefan Vogel <sv@exept.de>
parents: 6991
diff changeset
  1056
	    newIdx := self findNil:element.
0f08c1d8c2ac Remove unused method var
Stefan Vogel <sv@exept.de>
parents: 6991
diff changeset
  1057
	    newKeyArray basicAt:newIdx put:element
0f08c1d8c2ac Remove unused method var
Stefan Vogel <sv@exept.de>
parents: 6991
diff changeset
  1058
	].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1059
    ]
3082
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1060
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1061
    "Modified: / 30.10.1997 / 16:04:46 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1062
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1063
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1064
rehashFrom:startIndex
61
claus
parents: 50
diff changeset
  1065
    "rehash elements starting at index - after a remove.
claus
parents: 50
diff changeset
  1066
     Notice: due to the new implementation of remove, 
159
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
  1067
	     this is no longer needed"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1068
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1069
    |element i "{ Class:SmallInteger }"
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
  1070
     length
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1071
     index "{ Class:SmallInteger }" |
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1072
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  1073
    length := keyArray basicSize.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1074
    index := startIndex.
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
  1075
    element := keyArray basicAt:index.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1076
    [element notNil] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
  1077
	i := self findNil:element.
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
  1078
	i == index ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
  1079
	    ^ self
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
  1080
	].
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
  1081
	keyArray basicAt:i put:element.
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
  1082
	keyArray basicAt:index put:nil.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1083
159
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
  1084
	index == length ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
  1085
	    index := 1
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
  1086
	] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
  1087
	    index := index + 1.
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
  1088
	].
514c749165c3 *** empty log message ***
claus
parents: 119
diff changeset
  1089
	element := keyArray basicAt:index.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1090
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1091
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1092
6233
0a79cbd07543 *** empty log message ***
martin
parents: 6191
diff changeset
  1093
slotIsEmpty:aSlotValue
0a79cbd07543 *** empty log message ***
martin
parents: 6191
diff changeset
  1094
    "only redefined in weak subclasses, since they treat a 0-value
0a79cbd07543 *** empty log message ***
martin
parents: 6191
diff changeset
  1095
     as being empty"
0a79cbd07543 *** empty log message ***
martin
parents: 6191
diff changeset
  1096
0a79cbd07543 *** empty log message ***
martin
parents: 6191
diff changeset
  1097
    ^ aSlotValue isNil
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1098
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1099
7260
edfa8d6a6046 method category rename
Claus Gittinger <cg@exept.de>
parents: 7169
diff changeset
  1100
!Set methodsFor:'private-grow & shrink'!
3082
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1101
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1102
grow
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1103
    "change the number of element slots of the collection to a useful
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1104
     new size"
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1105
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1106
    self grow:(keyArray basicSize * 2)
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1107
!
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1108
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1109
grow:newSize
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1110
    "change the number of element slots of the collection - to do this,
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1111
     we have to rehash (which is done by re-adding all elements to a new
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1112
     empty set)."
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1113
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1114
    |elem oldKeyArray newKeyArray deletedEntry
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1115
     containerSize oldSize "{ Class:SmallInteger }"|
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1116
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1117
    oldKeyArray := keyArray.
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1118
    oldSize := oldKeyArray size.
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1119
    containerSize := (self class goodSizeFrom:newSize).
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1120
    containerSize == oldSize ifTrue:[^ self].
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1121
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1122
    keyArray := newKeyArray := self keyContainerOfSize:containerSize. 
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1123
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1124
    deletedEntry := DeletedEntry.
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1125
    1 to:oldSize do:[:srcIndex |
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1126
	elem := oldKeyArray basicAt:srcIndex.
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1127
	(elem notNil and:[elem ~~ deletedEntry]) ifTrue:[
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1128
	    "cannot be already there"
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1129
	    newKeyArray basicAt:(self findNil:elem) put:elem
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1130
	].
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1131
    ].
17263
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1132
!
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1133
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1134
possiblyGrow
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1135
    "check if collection is full (after an add); grow if so.
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1136
     Definition of 'full' is currently: 'filled more than 75% (i.e. 3/4th)'"
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1137
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1138
    |sz "{Class: SmallInteger}" |
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1139
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1140
    "
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1141
     grow if filled more than 75% 
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1142
    "
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1143
    sz := keyArray basicSize.
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1144
    tally > (sz * 3 // 4) ifTrue:[
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1145
       self grow
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1146
    ]
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1147
!
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1148
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1149
possiblyShrink
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1150
    "check if the receiver has become too empty (after a remove)
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1151
     and shrink if it makes sense.
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1152
     Definition of 'too empty' is: 'filled less than 12.5% (i.e. 1/8th)'"
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1153
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1154
    |sz      "{Class: SmallInteger}"
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1155
     newSize "{Class: SmallInteger}" |
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1156
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1157
    sz := keyArray basicSize.
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1158
    sz > 56 ifTrue:[
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1159
        "
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1160
         shrink if too empty
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1161
        "
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1162
        tally < (sz // 8) ifTrue:[
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1163
            newSize := sz // 4.
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1164
            self grow:newSize
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1165
        ]
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1166
    ]
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1167
65d015f98f43 renamed the private emptyCheck of Set & Dictionary
Claus Gittinger <cg@exept.de>
parents: 17202
diff changeset
  1168
    "Modified: 19.3.1997 / 16:02:55 / cg"
3082
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1169
! !
d09ee5fdcc7b checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3048
diff changeset
  1170
5557
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  1171
!Set methodsFor:'queries'!
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  1172
8499
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1173
collisionCount
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1174
    "return the number of key collisions in the set.
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1175
     There is a collision if two keys hash to the same value."
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1176
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1177
    |count|
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1178
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1179
    count := 0.
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1180
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1181
    keyArray do:[:eachKey|
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1182
        (eachKey notNil and:[eachKey ~~ DeletedEntry]) ifTrue:[
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1183
            count := count + (self collisionsFor:eachKey).
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1184
        ]
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1185
    ].
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1186
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1187
    ^ count
14654
32c189acecb6 class: Set
Stefan Vogel <sv@exept.de>
parents: 14319
diff changeset
  1188
32c189acecb6 class: Set
Stefan Vogel <sv@exept.de>
parents: 14319
diff changeset
  1189
    "
32c189acecb6 class: Set
Stefan Vogel <sv@exept.de>
parents: 14319
diff changeset
  1190
      self allSubInstances 
32c189acecb6 class: Set
Stefan Vogel <sv@exept.de>
parents: 14319
diff changeset
  1191
          collect:[:each| each collisionCount -> each] 
32c189acecb6 class: Set
Stefan Vogel <sv@exept.de>
parents: 14319
diff changeset
  1192
          thenSelect:[:each| each key > 0]
32c189acecb6 class: Set
Stefan Vogel <sv@exept.de>
parents: 14319
diff changeset
  1193
    "
8499
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1194
!
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1195
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1196
collisionsFor:key
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1197
    "Return the number of searches - 1 required for key"
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1198
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1199
    |index  "{ Class:SmallInteger }"
14654
32c189acecb6 class: Set
Stefan Vogel <sv@exept.de>
parents: 14319
diff changeset
  1200
     length "{ Class:SmallInteger }" startIndex probe count|
8499
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1201
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1202
    length := keyArray basicSize.
14654
32c189acecb6 class: Set
Stefan Vogel <sv@exept.de>
parents: 14319
diff changeset
  1203
    startIndex := index := self initialIndexForKey:key.
8499
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1204
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1205
    count := 0.
16241
7f73a12c32e1 [true] whileTrue: -> #loop
Stefan Vogel <sv@exept.de>
parents: 15815
diff changeset
  1206
    [
14654
32c189acecb6 class: Set
Stefan Vogel <sv@exept.de>
parents: 14319
diff changeset
  1207
        probe := keyArray basicAt:index.
8499
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1208
        (probe notNil and:[key = probe]) ifTrue:[^ count].
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1209
        (self slotIsEmpty:probe) ifTrue:[self error:'non existing key'].
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1210
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1211
        index == length ifTrue:[
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1212
            index := 1.
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1213
        ] ifFalse:[
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1214
            index := index + 1.
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1215
        ].
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1216
        count := count + 1.
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1217
        index == startIndex ifTrue:[self error:'non existing key'].
16241
7f73a12c32e1 [true] whileTrue: -> #loop
Stefan Vogel <sv@exept.de>
parents: 15815
diff changeset
  1218
    ] loop.
8499
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1219
!
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1220
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1221
maxChainLength
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1222
    "return the number of the maximum chain length in the set.
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1223
     This is the worst case overhead when accessing a key."
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1224
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1225
    |chainLength key|
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1226
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1227
    chainLength := 0.
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1228
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1229
    keyArray do:[:eachKey| |t|
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1230
        (eachKey notNil and:[eachKey ~~ DeletedEntry]) ifTrue:[
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1231
            t := self collisionsFor:eachKey.
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1232
            chainLength < t ifTrue:[chainLength := t. key := eachKey].
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1233
        ]
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1234
    ].
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1235
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1236
    ^ (key -> chainLength)
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1237
!
de9cfb15379a Add methods for diagnosis
Stefan Vogel <sv@exept.de>
parents: 8394
diff changeset
  1238
5557
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  1239
size
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  1240
    "return the number of set elements"
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  1241
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  1242
    ^ tally
f5f8d236027c category change
Claus Gittinger <cg@exept.de>
parents: 5471
diff changeset
  1243
! !
5471
a57eeb01c5ab General encoding method (#encodeOn:with:)
Stefan Vogel <sv@exept.de>
parents: 5335
diff changeset
  1244
16810
f6b1aa12bd5f class: Set
Stefan Vogel <sv@exept.de>
parents: 16717
diff changeset
  1245
!Set methodsFor:'searching'!
f6b1aa12bd5f class: Set
Stefan Vogel <sv@exept.de>
parents: 16717
diff changeset
  1246
f6b1aa12bd5f class: Set
Stefan Vogel <sv@exept.de>
parents: 16717
diff changeset
  1247
findFirst:aBlock ifNone:exceptionValue
f6b1aa12bd5f class: Set
Stefan Vogel <sv@exept.de>
parents: 16717
diff changeset
  1248
    "find the index of the first element, for which evaluation of the argument, aBlock returns true; 
f6b1aa12bd5f class: Set
Stefan Vogel <sv@exept.de>
parents: 16717
diff changeset
  1249
     return its index or the value from exceptionValue if none detected.
f6b1aa12bd5f class: Set
Stefan Vogel <sv@exept.de>
parents: 16717
diff changeset
  1250
     This is much like #detect:ifNone:, however, here an INDEX is returned,
f6b1aa12bd5f class: Set
Stefan Vogel <sv@exept.de>
parents: 16717
diff changeset
  1251
     while #detect:ifNone: returns the element.
f6b1aa12bd5f class: Set
Stefan Vogel <sv@exept.de>
parents: 16717
diff changeset
  1252
f6b1aa12bd5f class: Set
Stefan Vogel <sv@exept.de>
parents: 16717
diff changeset
  1253
     Sets do not have indices."
f6b1aa12bd5f class: Set
Stefan Vogel <sv@exept.de>
parents: 16717
diff changeset
  1254
f6b1aa12bd5f class: Set
Stefan Vogel <sv@exept.de>
parents: 16717
diff changeset
  1255
    ^ self shouldNotImplement
f6b1aa12bd5f class: Set
Stefan Vogel <sv@exept.de>
parents: 16717
diff changeset
  1256
! !
f6b1aa12bd5f class: Set
Stefan Vogel <sv@exept.de>
parents: 16717
diff changeset
  1257
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1258
!Set methodsFor:'testing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1259
362
claus
parents: 359
diff changeset
  1260
capacity 
claus
parents: 359
diff changeset
  1261
    "return the number of elements, that the receiver is
claus
parents: 359
diff changeset
  1262
     prepared to take.
claus
parents: 359
diff changeset
  1263
     Not used by the system; added for ST-80 compatibility."
claus
parents: 359
diff changeset
  1264
claus
parents: 359
diff changeset
  1265
    ^ keyArray size
claus
parents: 359
diff changeset
  1266
!
claus
parents: 359
diff changeset
  1267
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1268
includes:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1269
    "return true if the argument anObject is in the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1270
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
  1271
    ^ (self find:(anObject ? NilEntry) ifAbsent:0) ~~ 0
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1272
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1273
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1274
isEmpty
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1275
    "return true if the receiver is empty"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1276
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1277
    ^ tally == 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1278
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1279
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1280
isFixedSize
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1281
    "return true if the receiver cannot grow - this will vanish once
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1282
     Arrays and Strings learn how to grow ..."
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1283
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1284
    ^ false
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1285
!
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1286
18466
0359b064feba added isOrdered query
Claus Gittinger <cg@exept.de>
parents: 18331
diff changeset
  1287
isOrdered
0359b064feba added isOrdered query
Claus Gittinger <cg@exept.de>
parents: 18331
diff changeset
  1288
    "return true, if the receiver's elements are ordered.
0359b064feba added isOrdered query
Claus Gittinger <cg@exept.de>
parents: 18331
diff changeset
  1289
     Redefined to return false here, because the order of keys (and values in dictionaries)
0359b064feba added isOrdered query
Claus Gittinger <cg@exept.de>
parents: 18331
diff changeset
  1290
     may change due to rehashing, when elements are added/removed"
0359b064feba added isOrdered query
Claus Gittinger <cg@exept.de>
parents: 18331
diff changeset
  1291
0359b064feba added isOrdered query
Claus Gittinger <cg@exept.de>
parents: 18331
diff changeset
  1292
    ^ false
0359b064feba added isOrdered query
Claus Gittinger <cg@exept.de>
parents: 18331
diff changeset
  1293
!
0359b064feba added isOrdered query
Claus Gittinger <cg@exept.de>
parents: 18331
diff changeset
  1294
2383
8b2957f5ec90 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2328
diff changeset
  1295
notEmpty
8b2957f5ec90 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2328
diff changeset
  1296
    "return true if the receiver is not empty"
8b2957f5ec90 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2328
diff changeset
  1297
8b2957f5ec90 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2328
diff changeset
  1298
    ^ tally ~~ 0
8b2957f5ec90 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2328
diff changeset
  1299
8b2957f5ec90 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2328
diff changeset
  1300
    "Created: 12.2.1997 / 12:39:02 / cg"
8b2957f5ec90 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2328
diff changeset
  1301
!
8b2957f5ec90 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2328
diff changeset
  1302
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1303
occurrencesOf:anObject
5048
b1e10ce753fd comment
Claus Gittinger <cg@exept.de>
parents: 4795
diff changeset
  1304
    "return the number of occurrences of anObject in the receiver.
6191
28ac2bdae9e9 comments;
Claus Gittinger <cg@exept.de>
parents: 6127
diff changeset
  1305
     As I am a Set, this can only return 0 or 1."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1306
14315
f75e7698ccfe Support for nil as element in a set
Stefan Vogel <sv@exept.de>
parents: 14314
diff changeset
  1307
    (self find:(anObject ? NilEntry) ifAbsent:0) == 0 ifTrue:[^ 0].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1308
    ^ 1
6191
28ac2bdae9e9 comments;
Claus Gittinger <cg@exept.de>
parents: 6127
diff changeset
  1309
28ac2bdae9e9 comments;
Claus Gittinger <cg@exept.de>
parents: 6127
diff changeset
  1310
    "Modified: / 16.11.2001 / 10:30:14 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1311
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1312
8394
da194de43766 Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 7654
diff changeset
  1313
!Set methodsFor:'visiting'!
da194de43766 Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 7654
diff changeset
  1314
da194de43766 Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 7654
diff changeset
  1315
acceptVisitor:aVisitor with:aParameter
16717
ce1544557168 comment/format only
Claus Gittinger <cg@exept.de>
parents: 16515
diff changeset
  1316
    "dispatch for visitor pattern; send #visitSet:with: to aVisitor."
8394
da194de43766 Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 7654
diff changeset
  1317
da194de43766 Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 7654
diff changeset
  1318
    ^ aVisitor visitSet:self with:aParameter
da194de43766 Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 7654
diff changeset
  1319
! !
da194de43766 Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 7654
diff changeset
  1320
4017
cdf103ce2e30 there can be only one EmptySlot
Claus Gittinger <cg@exept.de>
parents: 3726
diff changeset
  1321
!Set::EmptySlot class methodsFor:'instance creation'!
cdf103ce2e30 there can be only one EmptySlot
Claus Gittinger <cg@exept.de>
parents: 3726
diff changeset
  1322
cdf103ce2e30 there can be only one EmptySlot
Claus Gittinger <cg@exept.de>
parents: 3726
diff changeset
  1323
basicNew
cdf103ce2e30 there can be only one EmptySlot
Claus Gittinger <cg@exept.de>
parents: 3726
diff changeset
  1324
    TheOneAndOnlyInstance isNil ifTrue:[
6994
0f08c1d8c2ac Remove unused method var
Stefan Vogel <sv@exept.de>
parents: 6991
diff changeset
  1325
	TheOneAndOnlyInstance := super basicNew
4017
cdf103ce2e30 there can be only one EmptySlot
Claus Gittinger <cg@exept.de>
parents: 3726
diff changeset
  1326
    ].
cdf103ce2e30 there can be only one EmptySlot
Claus Gittinger <cg@exept.de>
parents: 3726
diff changeset
  1327
    ^ TheOneAndOnlyInstance
cdf103ce2e30 there can be only one EmptySlot
Claus Gittinger <cg@exept.de>
parents: 3726
diff changeset
  1328
cdf103ce2e30 there can be only one EmptySlot
Claus Gittinger <cg@exept.de>
parents: 3726
diff changeset
  1329
! !
cdf103ce2e30 there can be only one EmptySlot
Claus Gittinger <cg@exept.de>
parents: 3726
diff changeset
  1330
14314
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
  1331
!Set::NilKey class methodsFor:'instance creation'!
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
  1332
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
  1333
basicNew
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
  1334
    TheOneAndOnlyInstance isNil ifTrue:[
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
  1335
        TheOneAndOnlyInstance := super basicNew
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
  1336
    ].
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
  1337
    ^ TheOneAndOnlyInstance
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
  1338
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
  1339
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
  1340
! !
e2d4d97f9a2c class definition
Stefan Vogel <sv@exept.de>
parents: 14300
diff changeset
  1341
2259
685b96fb41b6 a better deletedClass
Claus Gittinger <cg@exept.de>
parents: 1975
diff changeset
  1342
!Set class methodsFor:'documentation'!
635
86cbe76f5a20 version at the end
Claus Gittinger <cg@exept.de>
parents: 609
diff changeset
  1343
86cbe76f5a20 version at the end
Claus Gittinger <cg@exept.de>
parents: 609
diff changeset
  1344
version
18466
0359b064feba added isOrdered query
Claus Gittinger <cg@exept.de>
parents: 18331
diff changeset
  1345
    ^ '$Header: /cvs/stx/stx/libbasic/Set.st,v 1.134 2015-06-08 19:22:24 cg Exp $'
12342
10c0bdcf6c37 added: #like:
Claus Gittinger <cg@exept.de>
parents: 11472
diff changeset
  1346
!
10c0bdcf6c37 added: #like:
Claus Gittinger <cg@exept.de>
parents: 11472
diff changeset
  1347
10c0bdcf6c37 added: #like:
Claus Gittinger <cg@exept.de>
parents: 11472
diff changeset
  1348
version_CVS
18466
0359b064feba added isOrdered query
Claus Gittinger <cg@exept.de>
parents: 18331
diff changeset
  1349
    ^ '$Header: /cvs/stx/stx/libbasic/Set.st,v 1.134 2015-06-08 19:22:24 cg Exp $'
635
86cbe76f5a20 version at the end
Claus Gittinger <cg@exept.de>
parents: 609
diff changeset
  1350
! !
6917
979bfb9267e3 refactored to invoke #hash/#identityHash only from one place
Claus Gittinger <cg@exept.de>
parents: 6577
diff changeset
  1351
14654
32c189acecb6 class: Set
Stefan Vogel <sv@exept.de>
parents: 14319
diff changeset
  1352
609
12be97f6d5a7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1353
Set initialize!