SeqCollSorter.st
author Claus Gittinger <cg@exept.de>
Tue, 06 Feb 1996 20:01:35 +0100
changeset 183 01781ca31dad
parent 182 2ba5785a441e
child 184 9200f060f2dc
permissions -rw-r--r--
really use #<= for comparing (used #<)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
182
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
Object subclass:#SequenceableCollectionSorter
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
	instanceVariableNames:'collection atSelector putSelector sizeSelector sortBlock'
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
	classVariableNames:'DefaultSortBlock'
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
	poolDictionaries:''
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
	category:'Collections-Support'
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
!SequenceableCollectionSorter class methodsFor:'documentation'!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
documentation
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
    a SequenceableCollectionSorter allows for anything which responds to
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
    keyed at/atPut messages to be sorted just like a SequenceableCollection.
183
01781ca31dad really use #<= for comparing (used #<)
Claus Gittinger <cg@exept.de>
parents: 182
diff changeset
    14
    Since the access messages can be customized, even non collections
01781ca31dad really use #<= for comparing (used #<)
Claus Gittinger <cg@exept.de>
parents: 182
diff changeset
    15
    (or collection simulators, models etc.) can be sorted with these sorters.
182
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
    (use #atSelector: / #putSelector: and #sizeSelector: for customization).
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
    As with collection sorting, the sortBlock can be specified and defaults to
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
    a block which compares using #< messages.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
examples
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
    |a sorter|
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
    a := #(10 5 2 17 5 99 -5).
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
    sorter := SequenceableCollectionSorter on:a.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
    sorter sort.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
    Transcript showCr:a printString
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
! !
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
!SequenceableCollectionSorter class methodsFor:'initialization'!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
initialize
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
    DefaultSortBlock := [:a :b | a <= b]
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
    "
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
     SequenceableCollectionSorter initialize
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
    "
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
    "Modified: 6.2.1996 / 15:47:48 / cg"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
! !
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
!SequenceableCollectionSorter class methodsFor:'instance creation'!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
on:aCollection
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
    ^ self new collection:aCollection; sortBlock:DefaultSortBlock
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
    "Created: 6.2.1996 / 15:39:09 / cg"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
    "Modified: 6.2.1996 / 16:07:36 / cg"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
on:aCollection using:aTwoArgBlock
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
    ^ self new collection:aCollection; sortBlock:aTwoArgBlock
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
    "Created: 6.2.1996 / 15:39:32 / cg"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
sort:aCollection
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
    (self new collection:aCollection; sortBlock:DefaultSortBlock) sort
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
    "Created: 6.2.1996 / 15:40:04 / cg"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
    "Modified: 6.2.1996 / 16:07:42 / cg"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
sort:aCollection using:aTwoArgBlock
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
    (self new collection:aCollection; sortBlock:aTwoArgBlock) sort
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
    "Created: 6.2.1996 / 15:39:58 / cg"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
! !
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
!SequenceableCollectionSorter methodsFor:'accessing'!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
atSelector:aSymbol
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
    "set the selector to access elements.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
     If nil (the default), elements are accessed via #at:"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
    atSelector := aSymbol
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
    "Created: 6.2.1996 / 15:35:49 / cg"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
collection
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
    "return the collections being sorted."
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
    ^ collection
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
    "Created: 6.2.1996 / 15:37:02 / cg"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
collection:aCollection
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
    "set the collections being sorted."
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
    collection := aCollection
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
    "Created: 6.2.1996 / 15:37:20 / cg"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
putSelector:aSymbol
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
    "set the selector to access elements.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
     If nil (the default), elements are accessed via #at:put:"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
    putSelector := aSymbol
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
    "Created: 6.2.1996 / 15:36:14 / cg"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
sizeSelector:aSymbol
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
    "set the selector to get the collections size.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
     If nil (the default), elements are accessed via #size"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
    sizeSelector := aSymbol
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
    "Created: 6.2.1996 / 15:36:33 / cg"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
sortBlock
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
    "return the sortBlock which is used to compare two elements.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
     The default sortBlock compares elements by sending the #< message."
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
    ^ sortBlock
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
    "Created: 6.2.1996 / 15:38:32 / cg"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
sortBlock:aTwoArgBlock 
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
    "set the sortBlock which is used to compare two elements.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
     The default sortBlock compares elements by sending the #< message."
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
    sortBlock := aTwoArgBlock
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
    "Created: 6.2.1996 / 15:38:20 / cg"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
! !
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
!SequenceableCollectionSorter methodsFor:'sorting'!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
defaultSort:inBegin to:inEnd
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
    "actual sort worker for sorting when the sortBlock is nil (or the default)
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
     and default atSelector/putSelectors are to be used."
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
    |begin   "{ Class: SmallInteger }"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
     end     "{ Class: SmallInteger }"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
     b       "{ Class: SmallInteger }"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
     e       "{ Class: SmallInteger }"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
     middleElement temp1 temp2 |
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
    begin := inBegin.   "/ this also does a type-check
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
    end := inEnd.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
    b := begin.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
    e := end.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
    middleElement := collection at:((b + e) // 2).
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
    [b < e] whileTrue:[
183
01781ca31dad really use #<= for comparing (used #<)
Claus Gittinger <cg@exept.de>
parents: 182
diff changeset
   157
        [b < end and:[(collection at:b) <= middleElement]] whileTrue:[b := b + 1].
01781ca31dad really use #<= for comparing (used #<)
Claus Gittinger <cg@exept.de>
parents: 182
diff changeset
   158
        [e > begin and:[middleElement <= (collection at:e)]] whileTrue:[e := e - 1].
182
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
        (b <= e) ifTrue:[
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
            (b == e) ifFalse:[
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
                temp1 := collection at:b. temp2 := collection at:e. 
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
                collection at:b put:temp2. collection at:e put:temp1
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
            ].
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
            b := b + 1.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
            e := e - 1
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
        ]
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
    ].
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
    (begin < e) ifTrue:[self defaultSort:begin to:e].
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
    (b < end) ifTrue:[self defaultSort:b to:end]
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
    "Created: 6.2.1996 / 15:44:37 / cg"
183
01781ca31dad really use #<= for comparing (used #<)
Claus Gittinger <cg@exept.de>
parents: 182
diff changeset
   173
    "Modified: 6.2.1996 / 18:00:56 / cg"
182
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
nonDefaultSort:inBegin to:inEnd
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
    "actual sort worker for sorting when a non default sortBlock
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
     or access selectors are used."
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
    |begin   "{ Class: SmallInteger }"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
     end     "{ Class: SmallInteger }"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
     b       "{ Class: SmallInteger }"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
     e       "{ Class: SmallInteger }"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
     middleElement temp1 temp2 |
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
    begin := inBegin.   "/ this also does a type-check
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
    end := inEnd.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
    b := begin.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
    e := end.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
    middleElement := collection perform:atSelector with:((b + e) // 2).
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
    [b < e] whileTrue:[
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
        [b < end 
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
        and:[sortBlock 
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
                value:(collection perform:atSelector with:b)
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
                value:middleElement]] 
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
        whileTrue:[b := b + 1].
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
        [e > begin 
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
        and:[sortBlock
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
                value:middleElement
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
                value:(collection perform:atSelector with:e)]] 
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
        whileTrue:[e := e - 1].
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
        (b <= e) ifTrue:[
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
            (b == e) ifFalse:[
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
                temp1 := (collection perform:atSelector with:b). 
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
                temp2 := (collection perform:atSelector with:e). 
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
                collection perform:putSelector with:b with:temp2. 
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
                collection perform:putSelector with:e with:temp1.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
            ].
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
            b := b + 1.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
            e := e - 1
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
        ]
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
    ].
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
    (begin < e) ifTrue:[self nonDefaultSort:begin to:e].
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
    (b < end) ifTrue:[self nonDefaultSort:b to:end]
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
    "Modified: 6.2.1996 / 15:42:51 / cg"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
    "Created: 6.2.1996 / 16:06:46 / cg"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
sort
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
    |sz|
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
    sizeSelector isNil ifTrue:[
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
        sz := collection size
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
    ] ifFalse:[
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
        sz := collection perform:sizeSelector
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
    ].
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
    self sort:1 to:sz
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
    "Created: 6.2.1996 / 15:41:21 / cg"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
sort:from to:to 
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
    "actual sort worker for sort-messages"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
    (atSelector isNil
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
    and:[putSelector isNil
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
    and:[sortBlock isNil or:[sortBlock == DefaultSortBlock]]]) ifTrue:[
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
        self defaultSort:from to:to 
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
    ] ifFalse:[
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
        self nonDefaultSort:from to:to
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
    ].
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
    "Modified: 6.2.1996 / 15:51:50 / cg"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
! !
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
!SequenceableCollectionSorter class methodsFor:'documentation'!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
version
183
01781ca31dad really use #<= for comparing (used #<)
Claus Gittinger <cg@exept.de>
parents: 182
diff changeset
   253
    ^ '$Header: /cvs/stx/stx/libbasic2/Attic/SeqCollSorter.st,v 1.2 1996-02-06 19:01:35 cg Exp $'
182
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
! !
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
SequenceableCollectionSorter initialize!