SmallBag.st
author Claus Gittinger <cg@exept.de>
Sat, 02 May 2020 21:40:13 +0200
changeset 5476 7355a4b11cb6
parent 5229 c2f79de039f2
permissions -rw-r--r--
#FEATURE by cg class: Socket class added: #newTCPclientToHost:port:domain:domainOrder:withTimeout: changed: #newTCPclientToHost:port:domain:withTimeout:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5229
c2f79de039f2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4802
diff changeset
     1
"{ Encoding: utf8 }"
c2f79de039f2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4802
diff changeset
     2
2876
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
"
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
 COPYRIGHT (c) 2013 by Claus Gittinger
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
              All Rights Reserved
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 This software is furnished under a license and may be used
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 only in accordance with the terms of that license and with the
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 inclusion of the above copyright notice.   This software may not
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 be provided or otherwise made available to, or used by, any
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
 other person.  No title to or ownership of the software is
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
 hereby transferred.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
"
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
"{ Package: 'stx:libbasic2' }"
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
4802
e9cd23548087 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 2876
diff changeset
    16
"{ NameSpace: Smalltalk }"
e9cd23548087 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 2876
diff changeset
    17
2876
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
Bag subclass:#SmallBag
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
	instanceVariableNames:''
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
	classVariableNames:''
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
	poolDictionaries:''
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
	category:'Collections-Unordered'
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
!
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
!SmallBag class methodsFor:'documentation'!
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
copyright
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
"
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
 COPYRIGHT (c) 2013 by Claus Gittinger
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
              All Rights Reserved
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
 This software is furnished under a license and may be used
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
 only in accordance with the terms of that license and with the
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
 inclusion of the above copyright notice.   This software may not
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
 be provided or otherwise made available to, or used by, any
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
 other person.  No title to or ownership of the software is
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
 hereby transferred.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
"
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
!
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
documentation
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
"
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
    SmallBag behaves like Bag, but is tuned for a small number of distinct objects (in the order of 10),
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
    by not using a dictionary, but a linear array holding count-value pairs in consecutive slots.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
    Only use it when many small bags are required, as this will be slower if too many (distinct) elements are added.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
    [Instance variables:]
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
        contents        <Array>    holds count/value info in consecutive slots
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
    [author:]
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
        Claus Gittinger
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
    [See also:]
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
        Bag Set IdentitySet
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
        Dictionary IdentityDictionary
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
        OrderedCollection Array
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
"
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
! !
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
!SmallBag methodsFor:'accessing'!
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
contents
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
    "return the dictionary which associates occurrence-counts
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
     to the bags elements."
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
    |d|
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
    d := Dictionary new.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
    1 to:contents size-1 by:2 do:[:countIndex | 
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
       |count object|
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
        (count := contents at:countIndex) > 0 ifTrue:[
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
            object := (contents at:countIndex+1).
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
            d at:object put:count
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
        ].
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
    ].
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
    ^ d
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
    "
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
     SmallBag new contents     
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
     SmallBag new size     
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
    "
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
! !
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
!SmallBag methodsFor:'adding & removing'!
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
add:newObject
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
    "add the argument, anObject to the receiver.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
     Returns the object.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
     WARNING: do not add/remove elements while iterating over the receiver.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
              Iterate over a copy to do this."
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
    ^ self add:newObject withOccurrences:1
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
!
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
add:newObject withOccurrences:nMore
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
    "add the argument, anObject anInteger times to the receiver.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
     Returns the object.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
     WARNING: do not add/remove elements while iterating over the receiver.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
              Iterate over a copy to do this."
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
    |firstEmptySlot newContents|
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
    1 to:contents size-1 by:2 do:[:countIndex |
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
        |count|
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
        count := contents at:countIndex.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
        (contents at:countIndex+1) = newObject ifTrue:[
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
            contents at:countIndex put:count + nMore.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
            ^ newObject.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
        ].
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
        count == 0 ifTrue:[ firstEmptySlot := firstEmptySlot ? countIndex ].
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
    ].
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
    "/ not already there
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
    firstEmptySlot isNil ifTrue:[
5229
c2f79de039f2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4802
diff changeset
   120
        newContents := Array new:((contents size * 2) max:4) withAll:0.
2876
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
        newContents replaceFrom:1 with:contents startingAt:1.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
        firstEmptySlot := contents size + 1.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
        contents := newContents.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
    ].
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
    contents at:firstEmptySlot put:nMore.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
    contents at:firstEmptySlot+1 put:newObject.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
    ^ newObject
5229
c2f79de039f2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4802
diff changeset
   128
c2f79de039f2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4802
diff changeset
   129
    "Modified: / 22-10-2019 / 20:15:01 / Stefan Vogel"
2876
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
!
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
remove:oldObject ifAbsent:anExceptionBlock
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
    "Remove oldObject from the collection.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
     If it was not present, return the value of the exceptionBlock;
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
     otherwise return the removed object.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
     WARNING: do not add/remove elements while iterating over the receiver.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
              Iterate over a copy to do this."
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
    1 to:contents size by:2 do:[:countIndex |
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
        |count el|
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
        count := contents at:countIndex.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
        (el := contents at:countIndex+1) = oldObject ifTrue:[
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
            contents at:countIndex put:count - 1.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
            ^ el.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
        ].
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
    ].
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
    "/ not found
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
    ^  anExceptionBlock value
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
!
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
removeAll
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
    self initContents
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
!
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
removeAllOccurrencesOf:oldObject ifAbsent:anExceptionBlock
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
    "Remove oldObject completely from the collection.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
     If it was not present, return the value of the exceptionBlock;
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
     otherwise return the removed object.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
     WARNING: do not add/remove elements while iterating over the receiver.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
              Iterate over a copy to do this."
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
    1 to:contents size by:2 do:[:countIndex |
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
        |count el|
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
        count := contents at:countIndex.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
        (el := contents at:countIndex+1) = oldObject ifTrue:[
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
            contents at:countIndex put:0.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
            ^ el.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
        ].
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
    ].
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
    "/ not found
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
    ^  anExceptionBlock value
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
! !
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
!SmallBag methodsFor:'converting'!
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
asSet
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
    "return the receiver as a set"
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
    |set|
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
    set := Set new.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
    self valuesAndCountsDo:[:el :n | set add:el ].
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
    ^ set
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
    "
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
     |b|
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
     b := Bag new.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
     b add:1; add:2; add:3; add:1; add:1.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
     b asSet.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
    "
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
! !
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
!SmallBag methodsFor:'enumerating'!
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
do:aBlock
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
    "evaluate the block for all elements in the collection.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
     WARNING: do not add/remove elements while iterating over the receiver.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
              Iterate over a copy to do this."
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
    1 to:contents size by:2 do:[:countIndex|
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
        |count el|
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
        (count := contents at:countIndex) ~~ 0 ifTrue:[
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
            el:= contents at:countIndex+1.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
            count timesRepeat:[ aBlock value: el ]
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
        ]
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
    ]
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
    "Modified: 1.3.1996 / 21:42:39 / cg"
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
!
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
valuesAndCountsDo:aBlock
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
    "evaluate the block for all distinct elements in the collection,
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
     passing both the element and the occurrence count as arguments.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
     WARNING: do not add/remove elements while iterating over the receiver.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
              Iterate over a copy to do this."
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
    1 to:contents size by:2 do:[:countIndex|
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
        |count el|
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
        (count := contents at:countIndex) ~~ 0 ifTrue:[
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
            el:= contents at:countIndex+1.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
            aBlock value: el value:count
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
        ]
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
    ]
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
    "Modified: 1.3.1996 / 21:42:39 / cg"
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
! !
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
!SmallBag methodsFor:'private'!
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
initContents
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
    "set the contents to be an empty contents array"
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
    contents := Array new:10 withAll:0
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
!
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
initContents:size
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
    "set the contents to be an empty contents array with initial size"
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
    contents := Array new:size*2 withAll:0
5229
c2f79de039f2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4802
diff changeset
   251
!
c2f79de039f2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4802
diff changeset
   252
c2f79de039f2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4802
diff changeset
   253
initContentsForEquality:size
c2f79de039f2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4802
diff changeset
   254
    "set the contents to be an empty contents array with initial size"
c2f79de039f2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4802
diff changeset
   255
c2f79de039f2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4802
diff changeset
   256
    self initContents:size
c2f79de039f2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4802
diff changeset
   257
c2f79de039f2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4802
diff changeset
   258
    "Created: / 22-10-2019 / 20:18:07 / Stefan Vogel"
c2f79de039f2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4802
diff changeset
   259
!
c2f79de039f2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4802
diff changeset
   260
c2f79de039f2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4802
diff changeset
   261
initContentsForIdentity:size
c2f79de039f2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4802
diff changeset
   262
    "set the contents to be an empty contents array with initial size"
c2f79de039f2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4802
diff changeset
   263
c2f79de039f2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4802
diff changeset
   264
    self shouldNotImplement
c2f79de039f2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4802
diff changeset
   265
c2f79de039f2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4802
diff changeset
   266
    "Created: / 22-10-2019 / 20:18:29 / Stefan Vogel"
2876
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
! !
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
!SmallBag methodsFor:'queries'!
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
occurrencesOf:anObject
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
    "return how often anObject is in the receiver"
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
    1 to:contents size-1 by:2 do:[:countIndex |
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
        |element|
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
        (contents at:countIndex+1) = anObject ifTrue:[
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
            ^ contents at:countIndex.
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
        ].
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
    ].
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
    ^ 0
4802
e9cd23548087 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 2876
diff changeset
   283
!
e9cd23548087 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 2876
diff changeset
   284
e9cd23548087 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 2876
diff changeset
   285
size
e9cd23548087 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 2876
diff changeset
   286
    "return the number of bag elements"
e9cd23548087 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 2876
diff changeset
   287
e9cd23548087 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 2876
diff changeset
   288
    |count|
e9cd23548087 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 2876
diff changeset
   289
e9cd23548087 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 2876
diff changeset
   290
    count := 0.
e9cd23548087 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 2876
diff changeset
   291
    1 to:contents size-1 by:2 do:[:countIndex | count := count + (contents at:countIndex)].
e9cd23548087 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 2876
diff changeset
   292
    ^ count
2876
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
! !
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
!SmallBag class methodsFor:'documentation'!
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
version
4802
e9cd23548087 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 2876
diff changeset
   298
    ^ '$Header$'
2876
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
!
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
version_CVS
4802
e9cd23548087 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 2876
diff changeset
   302
    ^ '$Header$'
2876
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
! !
1f7a55a699ac initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304