SequenceableCollectionSorter.st
author Claus Gittinger <cg@exept.de>
Thu, 06 Sep 2007 17:31:09 +0200
changeset 1894 8bf137acc445
parent 585 ab03e26e2df1
child 4281 c0457c1b6e53
permissions -rw-r--r--
if no unit is given in the readString, assume seconds.
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.
350
93d5932c76e6 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 184
diff changeset
    30
    Transcript showCR:a printString
182
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)
184
9200f060f2dc commentary
Claus Gittinger <cg@exept.de>
parents: 183
diff changeset
   141
     and default atSelector/putSelectors are to be used.
9200f060f2dc commentary
Claus Gittinger <cg@exept.de>
parents: 183
diff changeset
   142
     This will execute slightly faster, since no #perform-indirection is needed."
182
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
    |begin   "{ Class: SmallInteger }"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
     end     "{ Class: SmallInteger }"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
     b       "{ Class: SmallInteger }"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
     e       "{ Class: SmallInteger }"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
     middleElement temp1 temp2 |
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
    begin := inBegin.   "/ this also does a type-check
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
    end := inEnd.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
    b := begin.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
    e := end.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
    middleElement := collection at:((b + e) // 2).
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
    [b < e] whileTrue:[
183
01781ca31dad really use #<= for comparing (used #<)
Claus Gittinger <cg@exept.de>
parents: 182
diff changeset
   158
        [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
   159
        [e > begin and:[middleElement <= (collection at:e)]] whileTrue:[e := e - 1].
182
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
        (b <= e) ifTrue:[
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
            (b == e) ifFalse:[
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
                temp1 := collection at:b. temp2 := collection at:e. 
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
                collection at:b put:temp2. collection at:e put:temp1
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
            ].
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
            b := b + 1.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
            e := e - 1
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
        ]
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
    ].
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
    (begin < e) ifTrue:[self defaultSort:begin to:e].
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
    (b < end) ifTrue:[self defaultSort:b to:end]
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
    "Created: 6.2.1996 / 15:44:37 / cg"
184
9200f060f2dc commentary
Claus Gittinger <cg@exept.de>
parents: 183
diff changeset
   174
    "Modified: 6.2.1996 / 18:06:23 / cg"
182
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
585
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   177
nonDefaultSort3:inBegin to:inEnd with:p
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   178
    "actual sort worker for sorting when a non default sortBlock
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   179
     with 3 args (stringSort) is used."
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   180
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   181
    |begin   "{ Class: SmallInteger }"
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   182
     end     "{ Class: SmallInteger }"
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   183
     b       "{ Class: SmallInteger }"
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   184
     e       "{ Class: SmallInteger }"
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   185
     middleElement temp1 temp2 
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   186
     atSel putSel|
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   187
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   188
    atSel := atSelector ? #at:.
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   189
    putSel := putSelector ? #at:put:.
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   190
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   191
    begin := inBegin.   "/ this also does a type-check
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   192
    end := inEnd.
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   193
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   194
    b := begin.
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   195
    e := end.
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   196
    middleElement := collection perform:atSel with:((b + e) // 2).
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   197
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   198
    [b < e] whileTrue:[
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   199
        [b < end 
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   200
        and:[sortBlock 
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   201
                value:p
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   202
                value:(collection perform:atSel with:b)
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   203
                value:middleElement]] 
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   204
        whileTrue:[b := b + 1].
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   205
        [e > begin 
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   206
        and:[sortBlock
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   207
                value:p
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   208
                value:middleElement
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   209
                value:(collection perform:atSel with:e)]] 
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   210
        whileTrue:[e := e - 1].
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   211
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   212
        (b <= e) ifTrue:[
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   213
            (b == e) ifFalse:[
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   214
                temp1 := (collection perform:atSel with:b). 
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   215
                temp2 := (collection perform:atSel with:e). 
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   216
                collection perform:putSel with:b with:temp2. 
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   217
                collection perform:putSel with:e with:temp1.
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   218
            ].
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   219
            b := b + 1.
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   220
            e := e - 1
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   221
        ]
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   222
    ].
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   223
    (begin < e) ifTrue:[self nonDefaultSort3:begin to:e with:p].
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   224
    (b < end) ifTrue:[self nonDefaultSort3:b to:end with:p]
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   225
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   226
    "Modified: / 27.10.1997 / 04:52:41 / cg"
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   227
    "Created: / 27.10.1997 / 18:54:54 / cg"
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   228
!
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   229
182
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
nonDefaultSort:inBegin to:inEnd
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
    "actual sort worker for sorting when a non default sortBlock
184
9200f060f2dc commentary
Claus Gittinger <cg@exept.de>
parents: 183
diff changeset
   232
     or nonNil access selectors are used."
182
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
    |begin   "{ Class: SmallInteger }"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
     end     "{ Class: SmallInteger }"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
     b       "{ Class: SmallInteger }"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
     e       "{ Class: SmallInteger }"
585
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   238
     middleElement temp1 temp2 
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   239
     atSel putSel|
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   240
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   241
    atSel := atSelector ? #at:.
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   242
    putSel := putSelector ? #at:put:.
182
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
    begin := inBegin.   "/ this also does a type-check
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
    end := inEnd.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
    b := begin.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
    e := end.
585
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   249
    middleElement := collection perform:atSel with:((b + e) // 2).
182
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
    [b < e] whileTrue:[
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
        [b < end 
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
        and:[sortBlock 
585
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   254
                value:(collection perform:atSel with:b)
182
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
                value:middleElement]] 
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
        whileTrue:[b := b + 1].
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
        [e > begin 
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
        and:[sortBlock
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
                value:middleElement
585
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   260
                value:(collection perform:atSel with:e)]] 
182
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
        whileTrue:[e := e - 1].
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
        (b <= e) ifTrue:[
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
            (b == e) ifFalse:[
585
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   265
                temp1 := (collection perform:atSel with:b). 
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   266
                temp2 := (collection perform:atSel with:e). 
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   267
                collection perform:putSel with:b with:temp2. 
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   268
                collection perform:putSel with:e with:temp1.
182
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
            ].
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
            b := b + 1.
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
            e := e - 1
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
        ]
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
    ].
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
    (begin < e) ifTrue:[self nonDefaultSort:begin to:e].
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
    (b < end) ifTrue:[self nonDefaultSort:b to:end]
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
585
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   277
    "Created: / 6.2.1996 / 16:06:46 / cg"
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   278
    "Modified: / 27.10.1997 / 04:52:41 / cg"
182
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
sort
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
    |sz|
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
    sizeSelector isNil ifTrue:[
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
        sz := collection size
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
    ] ifFalse:[
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
        sz := collection perform:sizeSelector
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
    ].
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
    self sort:1 to:sz
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
    "Created: 6.2.1996 / 15:41:21 / cg"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
sort:from to:to 
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
    "actual sort worker for sort-messages"
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
    (atSelector isNil
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
    and:[putSelector isNil
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
    and:[sortBlock isNil or:[sortBlock == DefaultSortBlock]]]) ifTrue:[
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
        self defaultSort:from to:to 
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
    ] ifFalse:[
585
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   302
        sortBlock numArgs == 3 ifTrue:[
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   303
            self nonDefaultSort3:from to:to with:nil "p"
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   304
        ] ifFalse:[
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   305
            self nonDefaultSort:from to:to
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   306
        ]
182
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
    ].
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
585
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   309
    "Modified: / 27.10.1997 / 18:55:48 / cg"
182
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
! !
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
!SequenceableCollectionSorter class methodsFor:'documentation'!
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
version
585
ab03e26e2df1 support 3-arg sorting using a collationPolicy
Claus Gittinger <cg@exept.de>
parents: 350
diff changeset
   315
    ^ '$Header: /cvs/stx/stx/libbasic2/SequenceableCollectionSorter.st,v 1.5 1997-10-28 19:17:02 cg Exp $'
182
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
! !
2ba5785a441e intitial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
SequenceableCollectionSorter initialize!