Heap.st
author Claus Gittinger <cg@exept.de>
Tue, 25 Jun 2019 14:28:51 +0200
changeset 5050 44fa8672d102
parent 4804 79f220616b4c
child 5206 dcadf2efcee0
permissions -rw-r--r--
#DOCUMENTATION by cg class: SharedQueue comment/format in: #next #nextWithTimeout:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1880
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:libbasic2' }"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
3711
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
     3
"{ NameSpace: Smalltalk }"
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
     4
1880
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
SequenceableCollection subclass:#Heap
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	instanceVariableNames:'array tally sortBlock'
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
	classVariableNames:''
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
	poolDictionaries:''
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
	category:'Collections-Sequenceable'
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
2353
cce275e4b3ae changed: #examples
Claus Gittinger <cg@exept.de>
parents: 1880
diff changeset
    12
Heap comment:'Class Heap implements a special data structure commonly referred to as ''heap''. Heaps are more efficient than SortedCollections if:
cce275e4b3ae changed: #examples
Claus Gittinger <cg@exept.de>
parents: 1880
diff changeset
    13
a) Elements are only removed at the beginning
cce275e4b3ae changed: #examples
Claus Gittinger <cg@exept.de>
parents: 1880
diff changeset
    14
b) Elements are added with arbitrary sort order.
cce275e4b3ae changed: #examples
Claus Gittinger <cg@exept.de>
parents: 1880
diff changeset
    15
The sort time for a heap is O(n log n) in all cases.
cce275e4b3ae changed: #examples
Claus Gittinger <cg@exept.de>
parents: 1880
diff changeset
    16
Instance variables:
cce275e4b3ae changed: #examples
Claus Gittinger <cg@exept.de>
parents: 1880
diff changeset
    17
	array		<Array>		the data repository
cce275e4b3ae changed: #examples
Claus Gittinger <cg@exept.de>
parents: 1880
diff changeset
    18
	tally		<Integer>	the number of elements in the heap
cce275e4b3ae changed: #examples
Claus Gittinger <cg@exept.de>
parents: 1880
diff changeset
    19
	sortBlock	<Block|nil>	a two-argument block defining the sort order,
cce275e4b3ae changed: #examples
Claus Gittinger <cg@exept.de>
parents: 1880
diff changeset
    20
							or nil in which case the default sort order is
cce275e4b3ae changed: #examples
Claus Gittinger <cg@exept.de>
parents: 1880
diff changeset
    21
								[:element1 :element2| element1 <= element2]'
1880
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
!Heap class methodsFor:'instance creation'!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
new
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
	^self new: 10
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
new: n
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
	^super new setCollection: (Array new: n)
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
sortBlock: aBlock
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
	"Create a new heap sorted by the given block"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
	^self new sortBlock: aBlock
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
withAll: aCollection
2965
a93f50f1c830 Refactor:
Stefan Vogel <sv@exept.de>
parents: 2928
diff changeset
    41
        "Create a new heap with all the elements from aCollection"
a93f50f1c830 Refactor:
Stefan Vogel <sv@exept.de>
parents: 2928
diff changeset
    42
        ^(self basicNew)
a93f50f1c830 Refactor:
Stefan Vogel <sv@exept.de>
parents: 2928
diff changeset
    43
                setCollection: aCollection asNewArray tally: aCollection size;
a93f50f1c830 Refactor:
Stefan Vogel <sv@exept.de>
parents: 2928
diff changeset
    44
                reSort;
a93f50f1c830 Refactor:
Stefan Vogel <sv@exept.de>
parents: 2928
diff changeset
    45
                yourself
1880
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
withAll: aCollection sortBlock: sortBlock
2965
a93f50f1c830 Refactor:
Stefan Vogel <sv@exept.de>
parents: 2928
diff changeset
    49
        "Create a new heap with all the elements from aCollection"
a93f50f1c830 Refactor:
Stefan Vogel <sv@exept.de>
parents: 2928
diff changeset
    50
        ^(self basicNew)
a93f50f1c830 Refactor:
Stefan Vogel <sv@exept.de>
parents: 2928
diff changeset
    51
                setCollection: aCollection asNewArray tally: aCollection size;
a93f50f1c830 Refactor:
Stefan Vogel <sv@exept.de>
parents: 2928
diff changeset
    52
                sortBlock: sortBlock;
a93f50f1c830 Refactor:
Stefan Vogel <sv@exept.de>
parents: 2928
diff changeset
    53
                yourself
1880
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
! !
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
!Heap class methodsFor:'examples'!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
documentation
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
    Class Heap implements a special data structure commonly referred to as 'heap'.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
    Heaps are more efficient than SortedCollections if:
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
        a) Elements are only removed at the beginning
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
        b) Elements are added with arbitrary sort order.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
    The sort time for a heap is O(n log n) in all cases.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
    Instance variables:
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
        array           <Array>         the data repository
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
        tally           <Integer>       the number of elements in the heap
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
        sortBlock       <Block|nil>     a two-argument block defining the sort order,
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
                                        or nil in which case the default sort order is
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
                                            [:element1 :element2| element1 <= element2]
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
    "Created: / 31-05-2007 / 14:53:44 / cg"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
examples
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
    Create a sorted collection of numbers, remove the elements
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
    sequentially and add new objects randomly.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
    Note: This is the kind of benchmark a heap is designed for.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
                                                                             [exBegin]
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
        | n rnd array time sorted |
2353
cce275e4b3ae changed: #examples
Claus Gittinger <cg@exept.de>
parents: 1880
diff changeset
    84
        n := 50000. 
1880
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
        rnd := Random new.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
        array := (1 to: n) collect:[:i| rnd next].
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
        time := Time millisecondsToRun:[
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
                sorted := Heap withAll: array.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
                1 to: n do:[:i| 
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
                        sorted removeFirst.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
                        sorted add: rnd next].
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
        ].
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
        Transcript showCR:'Time for Heap: ', time printString,' msecs'.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
        time := Time millisecondsToRun:[
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
                sorted := SortedCollection withAll: array.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
                1 to: n do:[:i| 
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
                        sorted removeFirst.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
                        sorted add: rnd next].
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
        ].
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
        Transcript showCR:'Time for SortedCollection: ', time printString,' msecs'.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
                                                                             [exEnd]
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
    Sort a random collection of Floats and compare the results with
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
    SortedCollection (using the quick-sort algorithm) and 
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
                                                                             [exBegin]
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
        | n rnd array out time sorted |
2353
cce275e4b3ae changed: #examples
Claus Gittinger <cg@exept.de>
parents: 1880
diff changeset
   109
        n := 40000. 
1880
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
        rnd := Random new.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
        array := (1 to: n) collect:[:i| rnd next].
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
        out := Array new: n. 
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
        time := Time millisecondsToRun:[
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
                sorted := Heap withAll: array.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
                1 to: n do:[:i| sorted removeFirst].
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
        ].
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
        Transcript showCR:'Time for heap-sort: ', time printString,' msecs'.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
        time := Time millisecondsToRun:[
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
                sorted := SortedCollection withAll: array.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
        ].
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
        Transcript showCR:'Time for quick-sort: ', time printString,' msecs'.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
                                                                             [exEnd]
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
    "Created: / 31-05-2007 / 14:46:59 / cg"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
! !
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
!Heap methodsFor:'accessing'!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
at: index
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
        "Return the element at the given position within the receiver"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
        (index < 1 or:[index > tally]) ifTrue:[^self subscriptBoundsError: "errorSubscriptBounds:" index].
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
        ^array at: index
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
    "Modified: / 31-05-2007 / 14:44:58 / cg"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
at: index put: newObject
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
	"Heaps are accessed with #add: not #at:put:"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
	^self shouldNotImplement
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
first
2806
589bf1d35322 changed: #first
Stefan Vogel <sv@exept.de>
parents: 2353
diff changeset
   146
    "Return the first element in the receiver"
589bf1d35322 changed: #first
Stefan Vogel <sv@exept.de>
parents: 2353
diff changeset
   147
589bf1d35322 changed: #first
Stefan Vogel <sv@exept.de>
parents: 2353
diff changeset
   148
    self isEmpty ifTrue:[
589bf1d35322 changed: #first
Stefan Vogel <sv@exept.de>
parents: 2353
diff changeset
   149
       ^ self emptyCollectionError.
589bf1d35322 changed: #first
Stefan Vogel <sv@exept.de>
parents: 2353
diff changeset
   150
    ].
589bf1d35322 changed: #first
Stefan Vogel <sv@exept.de>
parents: 2353
diff changeset
   151
    ^ array at: 1
589bf1d35322 changed: #first
Stefan Vogel <sv@exept.de>
parents: 2353
diff changeset
   152
589bf1d35322 changed: #first
Stefan Vogel <sv@exept.de>
parents: 2353
diff changeset
   153
    "
589bf1d35322 changed: #first
Stefan Vogel <sv@exept.de>
parents: 2353
diff changeset
   154
      Heap new first
589bf1d35322 changed: #first
Stefan Vogel <sv@exept.de>
parents: 2353
diff changeset
   155
    "
1880
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
firstOrNil
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
	tally = 0 ifTrue:[^nil] ifFalse:[^array at: 1]
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
reSort
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
	"Resort the entire heap"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
	self isEmpty ifTrue:[^self].
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
	tally // 2 to: 1 by: -1 do:[:i| self downHeap: i].
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
size
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
	"Answer how many elements the receiver contains."
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
	^ tally
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
sortBlock
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
	^sortBlock
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
sortBlock: aBlock
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
	sortBlock := aBlock.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
	sortBlock fixTemps.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
	self reSort.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
! !
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
!Heap methodsFor:'adding'!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
add: anObject
2928
051fa8fdbf5d comment/format in: #add:
Claus Gittinger <cg@exept.de>
parents: 2806
diff changeset
   187
    "Include newObject as one of the receiver's elements. Answer newObject."
051fa8fdbf5d comment/format in: #add:
Claus Gittinger <cg@exept.de>
parents: 2806
diff changeset
   188
    tally = array size ifTrue:[self grow].
051fa8fdbf5d comment/format in: #add:
Claus Gittinger <cg@exept.de>
parents: 2806
diff changeset
   189
    array at: (tally := tally + 1) put: anObject.
051fa8fdbf5d comment/format in: #add:
Claus Gittinger <cg@exept.de>
parents: 2806
diff changeset
   190
    self upHeap: tally.
051fa8fdbf5d comment/format in: #add:
Claus Gittinger <cg@exept.de>
parents: 2806
diff changeset
   191
    ^anObject
1880
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
! !
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
!Heap methodsFor:'comparing'!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
= anObject
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
	^ self == anObject
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
		ifTrue: [true]
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
		ifFalse: [anObject isHeap
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
			ifTrue: [sortBlock = anObject sortBlock and: [super = anObject]]
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
			ifFalse: [super = anObject]]
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
! !
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
!Heap methodsFor:'enumerating'!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
do: aBlock
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
	"Evaluate aBlock with each of the receiver's elements as the argument."
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
	1 to: tally do:[:i| aBlock value: (array at: i)]
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
! !
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
!Heap methodsFor:'growing'!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
grow
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
	"Become larger."
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
	self growTo: self size + self growSize.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
growSize
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
	"Return the size by which the receiver should grow if there are no empty slots left."
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
	^array size max: 5
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
growTo: newSize
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
	"Grow to the requested size."
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
	| newArray |
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
	newArray := Array new: (newSize max: tally).
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
	newArray replaceFrom: 1 to: array size with: array startingAt: 1.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
	array := newArray
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
trim
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
	"Remove any empty slots in the receiver."
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
	self growTo: self size.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
! !
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
!Heap methodsFor:'private'!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
array
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
	^array
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
privateRemoveAt: index
3711
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   244
    "Remove the element at the given index and make sure the sorting order is okay.
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   245
     Return the removed object"
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   246
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   247
    | removed |
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   248
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   249
    removed := array at: index.
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   250
    array at: index put: (array at: tally).
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   251
    array at: tally put: nil.
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   252
    tally := tally - 1.
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   253
    index > tally ifFalse:[
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   254
        "Use #downHeapSingle: since only one element has been removed"
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   255
        self downHeapSingle: index
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   256
    ].
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   257
    ^removed
1880
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
setCollection: aCollection
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
	array := aCollection.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
	tally := 0.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
setCollection: aCollection tally: newTally
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
	array := aCollection.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
	tally := newTally.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
species
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
	^ Array
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
! !
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
!Heap methodsFor:'private-heap'!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
downHeap: anIndex
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
	"Check the heap downwards for correctness starting at anIndex.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
	 Everything above (i.e. left of) anIndex is ok."
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
	| value k n j |
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
	anIndex = 0 ifTrue:[^self].
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
	n := tally bitShift: -1.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
	k := anIndex.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
	value := array at: anIndex.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
	[k <= n] whileTrue:[
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
		j := k + k.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
		"use max(j,j+1)"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
		(j < tally and:[self sorts: (array at: j+1) before: (array at: j)])
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
				ifTrue:[ j := j + 1].
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
		"check if position k is ok"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
		(self sorts: value before: (array at: j)) 
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
			ifTrue:[	"yes -> break loop"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
					n := k - 1]
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
			ifFalse:[	"no -> make room at j by moving j-th element to k-th position"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
					array at: k put: (array at: j).
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
					"and try again with j"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
					k := j]].
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
	array at: k put: value.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
downHeapSingle: anIndex
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
	"This version is optimized for the case when only one element in the receiver can be at a wrong position. It avoids one comparison at each node when travelling down the heap and checks the heap upwards after the element is at a bottom position. Since the probability for being at the bottom of the heap is much larger than for being somewhere in the middle this version should be faster."
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
	| value k n j |
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
	anIndex = 0 ifTrue:[^self].
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
	n := tally bitShift: -1.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
	k := anIndex.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
	value := array at: anIndex.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
	[k <= n] whileTrue:[
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
		j := k + k.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   309
		"use max(j,j+1)"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
		(j < tally and:[self sorts: (array at: j+1) before: (array at: j)])
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
				ifTrue:[	j := j + 1].
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
		array at: k put: (array at: j).
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
		"and try again with j"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
		k := j].
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
	array at: k put: value.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
	self upHeap: k
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
upHeap: anIndex
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
	"Check the heap upwards for correctness starting at anIndex.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   321
	 Everything below anIndex is ok."
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
	| value k kDiv2 tmp |
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
	anIndex = 0 ifTrue:[^self].
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
	k := anIndex.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
	value := array at: anIndex.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
	[ (k > 1) and:[self sorts: value before: (tmp := array at: (kDiv2 := k bitShift: -1))] ] 
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
		whileTrue:[
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   328
			array at: k put: tmp.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
			k := kDiv2].
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
	array at: k put: value.
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
! !
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
4804
79f220616b4c #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4285
diff changeset
   333
!Heap methodsFor:'queries'!
79f220616b4c #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4285
diff changeset
   334
79f220616b4c #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4285
diff changeset
   335
isEmpty
79f220616b4c #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4285
diff changeset
   336
	"Answer whether the receiver contains any elements."
79f220616b4c #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4285
diff changeset
   337
	^tally = 0
79f220616b4c #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4285
diff changeset
   338
!
79f220616b4c #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4285
diff changeset
   339
79f220616b4c #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4285
diff changeset
   340
sorts: element1 before: element2
79f220616b4c #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4285
diff changeset
   341
        "Return true if element1 should be sorted before element2.
79f220616b4c #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4285
diff changeset
   342
        This method defines the sort order in the receiver"
79f220616b4c #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4285
diff changeset
   343
        
79f220616b4c #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4285
diff changeset
   344
        ^sortBlock isNil
79f220616b4c #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4285
diff changeset
   345
                ifTrue:[element1 <= element2]
79f220616b4c #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4285
diff changeset
   346
                ifFalse:[sortBlock value: element1 value: element2].
79f220616b4c #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4285
diff changeset
   347
! !
79f220616b4c #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4285
diff changeset
   348
1880
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
!Heap methodsFor:'removing'!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
remove: oldObject ifAbsent: aBlock
3711
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   352
    "Remove the first occurrence of oldObject as one of the receiver's elements. 
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   353
     If several of the elements are equal to oldObject, only one is removed. 
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   354
     If no element is equal to oldObject, answer the result of evaluating anExceptionBlock. 
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   355
     Otherwise, answer the removed object
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   356
     (which may be non-identical, but equal to oldObject)"
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   357
     
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   358
    1 to: tally do:[:i| 
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   359
        (array at: i) = oldObject ifTrue:[^self privateRemoveAt: i]
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   360
    ].
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   361
    ^aBlock value
1880
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   362
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   363
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   364
removeAt: index
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   365
        "Remove the element at given position"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   366
        (index < 1 or:[index > tally]) ifTrue:[^self subscriptBoundsError: "errorSubscriptBounds:" index].
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   367
        ^self privateRemoveAt: index
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   368
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   369
    "Modified: / 31-05-2007 / 14:45:42 / cg"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   372
removeFirst
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   373
	"Remove the first element from the receiver"
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   374
	^self removeAt: 1
3711
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   375
!
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   376
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   377
removeIdentical: oldObject ifAbsent: aBlock
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   378
    "Remove the first occurrence of oldObject as one of the receiver's elements. 
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   379
     If oldObject is present multiple times, only the first occurrence is removed. 
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   380
     If oldObject is not present, answer the result of evaluating anExceptionBlock. 
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   381
     Otherwise, answer the argument, oldObject."
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   382
     
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   383
    1 to: tally do:[:i| 
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   384
        (array at: i) == oldObject ifTrue:[^self privateRemoveAt: i]
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   385
    ].
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   386
    ^aBlock value
1880
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   387
! !
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   388
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   389
!Heap methodsFor:'testing'!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   390
3017
ab364a8619f9 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2965
diff changeset
   391
isFixedSize
ab364a8619f9 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2965
diff changeset
   392
    "return true if the receiver cannot grow"
ab364a8619f9 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2965
diff changeset
   393
ab364a8619f9 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2965
diff changeset
   394
    ^ false
ab364a8619f9 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2965
diff changeset
   395
!
ab364a8619f9 added isFixedSize query
Claus Gittinger <cg@exept.de>
parents: 2965
diff changeset
   396
1880
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   397
isHeap
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   398
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   399
	^ true
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   400
! !
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   401
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   402
!Heap class methodsFor:'documentation'!
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   403
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   404
version
3711
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   405
    ^ '$Header$'
2353
cce275e4b3ae changed: #examples
Claus Gittinger <cg@exept.de>
parents: 1880
diff changeset
   406
!
cce275e4b3ae changed: #examples
Claus Gittinger <cg@exept.de>
parents: 1880
diff changeset
   407
cce275e4b3ae changed: #examples
Claus Gittinger <cg@exept.de>
parents: 1880
diff changeset
   408
version_CVS
3711
2f73ab944d25 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3017
diff changeset
   409
    ^ '$Header$'
1880
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   410
! !
2928
051fa8fdbf5d comment/format in: #add:
Claus Gittinger <cg@exept.de>
parents: 2806
diff changeset
   411