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