OrderedSet.st
author Stefan Vogel <sv@exept.de>
Wed, 21 Nov 2007 18:24:07 +0100
changeset 1917 61c602336f3d
parent 1915 c7fbd33fc982
child 1988 ab88c724b73c
permissions -rw-r--r--
Clean up code and document differences between #add: and #addLast:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
995
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
     1
"
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
     2
 COPYRIGHT (c) 2001 by eXept Software AG
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
     3
              All Rights Reserved
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
     4
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
     5
 This software is furnished under a license and may be used
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
     6
 only in accordance with the terms of that license and with the
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
     8
 be provided or otherwise made available to, or used by, any
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
     9
 other person.  No title to or ownership of the software is
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
    10
 hereby transferred.
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
    11
"
994
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
"{ Package: 'stx:libbasic2' }"
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
Set subclass:#OrderedSet
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
	instanceVariableNames:'order'
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
	classVariableNames:''
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
	poolDictionaries:''
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
	category:'Collections-Sequenceable'
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
!
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
!OrderedSet class methodsFor:'documentation'!
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
995
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
    23
copyright
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
    24
"
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
    25
 COPYRIGHT (c) 2001 by eXept Software AG
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
    26
              All Rights Reserved
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
    27
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
    28
 This software is furnished under a license and may be used
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
    29
 only in accordance with the terms of that license and with the
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
    30
 inclusion of the above copyright notice.   This software may not
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
    31
 be provided or otherwise made available to, or used by, any
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
    32
 other person.  No title to or ownership of the software is
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
    33
 hereby transferred.
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
    34
"
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
    35
!
9cc62bd4a214 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 994
diff changeset
    36
994
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
documentation
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
"
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
    I am a subclass of Set whose elements are ordered in a
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
    similar fashion to OrderedCollection.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
    That is, I have both Set behavior (only keeping a single instance of
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
    an element) but I also remember the original order, in which elements
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
    were added.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
    I have one additional instance variable:
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
    order <OrderedCollection>       Ordered collection of values reflecting the order 
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
                                    in the set. 
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
    [author:]
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
        Claus Gittinger
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
    [see also:]
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
        OrderedCollection 
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
        Dictionary OrderedDictionary
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
        Set Bag
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
"
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
!
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
examples
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
"
996
0b2c9eef7227 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 995
diff changeset
    62
                                                                    [exBegin]
994
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
        |s|
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
        s := OrderedSet new.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
        s add:'one'.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
        s add:'two'.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
        s add:'one'.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
        s add:'two'.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
        s add:'three'.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
        s size.         
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
        s do:[:each | Transcript showCR:each].         
996
0b2c9eef7227 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 995
diff changeset
    73
                                                                    [exEnd]
0b2c9eef7227 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 995
diff changeset
    74
0b2c9eef7227 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 995
diff changeset
    75
0b2c9eef7227 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 995
diff changeset
    76
                                                                    [exBegin]
0b2c9eef7227 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 995
diff changeset
    77
        |s|
0b2c9eef7227 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 995
diff changeset
    78
0b2c9eef7227 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 995
diff changeset
    79
        s := OrderedSet new.
0b2c9eef7227 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 995
diff changeset
    80
        s add:'one'.
0b2c9eef7227 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 995
diff changeset
    81
        s add:'two'.
0b2c9eef7227 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 995
diff changeset
    82
        s add:'one'.
0b2c9eef7227 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 995
diff changeset
    83
        s add:'two'.
0b2c9eef7227 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 995
diff changeset
    84
        s add:'three'.
0b2c9eef7227 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 995
diff changeset
    85
        s remove:'one'.
0b2c9eef7227 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 995
diff changeset
    86
        s size.         
0b2c9eef7227 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 995
diff changeset
    87
        s do:[:each | Transcript showCR:each].         
0b2c9eef7227 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 995
diff changeset
    88
                                                                    [exEnd]
1581
201be7d15ef0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1571
diff changeset
    89
201be7d15ef0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1571
diff changeset
    90
                                                                    [exBegin]
201be7d15ef0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1571
diff changeset
    91
        |s|
201be7d15ef0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1571
diff changeset
    92
201be7d15ef0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1571
diff changeset
    93
        s := OrderedSet new.
201be7d15ef0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1571
diff changeset
    94
        s add:'one'.
201be7d15ef0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1571
diff changeset
    95
        s addFirst:'two'.
201be7d15ef0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1571
diff changeset
    96
        s addFirst:'three'.
201be7d15ef0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1571
diff changeset
    97
        s add:'one'.
201be7d15ef0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1571
diff changeset
    98
        s add:'two'.
201be7d15ef0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1571
diff changeset
    99
        s add:'three'.
201be7d15ef0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1571
diff changeset
   100
        s size.         
201be7d15ef0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1571
diff changeset
   101
        s do:[:each | Transcript showCR:each].         
201be7d15ef0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1571
diff changeset
   102
                                                                    [exEnd]
994
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
"
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
! !
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
!OrderedSet class methodsFor:'instance creation'!
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
new
1571
fa44f16fd6cd proper #initialize
Claus Gittinger <cg@exept.de>
parents: 1441
diff changeset
   109
        ^super new initializeOrder
994
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
    "Created: / 16.11.2001 / 10:10:37 / cg"
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
!
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
new: anInteger
1571
fa44f16fd6cd proper #initialize
Claus Gittinger <cg@exept.de>
parents: 1441
diff changeset
   115
        ^(super new: anInteger) initializeOrder
994
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
    "Created: / 16.11.2001 / 10:10:07 / cg"
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
! !
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
!OrderedSet methodsFor:'accessing'!
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
at:index
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
    "return the indexed instance variable with index, anInteger.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
     Report an error, if the index is wrong."
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
    ^ order at:index
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
    "Modified: / 16.11.2001 / 10:27:40 / cg"
1603
a2a4ce010ef3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1581
diff changeset
   129
!
a2a4ce010ef3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1581
diff changeset
   130
a2a4ce010ef3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1581
diff changeset
   131
at:index ifAbsent:exceptionalValue
a2a4ce010ef3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1581
diff changeset
   132
    "return the indexed instance variable with index, anInteger.
a2a4ce010ef3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1581
diff changeset
   133
     If not present, return the value from exceptionalValue."
a2a4ce010ef3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1581
diff changeset
   134
a2a4ce010ef3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1581
diff changeset
   135
    ^ order at:index ifAbsent:exceptionalValue
a2a4ce010ef3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1581
diff changeset
   136
a2a4ce010ef3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1581
diff changeset
   137
    "Modified: / 16.11.2001 / 10:27:40 / cg"
994
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
! !
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
!OrderedSet methodsFor:'adding & removing'!
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
add:anObject 
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
    "Add anObject to the receiver (if not already included). 
1915
c7fbd33fc982 Clean up code and document differences between #add: and #addLast:
Stefan Vogel <sv@exept.de>
parents: 1603
diff changeset
   144
     Also, remember in the order (i.e. add to the end)
c7fbd33fc982 Clean up code and document differences between #add: and #addLast:
Stefan Vogel <sv@exept.de>
parents: 1603
diff changeset
   145
     If anAssociation is already present in the dictionary,
c7fbd33fc982 Clean up code and document differences between #add: and #addLast:
Stefan Vogel <sv@exept.de>
parents: 1603
diff changeset
   146
     the order will not be changed. (See also: #addLast:)"
994
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
1915
c7fbd33fc982 Clean up code and document differences between #add: and #addLast:
Stefan Vogel <sv@exept.de>
parents: 1603
diff changeset
   148
    anObject isNil ifTrue:[
c7fbd33fc982 Clean up code and document differences between #add: and #addLast:
Stefan Vogel <sv@exept.de>
parents: 1603
diff changeset
   149
        ^ self invalidElementError.
c7fbd33fc982 Clean up code and document differences between #add: and #addLast:
Stefan Vogel <sv@exept.de>
parents: 1603
diff changeset
   150
    ].
c7fbd33fc982 Clean up code and document differences between #add: and #addLast:
Stefan Vogel <sv@exept.de>
parents: 1603
diff changeset
   151
    (self includes:anObject) ifFalse:[
c7fbd33fc982 Clean up code and document differences between #add: and #addLast:
Stefan Vogel <sv@exept.de>
parents: 1603
diff changeset
   152
        super add:anObject.
c7fbd33fc982 Clean up code and document differences between #add: and #addLast:
Stefan Vogel <sv@exept.de>
parents: 1603
diff changeset
   153
        order add:anObject.
c7fbd33fc982 Clean up code and document differences between #add: and #addLast:
Stefan Vogel <sv@exept.de>
parents: 1603
diff changeset
   154
    ].
1322
617cb62991a6 addFirst/removeFirst
Claus Gittinger <cg@exept.de>
parents: 1321
diff changeset
   155
    ^ anObject
617cb62991a6 addFirst/removeFirst
Claus Gittinger <cg@exept.de>
parents: 1321
diff changeset
   156
!
617cb62991a6 addFirst/removeFirst
Claus Gittinger <cg@exept.de>
parents: 1321
diff changeset
   157
617cb62991a6 addFirst/removeFirst
Claus Gittinger <cg@exept.de>
parents: 1321
diff changeset
   158
addFirst:anObject 
617cb62991a6 addFirst/removeFirst
Claus Gittinger <cg@exept.de>
parents: 1321
diff changeset
   159
    "Add anObject to the receiver (if not already included). 
617cb62991a6 addFirst/removeFirst
Claus Gittinger <cg@exept.de>
parents: 1321
diff changeset
   160
     Also, remember in the order (i.e. add to the beginning)"
617cb62991a6 addFirst/removeFirst
Claus Gittinger <cg@exept.de>
parents: 1321
diff changeset
   161
1441
79acac990d30 Detect (and deny) nil arguments in #add*: methods (same behavior as Set)
Stefan Vogel <sv@exept.de>
parents: 1410
diff changeset
   162
    anObject isNil ifTrue:[
79acac990d30 Detect (and deny) nil arguments in #add*: methods (same behavior as Set)
Stefan Vogel <sv@exept.de>
parents: 1410
diff changeset
   163
        ^ self invalidElementError.
79acac990d30 Detect (and deny) nil arguments in #add*: methods (same behavior as Set)
Stefan Vogel <sv@exept.de>
parents: 1410
diff changeset
   164
    ].
1322
617cb62991a6 addFirst/removeFirst
Claus Gittinger <cg@exept.de>
parents: 1321
diff changeset
   165
    (self includes:anObject) ifFalse:[
617cb62991a6 addFirst/removeFirst
Claus Gittinger <cg@exept.de>
parents: 1321
diff changeset
   166
        super add:anObject.
617cb62991a6 addFirst/removeFirst
Claus Gittinger <cg@exept.de>
parents: 1321
diff changeset
   167
        order addFirst:anObject.
617cb62991a6 addFirst/removeFirst
Claus Gittinger <cg@exept.de>
parents: 1321
diff changeset
   168
    ].
617cb62991a6 addFirst/removeFirst
Claus Gittinger <cg@exept.de>
parents: 1321
diff changeset
   169
    ^ anObject
617cb62991a6 addFirst/removeFirst
Claus Gittinger <cg@exept.de>
parents: 1321
diff changeset
   170
!
617cb62991a6 addFirst/removeFirst
Claus Gittinger <cg@exept.de>
parents: 1321
diff changeset
   171
617cb62991a6 addFirst/removeFirst
Claus Gittinger <cg@exept.de>
parents: 1321
diff changeset
   172
addLast:anObject 
617cb62991a6 addFirst/removeFirst
Claus Gittinger <cg@exept.de>
parents: 1321
diff changeset
   173
    "Add anObject to the receiver (if not already included). 
1915
c7fbd33fc982 Clean up code and document differences between #add: and #addLast:
Stefan Vogel <sv@exept.de>
parents: 1603
diff changeset
   174
     Also, remember in the order (i.e. add to the end)
c7fbd33fc982 Clean up code and document differences between #add: and #addLast:
Stefan Vogel <sv@exept.de>
parents: 1603
diff changeset
   175
     If anAssociation is already present in the receiver,
c7fbd33fc982 Clean up code and document differences between #add: and #addLast:
Stefan Vogel <sv@exept.de>
parents: 1603
diff changeset
   176
     it will be moved to the end. (See also: #add:)"
1322
617cb62991a6 addFirst/removeFirst
Claus Gittinger <cg@exept.de>
parents: 1321
diff changeset
   177
1441
79acac990d30 Detect (and deny) nil arguments in #add*: methods (same behavior as Set)
Stefan Vogel <sv@exept.de>
parents: 1410
diff changeset
   178
    anObject isNil ifTrue:[
79acac990d30 Detect (and deny) nil arguments in #add*: methods (same behavior as Set)
Stefan Vogel <sv@exept.de>
parents: 1410
diff changeset
   179
        ^ self invalidElementError.
79acac990d30 Detect (and deny) nil arguments in #add*: methods (same behavior as Set)
Stefan Vogel <sv@exept.de>
parents: 1410
diff changeset
   180
    ].
1915
c7fbd33fc982 Clean up code and document differences between #add: and #addLast:
Stefan Vogel <sv@exept.de>
parents: 1603
diff changeset
   181
    (self includes:anObject) ifTrue:[
c7fbd33fc982 Clean up code and document differences between #add: and #addLast:
Stefan Vogel <sv@exept.de>
parents: 1603
diff changeset
   182
        order remove:anObject ifAbsent:[].
c7fbd33fc982 Clean up code and document differences between #add: and #addLast:
Stefan Vogel <sv@exept.de>
parents: 1603
diff changeset
   183
    ] ifFalse:[
994
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
        super add:anObject.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
    ].
1915
c7fbd33fc982 Clean up code and document differences between #add: and #addLast:
Stefan Vogel <sv@exept.de>
parents: 1603
diff changeset
   186
    order add:anObject.
994
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
    ^ anObject
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
!
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
remove:oldObject ifAbsent:exceptionValueProvider
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
    "remove oldObject from the collection and return it.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
     If it was not in the collection return the value of exceptionValueProvider.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
     WARNING: do not remove elements while iterating over the receiver."
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
    |removedObject|
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
    oldObject isNil ifTrue:[^ exceptionValueProvider value].
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
    (self includes:oldObject) ifFalse:[^ exceptionValueProvider value].        
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
    removedObject := super remove:oldObject 
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
                           ifAbsent:[ ^ exceptionValueProvider value].      
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
    order removeIdentical:removedObject.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
    ^ removedObject
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
    "Modified: / 16.11.2001 / 10:21:07 / cg"
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
!
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
removeAll
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
    "remove all elements from the receiver. Returns the receiver."
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
    super removeAll.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
    order := OrderedCollection new.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
    "Created: / 16.11.2001 / 10:21:40 / cg"
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
!
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
1321
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   219
removeFirst
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   220
    "remove the first object from the collection and return it.
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   221
     If it was not in the collection, raise an error.
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   222
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   223
     WARNING: do not remove elements while iterating over the receiver."
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   224
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   225
    ^ self removeFirstIfAbsent:[self emptyCollectionError].
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   226
!
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   227
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   228
removeFirstIfAbsent:exceptionalValue
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   229
    "remove the first object from the collection and return it.
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   230
     If it was not in the collection, return the value from exceptionalValue.
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   231
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   232
     WARNING: do not remove elements while iterating over the receiver."
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   233
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   234
    |element|
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   235
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   236
    order isEmpty ifTrue:[^ exceptionalValue value].
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   237
    element := order first.
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   238
    ^ self remove:element.
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   239
!
eca7bb81eed4 added removeFirst
Claus Gittinger <cg@exept.de>
parents: 1066
diff changeset
   240
1066
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   241
removeLast
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   242
    "remove the last object from the collection and return it.
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   243
     If it was not in the collection, raise an error.
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   244
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   245
     WARNING: do not remove elements while iterating over the receiver."
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   246
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   247
    ^ self removeLastIfAbsent:[self emptyCollectionError].
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   248
!
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   249
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   250
removeLastIfAbsent:exceptionalValue
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   251
    "remove the last object from the collection and return it.
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   252
     If it was not in the collection, return the value from exceptionalValue.
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   253
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   254
     WARNING: do not remove elements while iterating over the receiver."
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   255
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   256
    |lastElement|
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   257
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   258
    order isEmpty ifTrue:[^ exceptionalValue value].
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   259
    lastElement := order last.
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   260
    ^ self remove:lastElement.
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   261
!
a333a375cdbe removeLast added
Claus Gittinger <cg@exept.de>
parents: 996
diff changeset
   262
994
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
saveRemove:oldObject 
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
    "remove the element, oldObject from the collection.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
     Return the element 
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
     (could be non-identical to oldObject, since I hash on equality, not on identity).
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
     If it was not in the collection return nil.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
     In contrast to #remove:, this does not resize the underlying collection
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
     and therefore does NOT rehash & change the elements order.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
     Therefor this can be used while enumerating the receiver,
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
     which is not possible if #remove: is used.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
     WARNING: since no resizing is done, the physical amount of memory used
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
              by the container remains the same, although the logical size shrinks.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
              You may want to manually resize the receiver using #emptyCheck.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
              (after the loop)"
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
    |removedObject|
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
    removedObject := super saveRemove:oldObject.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
    removedObject notNil ifTrue:[
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
        order removeIdentical:removedObject.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
    ].
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
    ^ removedObject
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
    "Created: / 16.11.2001 / 10:23:48 / cg"
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
    "Modified: / 16.11.2001 / 10:24:03 / cg"
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
! !
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
!OrderedSet methodsFor:'copying'!
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
postCopy
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
    "have to copy the keyArray too"
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
    super postCopy.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
    order := order copy.
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
    "Created: / 16.11.2001 / 10:28:50 / cg"
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
! !
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
!OrderedSet methodsFor:'enumerating'!
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
do:aBlock 
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
    "Evaluate aBlock for each of the sets's values."
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
    order do:[:val | aBlock value:val ]
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   309
    "Modified: / 16.11.2001 / 10:04:00 / cg"
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
! !
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
1410
db8baea0469d Implementing method: '#indexOf:'.
martin
parents: 1409
diff changeset
   312
!OrderedSet methodsFor:'enumerting & searching'!
db8baea0469d Implementing method: '#indexOf:'.
martin
parents: 1409
diff changeset
   313
db8baea0469d Implementing method: '#indexOf:'.
martin
parents: 1409
diff changeset
   314
indexOf:anObject
db8baea0469d Implementing method: '#indexOf:'.
martin
parents: 1409
diff changeset
   315
db8baea0469d Implementing method: '#indexOf:'.
martin
parents: 1409
diff changeset
   316
    ^ order indexOf:anObject.
db8baea0469d Implementing method: '#indexOf:'.
martin
parents: 1409
diff changeset
   317
! !
db8baea0469d Implementing method: '#indexOf:'.
martin
parents: 1409
diff changeset
   318
994
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
!OrderedSet methodsFor:'initialization'!
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
1571
fa44f16fd6cd proper #initialize
Claus Gittinger <cg@exept.de>
parents: 1441
diff changeset
   321
initializeOrder
994
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
    order := OrderedCollection new
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
    "Created: / 16.11.2001 / 10:06:05 / cg"
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
! !
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
!OrderedSet class methodsFor:'documentation'!
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   328
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
version
1915
c7fbd33fc982 Clean up code and document differences between #add: and #addLast:
Stefan Vogel <sv@exept.de>
parents: 1603
diff changeset
   330
    ^ '$Header: /cvs/stx/stx/libbasic2/Attic/OrderedSet.st,v 1.13 2007-11-21 17:24:02 stefan Exp $'
994
40468e33fbf7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
! !