SortedCollection.st
author Claus Gittinger <cg@exept.de>
Thu, 23 Nov 1995 18:07:57 +0100
changeset 629 2ceefe9b5a19
parent 607 a9a526c51233
child 913 7d9881f9c908
permissions -rw-r--r--
version at the end
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1993 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
     3
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
OrderedCollection subclass:#SortedCollection
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    14
	 instanceVariableNames:'sortBlock'
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    15
	 classVariableNames:'DefaultSortBlock'
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    16
	 poolDictionaries:''
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    17
	 category:'Collections-Sequenceable'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    20
!SortedCollection class methodsFor:'documentation'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    22
copyright
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    23
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    24
 COPYRIGHT (c) 1993 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    25
	      All Rights Reserved
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    26
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    27
 This software is furnished under a license and may be used
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    28
 only in accordance with the terms of that license and with the
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    29
 inclusion of the above copyright notice.   This software may not
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    30
 be provided or otherwise made available to, or used by, any
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    31
 other person.  No title to or ownership of the software is
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    32
 hereby transferred.
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    33
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    34
!
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    35
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    36
documentation
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    37
"
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    38
    I keep my elements sorted. The sort order is defined by a sortblock,
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    39
    a two-argument block which, when given two elements of the collection, 
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    40
    should return true if the element given as first arg has to come before the 
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    41
    element given as second arg.
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    42
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    43
    Thus a sortBlock of [:a :b | a < b] defines ascending sort-order,
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    44
    while [:a :b | a > b] defines descening order.
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    45
    The default sortBlock for SortedCollections is the first one.
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    46
"
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    47
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    48
a27a279701f8 Initial revision
claus
parents:
diff changeset
    49
!SortedCollection class methodsFor:'initialization'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    50
a27a279701f8 Initial revision
claus
parents:
diff changeset
    51
initialize
a27a279701f8 Initial revision
claus
parents:
diff changeset
    52
    DefaultSortBlock := [:a :b | a < b ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
    53
a27a279701f8 Initial revision
claus
parents:
diff changeset
    54
    "SortedCollection initialize"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    55
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
    56
a27a279701f8 Initial revision
claus
parents:
diff changeset
    57
!SortedCollection class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    58
a27a279701f8 Initial revision
claus
parents:
diff changeset
    59
new
2
claus
parents: 1
diff changeset
    60
    "return a new sortedCollection, the sorting is done using
claus
parents: 1
diff changeset
    61
     a compare for a > b, in ascending order"
claus
parents: 1
diff changeset
    62
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    63
    ^ super new setSortBlock:DefaultSortBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
    64
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    65
a27a279701f8 Initial revision
claus
parents:
diff changeset
    66
new:size
2
claus
parents: 1
diff changeset
    67
    "return a new sortedCollection with preallocated size.
claus
parents: 1
diff changeset
    68
     The sorting is done using a compare for a > b, in ascending order"
claus
parents: 1
diff changeset
    69
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    70
    ^ (super new:size) setSortBlock:DefaultSortBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
    71
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    72
a27a279701f8 Initial revision
claus
parents:
diff changeset
    73
sortBlock:aBlock
2
claus
parents: 1
diff changeset
    74
    "set the sort-block"
claus
parents: 1
diff changeset
    75
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    76
    ^ super new setSortBlock:aBlock
329
claus
parents: 216
diff changeset
    77
!
claus
parents: 216
diff changeset
    78
claus
parents: 216
diff changeset
    79
withAll:aCollection sortBlock:aBlock
claus
parents: 216
diff changeset
    80
    "initialize from aCollection and set the sort-block"
claus
parents: 216
diff changeset
    81
claus
parents: 216
diff changeset
    82
    ^ (self sortBlock:aBlock) addAll:aCollection
claus
parents: 216
diff changeset
    83
claus
parents: 216
diff changeset
    84
    "
claus
parents: 216
diff changeset
    85
     SortedCollection withAll:#(1 2 3 4 5 6 7 8 9 0)
claus
parents: 216
diff changeset
    86
		      sortBlock:[:a :b | a > b] 
claus
parents: 216
diff changeset
    87
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    88
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
    89
a27a279701f8 Initial revision
claus
parents:
diff changeset
    90
!SortedCollection methodsFor:'adding & removing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    91
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    92
add:anObject
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    93
    "add the argument, anObject at the proper place in the
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    94
     receiver. Returns the argument, anObject."
2
claus
parents: 1
diff changeset
    95
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    96
    |index|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    97
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    98
    lastIndex < firstIndex "i.e. self size == 0" ifTrue:[
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    99
	super add:anObject
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   100
    ] ifFalse:[
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   101
	index := self indexForInserting:anObject. 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   102
	self makeRoomAtIndex:index.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   103
	contentsArray at:index put:anObject
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   104
    ].
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   105
    ^ anObject
2
claus
parents: 1
diff changeset
   106
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   107
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   108
     |c| #(7 3 9 10 99) asSortedCollection add:5; yourself    
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   109
     #(7 3 9 10 99) asSortedCollection add:1; yourself        
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   110
     #(7 3 9 10 99) asSortedCollection add:1000; yourself     
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   111
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   112
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   113
a27a279701f8 Initial revision
claus
parents:
diff changeset
   114
add:newObject after:oldObject
2
claus
parents: 1
diff changeset
   115
    "catch this - its not allowed for sortedCollections"
claus
parents: 1
diff changeset
   116
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   117
    self shouldNotImplement
a27a279701f8 Initial revision
claus
parents:
diff changeset
   118
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   119
a27a279701f8 Initial revision
claus
parents:
diff changeset
   120
add:newObject before:oldObject
2
claus
parents: 1
diff changeset
   121
    "catch this - its not allowed for sortedCollections"
claus
parents: 1
diff changeset
   122
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   123
    self shouldNotImplement
a27a279701f8 Initial revision
claus
parents:
diff changeset
   124
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   125
a27a279701f8 Initial revision
claus
parents:
diff changeset
   126
addAll:aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
   127
    "add all elements of the argument, aCollection to the
a27a279701f8 Initial revision
claus
parents:
diff changeset
   128
     receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   129
a27a279701f8 Initial revision
claus
parents:
diff changeset
   130
    |mySize    "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   131
     otherSize "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   132
     dstIndex  "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   133
     newSize newContents|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   134
a27a279701f8 Initial revision
claus
parents:
diff changeset
   135
    "if aCollection is bigger than a threshhold, its faster
359
claus
parents: 348
diff changeset
   136
     to add all en-bloque and resort the whole collection.
claus
parents: 348
diff changeset
   137
     Question: what is a good treshhold ?"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   138
a27a279701f8 Initial revision
claus
parents:
diff changeset
   139
    mySize := self size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   140
    otherSize := aCollection size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   141
    ((mySize == 0) or:[otherSize > 5]) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   142
	newSize := mySize + otherSize.
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   143
	newContents := Array new:newSize.
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   144
	newContents replaceFrom:1 to:mySize with:contentsArray startingAt:1.
359
claus
parents: 348
diff changeset
   145
	aCollection isSequenceable ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   146
	    "maybe we can do it in one big move"
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   147
	    newContents replaceFrom:(mySize + 1) to:newSize with:aCollection startingAt:1.
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   148
	] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   149
	    dstIndex := mySize + 1.
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   150
	    aCollection do:[:element |
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   151
		newContents at:dstIndex put:element.
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   152
		dstIndex := dstIndex + 1
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   153
	    ]
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   154
	].
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   155
	firstIndex := 1.
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   156
	lastIndex := newSize.
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   157
	contentsArray := newContents.
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   158
	contentsArray sort:sortBlock.
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   159
	^ self
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   160
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   161
    super addAll:aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
   162
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   163
    "
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   164
     #(7 3 9 10 99) asSortedCollection addAll:#(77 0 1 16 5) 
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   165
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   166
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   167
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   168
addFirst:anObject
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   169
    "catch this - its not allowed for sortedCollections"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   170
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   171
    self shouldNotImplement
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   172
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   173
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   174
addLast:anObject
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   175
    "catch this - its not allowed for sortedCollections"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   176
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   177
    self shouldNotImplement
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   178
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   179
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   180
at:index put:anObject
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   181
    "catch this - its not allowed for sortedCollections"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   182
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   183
    self shouldNotImplement
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   184
! !
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   185
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   186
!SortedCollection methodsFor:'converting'!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   187
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   188
asSortedCollection
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   189
    "return the receiver as a sorted collection"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   190
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   191
    "could be an instance of a subclass..."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   192
    self class == SortedCollection ifTrue:[
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   193
	^ self
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   194
    ].
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   195
    ^ super asSortedCollection
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   196
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   197
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   198
!SortedCollection methodsFor:'copying'!
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   199
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   200
copyEmpty:size
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   201
    "return a copy of the receiver with no elements, but
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   202
     the same size. This method has been be redefined to
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   203
     preserve the sortBlock."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   204
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   205
    ^ (self species new:size) sortBlock:sortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   206
!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   207
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   208
postCopyFrom:anOriginal
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   209
    "sent after a copy or when a new collection species has been created.
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   210
     The new collection should have the same sortBlock as the original."
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   211
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   212
    sortBlock := anOriginal sortBlock
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   213
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   214
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   215
     #(4 7 1 99 -1 17) asSortedCollection inspect
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   216
     #(4 7 1 99 -1 17) asSortedCollection copy inspect
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   217
     (#(4 7 1 99 -1 17) asSortedCollection sortBlock:[:a :b | a > b]) inspect
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   218
     (#(4 7 1 99 -1 17) asSortedCollection sortBlock:[:a :b | a > b]) copy inspect
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   219
     (#(4 7 1 99 -1 17) asSortedCollection select:[:e| e even]) inspect
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   220
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   221
! !
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   222
216
a8abff749575 *** empty log message ***
claus
parents: 202
diff changeset
   223
!SortedCollection methodsFor:'enumerating'!
184
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   224
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   225
collect:aBlock
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   226
    "evaluate the argument, aBlock for every element in the collection
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   227
     and return a collection of the results. Redefined to return an OrderedCollection;
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   228
     see X3J20 spec. (SortedCollection>>collect: should return an OrderedCollection)"
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   229
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   230
    |newCollection
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   231
     start  "{ Class:SmallInteger }"
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   232
     stop   "{ Class:SmallInteger }" |
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   233
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   234
    newCollection := OrderedCollection new:(self size).
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   235
    stop := lastIndex.
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   236
    start := firstIndex.
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   237
    start to:stop do:[:index |
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   238
	newCollection add:(aBlock value:(contentsArray at:index)).
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   239
    ].
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   240
    ^ newCollection
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   241
! !
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   242
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   243
!SortedCollection methodsFor:'instance protocol'!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   244
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   245
sortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   246
    "return the block used for sorting"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   247
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   248
    ^ sortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   249
!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   250
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   251
sortBlock:aSortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   252
    "change the sort criteria for a sorted collection, resort the elements of 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   253
    the collection, and return the receiver. The argument, aSortBlock must
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   254
    be a two-argument block which returns true if its arg1 has to come before
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   255
    its arg2 in the collection."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   256
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   257
    sortBlock := aSortBlock.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   258
    lastIndex > firstIndex ifTrue:[
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   259
	contentsArray quickSortFrom:firstIndex to:lastIndex sortBlock:aSortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   260
    ]
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   261
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   262
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   263
     #(9 8 7 6 5 4 3) asSortedCollection
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   264
     #(9 8 7 6 5 4 3) asSortedCollection sortBlock:[:a : b | a < b]
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   265
     #(9 8 7 6 5 4 3) asSortedCollection sortBlock:[:a : b | a > b]
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   266
     #($f $G $z $Y $o $H) asSortedCollection
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   267
     #($f $G $z $Y $o $H) asSortedCollection sortBlock:[:a : b | a asUppercase < b asUppercase]
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   268
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   269
! !
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   270
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   271
!SortedCollection methodsFor:'private'!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   272
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   273
indexForInserting:anObject
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   274
    "search the index at which to insert anObject. Can also be used
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   275
     to search for an existing element by checking if the element at
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   276
     the returned index is the one we look for.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   277
     The returned index is a physical one, for accessing contentsArray."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   278
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   279
    |low    "{ Class: SmallInteger}"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   280
     high   "{ Class: SmallInteger}"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   281
     middle "{ Class: SmallInteger}"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   282
     element|
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   283
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   284
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   285
     we can of course use a binary search - since the elements are
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   286
     sorted
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   287
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   288
    low := firstIndex.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   289
    high := lastIndex.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   290
    [low <= high] whileTrue:[
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   291
	middle := (low + high) // 2.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   292
	element := contentsArray at:middle.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   293
	(sortBlock value:element value:anObject) ifTrue:[
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   294
	    "middleelement is smaller than object"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   295
	    low := middle + 1
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   296
	] ifFalse:[
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   297
	    high := middle - 1
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   298
	]
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   299
    ].
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   300
    ^ low
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   301
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   302
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   303
     #(1 2 3 4 7 99 1313 981989 898989898) asSortedCollection indexForInserting:50      
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   304
     #(1.0 2.0 3 4 7 49.0 51.0 99 1313 981989 898989898) asSortedCollection indexForInserting:50 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   305
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   306
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   307
!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   308
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   309
setSortBlock: aSortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   310
    "set the sortblock without resorting - private only"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   311
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   312
    sortBlock := aSortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   313
! !
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   314
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   315
!SortedCollection methodsFor:'searching'!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   316
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   317
after:anObject
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   318
    "return the element after the argument, anObject; or nil if there is none.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   319
     If anObject is contained multiple times in the collection, return the
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   320
     the first element which is non-equal to anObject.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   321
     If the receiver does not contain anObject, report an error"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   322
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   323
    ^ self after:anObject ifAbsent:[self errorValueNotFound:anObject]
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   324
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   325
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   326
     #(7 3 9 10 99) asSortedCollection after:50
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   327
     #(7 3 9 10 99) asSortedCollection after:1 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   328
     #(7 3 9 10 99) asSortedCollection after:10
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   329
     #(7 3 9 10 99) asSortedCollection after:7 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   330
     #(7 3 9 10 99) asSortedCollection after:99 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   331
     #(7 10 3 10 9 10 10 99) asSortedCollection after:9  
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   332
     #(7 10 3 10 9 10 10 99) asSortedCollection after:10 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   333
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   334
!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   335
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   336
after:anObject ifAbsent:exceptionBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   337
    "return the element after the argument, anObject; or nil if there is none.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   338
     If anObject is contained multiple times in the collection, return the
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   339
     the first element which is non-equal to anObject.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   340
     If the receiver does not contain anObject, return the result from evaluating
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   341
     exceptionBlock."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   342
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   343
    |index      "{ Class: SmallInteger }"|
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   344
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   345
    index := self indexForInserting:anObject.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   346
    ((index < firstIndex) 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   347
     or:[(contentsArray at:index) ~= anObject]) ifTrue:[^ exceptionBlock value].
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   348
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   349
    "skip multiple occurences of the same ..."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   350
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   351
    [(index <= lastIndex) and:[(contentsArray at:index) = anObject]] whileTrue:[
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   352
	index := index + 1
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   353
    ].
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   354
    (index > lastIndex) ifTrue:[^ nil].
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   355
    ^ contentsArray at:index
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   356
!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   357
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   358
before:anObject
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   359
    "return the element before the argument, anObject; or nil if there is none.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   360
     If the receiver does not contain anObject, report an error"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   361
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   362
    ^ self before:anObject ifAbsent:[self errorValueNotFound:anObject]
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   363
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   364
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   365
     #(7 3 9 10 99) asSortedCollection before:50
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   366
     #(7 3 9 10 99) asSortedCollection before:1 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   367
     #(7 3 9 10 99) asSortedCollection before:1000 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   368
     #(7 3 9 10 99) asSortedCollection before:10
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   369
     #(7 3 9 10 99) asSortedCollection before:7 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   370
     #(7 3 9 10 99) asSortedCollection before:99 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   371
     #(7 10 3 10 9 10 10 99) asSortedCollection before:9
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   372
     #(7 10 3 10 9 10 10 99) asSortedCollection before:10
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   373
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   374
!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   375
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   376
before:anObject ifAbsent:exceptionBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   377
    "return the element before the argument, anObject; or nil if there is none.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   378
     If the receiver does not contain anObject, return the result from evaluating
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   379
     exceptionBlock."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   380
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   381
    |index      "{ Class: SmallInteger }"|
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   382
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   383
    index := self indexForInserting:anObject.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   384
    ((index <= firstIndex) 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   385
     or:[(contentsArray at:index) ~= anObject]) ifTrue:[^ exceptionBlock value].
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   386
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   387
    ^ contentsArray at:index - 1
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   388
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   389
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   390
     #(7 3 9 10 99) asSortedCollection before:50
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   391
     #(7 3 9 10 99) asSortedCollection before:1 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   392
     #(7 3 9 10 99) asSortedCollection before:10  
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   393
     #(7 3 9 10 99) asSortedCollection before:7   
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   394
     #(7 3 9 10 99) asSortedCollection before:99   
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   395
     #(7 10 3 10 9 10 10 99) asSortedCollection before:9  
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   396
     #(7 10 3 10 9 10 10 99) asSortedCollection before:10   
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   397
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   398
! !
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   399
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   400
!SortedCollection methodsFor:'testing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   401
a27a279701f8 Initial revision
claus
parents:
diff changeset
   402
includes:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   403
    "return true, if the argument, anObject is in the collection.
62
e1b4369c61fb *** empty log message ***
claus
parents: 44
diff changeset
   404
     Redefined, since due to being sorted, the inclusion check can
2
claus
parents: 1
diff changeset
   405
     be done with log-n compares i.e. much faster."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   406
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   407
    |index "{ Class: SmallInteger }"|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   408
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   409
    index := self indexForInserting:anObject.
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   410
    ((index < firstIndex) or:[index > lastIndex]) ifTrue:[^ false].
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   411
    ^ (contentsArray at:index) = anObject
2
claus
parents: 1
diff changeset
   412
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   413
    "
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   414
     #(7 3 9 10 99) asSortedCollection includes:50
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   415
     #(7 3 9 10 99) asSortedCollection includes:10
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   416
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   417
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   418
a27a279701f8 Initial revision
claus
parents:
diff changeset
   419
occurrencesOf:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   420
    "return how many times the argument, anObject is in the collection.
62
e1b4369c61fb *** empty log message ***
claus
parents: 44
diff changeset
   421
     Redefined, since due to being sorted, the range of checked objects
2
claus
parents: 1
diff changeset
   422
     can be limited i.e. it can be done much faster."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   423
a27a279701f8 Initial revision
claus
parents:
diff changeset
   424
    |index      "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   425
     tally      "{ Class: SmallInteger }" |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   426
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   427
    index := self indexForInserting:anObject.
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   428
    ((index < firstIndex) or:[index > lastIndex]) ifTrue:[^ 0].
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   429
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   430
    tally := 0.
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   431
    [(index <= lastIndex) and:[(contentsArray at:index) = anObject]] whileTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   432
	tally := tally + 1.
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   433
	index := index + 1
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   434
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   435
    ^ tally
2
claus
parents: 1
diff changeset
   436
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   437
    "
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   438
     #(7 3 9 10 99) asSortedCollection occurrencesOf:50
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   439
     #(7 3 9 10 99) asSortedCollection occurrencesOf:10
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   440
     #(7 10 3 10 9 10 10 99) asSortedCollection occurrencesOf:10
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   441
    "
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   442
! !
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   443
629
2ceefe9b5a19 version at the end
Claus Gittinger <cg@exept.de>
parents: 607
diff changeset
   444
!SortedCollection class methodsFor:'documentation'!
2ceefe9b5a19 version at the end
Claus Gittinger <cg@exept.de>
parents: 607
diff changeset
   445
2ceefe9b5a19 version at the end
Claus Gittinger <cg@exept.de>
parents: 607
diff changeset
   446
version
2ceefe9b5a19 version at the end
Claus Gittinger <cg@exept.de>
parents: 607
diff changeset
   447
    ^ '$Header: /cvs/stx/stx/libbasic/SortedCollection.st,v 1.23 1995-11-23 17:06:40 cg Exp $'
2ceefe9b5a19 version at the end
Claus Gittinger <cg@exept.de>
parents: 607
diff changeset
   448
! !
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   449
SortedCollection initialize!