Heap.st
author Stefan Vogel <sv@exept.de>
Wed, 21 Nov 2007 18:24:07 +0100
changeset 1917 61c602336f3d
parent 1880 fc8f61ef410a
child 2353 cce275e4b3ae
permissions -rw-r--r--
Clean up code and document differences between #add: and #addLast:
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
fc8f61ef410a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
Heap comment:'Class Heap implements a special data structure commonly referred to as ''heap''. Heaps are more efficient than SortedCollections if:
a) Elements are only removed at the beginning
b) Elements are added with arbitrary sort order.
The sort time for a heap is O(n log n) in all cases.

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