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