SortedCollection.st
author Claus Gittinger <cg@exept.de>
Wed, 06 Jun 2007 10:58:05 +0200
changeset 10600 6bfbf469a1be
parent 9920 316e29a48e51
child 11268 7ce883e9a42e
permissions -rw-r--r--
*** empty log message ***
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
5359
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
    13
"{ Package: 'stx:libbasic' }"
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
    14
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    15
OrderedCollection subclass:#SortedCollection
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
    16
	instanceVariableNames:'sortBlock'
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
    17
	classVariableNames:'DefaultSortBlock'
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
    18
	poolDictionaries:''
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
    19
	category:'Collections-Sequenceable'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    22
!SortedCollection class methodsFor:'documentation'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    24
copyright
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    25
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    26
 COPYRIGHT (c) 1993 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    27
	      All Rights Reserved
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    28
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    29
 This software is furnished under a license and may be used
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    30
 only in accordance with the terms of that license and with the
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    31
 inclusion of the above copyright notice.   This software may not
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    32
 be provided or otherwise made available to, or used by, any
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    33
 other person.  No title to or ownership of the software is
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    34
 hereby transferred.
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    35
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    36
!
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    37
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    38
documentation
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    39
"
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    40
    I keep my elements sorted. The sort order is defined by a sortblock,
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
    41
    a two-argument block which, when given two elements of the collection,
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
    42
    should return true if the element given as first arg has to come before the
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    43
    element given as second arg.
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    44
1156
7ce47f220573 commentary
Claus Gittinger <cg@exept.de>
parents: 1155
diff changeset
    45
    Equal elements may occur multiple times.
7ce47f220573 commentary
Claus Gittinger <cg@exept.de>
parents: 1155
diff changeset
    46
7ce47f220573 commentary
Claus Gittinger <cg@exept.de>
parents: 1155
diff changeset
    47
    SortedCollection uses quickSort to resort and a binary search when adding/removing
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
    48
    elements.
1156
7ce47f220573 commentary
Claus Gittinger <cg@exept.de>
parents: 1155
diff changeset
    49
    Because insertion/removal may require that remaining elements have to
7ce47f220573 commentary
Claus Gittinger <cg@exept.de>
parents: 1155
diff changeset
    50
    be shifted within the container, adding many individual elements may be done faster
7ce47f220573 commentary
Claus Gittinger <cg@exept.de>
parents: 1155
diff changeset
    51
    by creating a completely new collection from the unsorted elements.
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    52
    (see examples)
1156
7ce47f220573 commentary
Claus Gittinger <cg@exept.de>
parents: 1155
diff changeset
    53
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    54
    Thus a sortBlock of [:a :b | a < b] defines ascending sort-order,
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    55
    while [:a :b | a > b] defines descening order.
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    56
    The default sortBlock for SortedCollections is the first one.
1290
15ba3221b89b documentation
Claus Gittinger <cg@exept.de>
parents: 1175
diff changeset
    57
3251
87cac58a4e57 added VW compatibility warning
Claus Gittinger <cg@exept.de>
parents: 3250
diff changeset
    58
    Compatibility Warning:
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
    59
	VW seems to use a default sortBlock which compares a<=b,
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
    60
	while ST/X uses a<b.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
    61
	That means, that elements which are compared MUST understand #< in ST/X
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
    62
	while the minumum protocol is #<= in VW.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
    63
	This may be changed in a future release of ST/X
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
    64
	(it is not yet, to not confuse existing applications ...
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
    65
	 ... be aware, that the sortBlock has an effect on a few algorithms
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
    66
	 found here; especially #indexForInserting is critical.)
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
    67
3251
87cac58a4e57 added VW compatibility warning
Claus Gittinger <cg@exept.de>
parents: 3250
diff changeset
    68
1290
15ba3221b89b documentation
Claus Gittinger <cg@exept.de>
parents: 1175
diff changeset
    69
    [author:]
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
    70
	Claus Gittinger
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    71
"
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    72
!
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    73
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    74
examples
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    75
"
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
    76
    when many elements are to be added, it may be better to add them
1175
7ca26065cf02 commentary
Claus Gittinger <cg@exept.de>
parents: 1173
diff changeset
    77
    all en-bloeque instead of individually.
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    78
    The reason is that for each individual #add:, the contents has to be
1175
7ca26065cf02 commentary
Claus Gittinger <cg@exept.de>
parents: 1173
diff changeset
    79
    shifted, to create an empty slot for the new element.
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    80
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    81
    timing example:
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    82
9074
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
    83
        |o rnd|
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    84
9074
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
    85
        o := SortedCollection new.
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
    86
        rnd := Random new.
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
    87
        10000 timesRepeat:[
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
    88
            o add:rnd next.
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
    89
        ]
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    90
1175
7ca26065cf02 commentary
Claus Gittinger <cg@exept.de>
parents: 1173
diff changeset
    91
    takes 1365 ms on a P5 (admitted: this is a fast machine ;-)
9074
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
    92
    (Times are a'changing: Just came around 2005: on my 1.5Ghz labtop, this now takes 260ms)
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
    93
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    94
    In contrast:
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    95
9074
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
    96
        |o rnd|
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    97
9074
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
    98
        o := OrderedCollection new.
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
    99
        rnd := Random new.
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
   100
        10000 timesRepeat:[
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
   101
            o add:rnd next.
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
   102
        ].
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
   103
        o := o asSortedCollection
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
   104
1175
7ca26065cf02 commentary
Claus Gittinger <cg@exept.de>
parents: 1173
diff changeset
   105
    takes 383 ms on the same machine.
9074
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
   106
    (2005: on my 1.5Ghz labtop, this now takes 100ms)
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   107
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   108
    If you already have a big sortedCollection at hand, adding multiple
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   109
    items may be better done with #addAll:, which resorts all elements, if
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   110
    the number of added items is more than some threshold number.
3251
87cac58a4e57 added VW compatibility warning
Claus Gittinger <cg@exept.de>
parents: 3250
diff changeset
   111
    However, the break-even point where bulk-adding is faster depends
87cac58a4e57 added VW compatibility warning
Claus Gittinger <cg@exept.de>
parents: 3250
diff changeset
   112
    on the machine ... (and ST/X version ;-).
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
   113
"
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   114
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   115
a27a279701f8 Initial revision
claus
parents:
diff changeset
   116
!SortedCollection class methodsFor:'initialization'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   117
a27a279701f8 Initial revision
claus
parents:
diff changeset
   118
initialize
8180
7c346c8015f2 Only use #> for comparisons, since this is the base mechanism.
Stefan Vogel <sv@exept.de>
parents: 7554
diff changeset
   119
    "setup the default sortBlock.
7c346c8015f2 Only use #> for comparisons, since this is the base mechanism.
Stefan Vogel <sv@exept.de>
parents: 7554
diff changeset
   120
     Use #>, since this is the base method in Magnitude."
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   121
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   122
    "/ only do this once at early startup
913
7d9881f9c908 only initialize once
Claus Gittinger <cg@exept.de>
parents: 629
diff changeset
   123
    DefaultSortBlock isNil ifTrue:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   124
	DefaultSortBlock := [:a :b | a < b]
913
7d9881f9c908 only initialize once
Claus Gittinger <cg@exept.de>
parents: 629
diff changeset
   125
    ]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   126
913
7d9881f9c908 only initialize once
Claus Gittinger <cg@exept.de>
parents: 629
diff changeset
   127
    "
7d9881f9c908 only initialize once
Claus Gittinger <cg@exept.de>
parents: 629
diff changeset
   128
     SortedCollection initialize
7d9881f9c908 only initialize once
Claus Gittinger <cg@exept.de>
parents: 629
diff changeset
   129
    "
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   130
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   131
    "Modified: 12.4.1996 / 12:29:27 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   132
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   133
a27a279701f8 Initial revision
claus
parents:
diff changeset
   134
!SortedCollection class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   135
2929
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   136
forStrings
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   137
    "this is supposed to return a sortedCollection, which sorts using
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   138
     the current locales collating sequence. For now, simply use a
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   139
     normal string compare.
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   140
     This will change"
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   141
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   142
    ^ self new
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   143
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   144
    "Modified: 13.9.1997 / 10:18:58 / cg"
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   145
    "Created: 13.9.1997 / 10:41:54 / cg"
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   146
!
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   147
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   148
forStrings:size
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   149
    "this is supposed to return a sortedCollection, which sorts using
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   150
     the current locales collating sequence. For now, simply use a
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   151
     normal string compare.
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   152
     This will change"
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   153
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   154
    ^ self new:size
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   155
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   156
    "Modified: 13.9.1997 / 10:18:58 / cg"
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   157
!
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   158
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   159
new
2
claus
parents: 1
diff changeset
   160
    "return a new sortedCollection, the sorting is done using
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   161
     a compare for a < b, in ascending order"
2
claus
parents: 1
diff changeset
   162
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   163
    ^ super new setSortBlock:DefaultSortBlock
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   164
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   165
    "Modified: 12.4.1996 / 12:28:18 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   166
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   167
a27a279701f8 Initial revision
claus
parents:
diff changeset
   168
new:size
2
claus
parents: 1
diff changeset
   169
    "return a new sortedCollection with preallocated size.
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   170
     The sorting is done using a compare for a < b, in ascending order"
2
claus
parents: 1
diff changeset
   171
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   172
    ^ (super new:size) setSortBlock:DefaultSortBlock
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   173
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   174
    "Modified: 12.4.1996 / 12:28:22 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   175
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   176
a27a279701f8 Initial revision
claus
parents:
diff changeset
   177
sortBlock:aBlock
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   178
    "return a new sortedCollection, whe the sort order is defined
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   179
     by aBlock.
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   180
     This must be a two-argument block which returns true if its arg1 has to come before
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   181
     its arg2 in the collection."
2
claus
parents: 1
diff changeset
   182
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   183
    ^ super new setSortBlock:aBlock
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   184
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   185
    "default:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   186
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   187
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   188
     s := SortedCollection new.
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   189
     s add:15; add:99; add:3; add:-29; add:17; add:-6.
1422
9a0b792f2953 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1367
diff changeset
   190
     Transcript showCR:s
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   191
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   192
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   193
    "sorting by absolute values:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   194
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   195
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   196
     s := SortedCollection sortBlock:[:a :b | a abs < b abs].
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   197
     s add:15; add:99; add:3; add:29; add:17; add:-6.
1422
9a0b792f2953 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1367
diff changeset
   198
     Transcript showCR:s
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   199
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   200
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   201
    "default again:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   202
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   203
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   204
     s := SortedCollection new.
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   205
     s add:'foo'; add:'Bar'; add:'baz'; add:'hello'; add:'world'; add:'Wow'.
1422
9a0b792f2953 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1367
diff changeset
   206
     Transcript showCR:s
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   207
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   208
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   209
    "sorting strings caseless:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   210
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   211
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   212
     s := SortedCollection sortBlock:[:a :b | a asLowercase < b asLowercase].
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   213
     s add:'foo'; add:'Bar'; add:'baz'; add:'hello'; add:'world'; add:'Wow'.
1422
9a0b792f2953 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1367
diff changeset
   214
     Transcript showCR:s
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   215
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   216
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   217
    "Modified: 12.4.1996 / 12:26:28 / cg"
329
claus
parents: 216
diff changeset
   218
!
claus
parents: 216
diff changeset
   219
claus
parents: 216
diff changeset
   220
withAll:aCollection sortBlock:aBlock
claus
parents: 216
diff changeset
   221
    "initialize from aCollection and set the sort-block"
claus
parents: 216
diff changeset
   222
2248
b11a16f51048 withAll:aCollection sortBlock:aBlock
ca
parents: 1422
diff changeset
   223
    ^ (self sortBlock:aBlock) addAll:aCollection; yourself
329
claus
parents: 216
diff changeset
   224
claus
parents: 216
diff changeset
   225
    "
claus
parents: 216
diff changeset
   226
     SortedCollection withAll:#(1 2 3 4 5 6 7 8 9 0)
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   227
		      sortBlock:[:a :b | a > b]
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   228
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   229
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   230
    "default:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   231
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   232
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   233
     s := SortedCollection withAll:#(15 99 3 29 17 -6).
1422
9a0b792f2953 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1367
diff changeset
   234
     Transcript showCR:s
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   235
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   236
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   237
    "sorting by absolute values:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   238
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   239
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   240
     s := SortedCollection withAll:#(15 99 3 29 17 -6) sortBlock:[:a :b | a abs < b abs].
1422
9a0b792f2953 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1367
diff changeset
   241
     Transcript showCR:s
329
claus
parents: 216
diff changeset
   242
    "
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   243
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   244
    "default again:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   245
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   246
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   247
     s := SortedCollection withAll:#('foo' 'Bar' 'baz' 'hello' 'world' 'Wow').
1422
9a0b792f2953 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1367
diff changeset
   248
     Transcript showCR:s
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   249
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   250
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   251
    "sorting strings caseless:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   252
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   253
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   254
     s := SortedCollection withAll:#('foo' 'Bar' 'baz' 'hello' 'world' 'Wow') sortBlock:[:a :b | a asLowercase < b asLowercase].
1422
9a0b792f2953 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1367
diff changeset
   255
     Transcript showCR:s
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   256
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   257
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   258
    "Modified: 12.4.1996 / 12:28:09 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   259
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   260
7300
461bb09c5954 category
Claus Gittinger <cg@exept.de>
parents: 6737
diff changeset
   261
!SortedCollection class methodsFor:'Compatibility-Dolphin'!
6411
199e6d88c562 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 5816
diff changeset
   262
199e6d88c562 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 5816
diff changeset
   263
sortBlock:aBlock withAll:aCollection
199e6d88c562 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 5816
diff changeset
   264
    ^ self withAll:aCollection sortBlock:aBlock
199e6d88c562 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 5816
diff changeset
   265
! !
199e6d88c562 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 5816
diff changeset
   266
9073
cb81da1b2ad5 +median
Claus Gittinger <cg@exept.de>
parents: 8874
diff changeset
   267
!SortedCollection methodsFor:'accessing'!
cb81da1b2ad5 +median
Claus Gittinger <cg@exept.de>
parents: 8874
diff changeset
   268
9918
1947f22681ef optimized code for n-largest
Claus Gittinger <cg@exept.de>
parents: 9917
diff changeset
   269
largest:n
1947f22681ef optimized code for n-largest
Claus Gittinger <cg@exept.de>
parents: 9917
diff changeset
   270
    "return the n largest elements"
1947f22681ef optimized code for n-largest
Claus Gittinger <cg@exept.de>
parents: 9917
diff changeset
   271
1947f22681ef optimized code for n-largest
Claus Gittinger <cg@exept.de>
parents: 9917
diff changeset
   272
    sortBlock == DefaultSortBlock ifTrue:[
9920
316e29a48e51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9918
diff changeset
   273
        ^ self copyFrom:(self size-n+1)
9918
1947f22681ef optimized code for n-largest
Claus Gittinger <cg@exept.de>
parents: 9917
diff changeset
   274
    ].
1947f22681ef optimized code for n-largest
Claus Gittinger <cg@exept.de>
parents: 9917
diff changeset
   275
    ^ super largest:n
1947f22681ef optimized code for n-largest
Claus Gittinger <cg@exept.de>
parents: 9917
diff changeset
   276
1947f22681ef optimized code for n-largest
Claus Gittinger <cg@exept.de>
parents: 9917
diff changeset
   277
    "
1947f22681ef optimized code for n-largest
Claus Gittinger <cg@exept.de>
parents: 9917
diff changeset
   278
     #(10 35 20 45 30 5) asSortedCollection largest:3 
1947f22681ef optimized code for n-largest
Claus Gittinger <cg@exept.de>
parents: 9917
diff changeset
   279
    "
1947f22681ef optimized code for n-largest
Claus Gittinger <cg@exept.de>
parents: 9917
diff changeset
   280
!
1947f22681ef optimized code for n-largest
Claus Gittinger <cg@exept.de>
parents: 9917
diff changeset
   281
9916
5c76098e0377 min and max are easy with sorted collections.
Claus Gittinger <cg@exept.de>
parents: 9074
diff changeset
   282
max
5c76098e0377 min and max are easy with sorted collections.
Claus Gittinger <cg@exept.de>
parents: 9074
diff changeset
   283
    "Return the largest element."
5c76098e0377 min and max are easy with sorted collections.
Claus Gittinger <cg@exept.de>
parents: 9074
diff changeset
   284
9917
278547f0d52e ... but only with the default sort block.
Claus Gittinger <cg@exept.de>
parents: 9916
diff changeset
   285
    sortBlock == DefaultSortBlock ifTrue:[
278547f0d52e ... but only with the default sort block.
Claus Gittinger <cg@exept.de>
parents: 9916
diff changeset
   286
        ^ self last
278547f0d52e ... but only with the default sort block.
Claus Gittinger <cg@exept.de>
parents: 9916
diff changeset
   287
    ].
278547f0d52e ... but only with the default sort block.
Claus Gittinger <cg@exept.de>
parents: 9916
diff changeset
   288
    ^ super max
9916
5c76098e0377 min and max are easy with sorted collections.
Claus Gittinger <cg@exept.de>
parents: 9074
diff changeset
   289
5c76098e0377 min and max are easy with sorted collections.
Claus Gittinger <cg@exept.de>
parents: 9074
diff changeset
   290
    "
5c76098e0377 min and max are easy with sorted collections.
Claus Gittinger <cg@exept.de>
parents: 9074
diff changeset
   291
     #(10 35 20 45 30 5) asSortedCollection max 
5c76098e0377 min and max are easy with sorted collections.
Claus Gittinger <cg@exept.de>
parents: 9074
diff changeset
   292
    "
5c76098e0377 min and max are easy with sorted collections.
Claus Gittinger <cg@exept.de>
parents: 9074
diff changeset
   293
!
5c76098e0377 min and max are easy with sorted collections.
Claus Gittinger <cg@exept.de>
parents: 9074
diff changeset
   294
9073
cb81da1b2ad5 +median
Claus Gittinger <cg@exept.de>
parents: 8874
diff changeset
   295
median
cb81da1b2ad5 +median
Claus Gittinger <cg@exept.de>
parents: 8874
diff changeset
   296
    "Return the middle element, or as close as we can get."
cb81da1b2ad5 +median
Claus Gittinger <cg@exept.de>
parents: 8874
diff changeset
   297
cb81da1b2ad5 +median
Claus Gittinger <cg@exept.de>
parents: 8874
diff changeset
   298
    ^ self at:(self size + 1 // 2)
cb81da1b2ad5 +median
Claus Gittinger <cg@exept.de>
parents: 8874
diff changeset
   299
cb81da1b2ad5 +median
Claus Gittinger <cg@exept.de>
parents: 8874
diff changeset
   300
    "
cb81da1b2ad5 +median
Claus Gittinger <cg@exept.de>
parents: 8874
diff changeset
   301
     #(10 35 20 45 30 5) asSortedCollection median
cb81da1b2ad5 +median
Claus Gittinger <cg@exept.de>
parents: 8874
diff changeset
   302
     #(10 35 20 45 30 5) median
cb81da1b2ad5 +median
Claus Gittinger <cg@exept.de>
parents: 8874
diff changeset
   303
    "
9916
5c76098e0377 min and max are easy with sorted collections.
Claus Gittinger <cg@exept.de>
parents: 9074
diff changeset
   304
!
5c76098e0377 min and max are easy with sorted collections.
Claus Gittinger <cg@exept.de>
parents: 9074
diff changeset
   305
5c76098e0377 min and max are easy with sorted collections.
Claus Gittinger <cg@exept.de>
parents: 9074
diff changeset
   306
min
5c76098e0377 min and max are easy with sorted collections.
Claus Gittinger <cg@exept.de>
parents: 9074
diff changeset
   307
    "Return the smallest element."
5c76098e0377 min and max are easy with sorted collections.
Claus Gittinger <cg@exept.de>
parents: 9074
diff changeset
   308
9917
278547f0d52e ... but only with the default sort block.
Claus Gittinger <cg@exept.de>
parents: 9916
diff changeset
   309
    sortBlock == DefaultSortBlock ifTrue:[
278547f0d52e ... but only with the default sort block.
Claus Gittinger <cg@exept.de>
parents: 9916
diff changeset
   310
        ^ self first
278547f0d52e ... but only with the default sort block.
Claus Gittinger <cg@exept.de>
parents: 9916
diff changeset
   311
    ].
278547f0d52e ... but only with the default sort block.
Claus Gittinger <cg@exept.de>
parents: 9916
diff changeset
   312
    ^ super min
9916
5c76098e0377 min and max are easy with sorted collections.
Claus Gittinger <cg@exept.de>
parents: 9074
diff changeset
   313
5c76098e0377 min and max are easy with sorted collections.
Claus Gittinger <cg@exept.de>
parents: 9074
diff changeset
   314
    "
5c76098e0377 min and max are easy with sorted collections.
Claus Gittinger <cg@exept.de>
parents: 9074
diff changeset
   315
     #(10 35 20 45 30 5) asSortedCollection min
5c76098e0377 min and max are easy with sorted collections.
Claus Gittinger <cg@exept.de>
parents: 9074
diff changeset
   316
    "
9073
cb81da1b2ad5 +median
Claus Gittinger <cg@exept.de>
parents: 8874
diff changeset
   317
! !
cb81da1b2ad5 +median
Claus Gittinger <cg@exept.de>
parents: 8874
diff changeset
   318
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   319
!SortedCollection methodsFor:'adding & removing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   320
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   321
add:anObject
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   322
    "add the argument, anObject at the proper place in the
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   323
     receiver. Returns the argument, anObject."
2
claus
parents: 1
diff changeset
   324
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   325
    |index|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   326
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   327
    lastIndex < firstIndex "i.e. self size == 0" ifTrue:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   328
	"/ empty - add at the end
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   329
	index := lastIndex.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   330
	(index == contentsArray size) ifTrue:[
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   331
	    self makeRoomAtLast.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   332
	    index := lastIndex.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   333
	].
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   334
	lastIndex := index := index + 1.
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   335
    ] ifFalse:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   336
	index := self indexForInserting:anObject.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   337
	index := self makeRoomAtIndex:index.
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   338
    ].
3340
300d88cf8b14 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3251
diff changeset
   339
    contentsArray basicAt:index put:anObject.
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   340
    ^ anObject
2
claus
parents: 1
diff changeset
   341
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   342
    "
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   343
     |c| #(7 3 9 10 99) asSortedCollection add:5; yourself
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   344
     #(7 3 9 10 99) asSortedCollection add:1; yourself
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   345
     #(7 3 9 10 99) asSortedCollection add:1000; yourself
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   346
    "
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   347
3340
300d88cf8b14 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3251
diff changeset
   348
    "Modified: / 13.3.1998 / 16:21:52 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   349
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   350
a27a279701f8 Initial revision
claus
parents:
diff changeset
   351
addAll:aCollection
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   352
    "add all elements of the argument, aCollection to the receiver.
5028
1f7e943ce46e use my sortBlock when merge-sorting
Claus Gittinger <cg@exept.de>
parents: 4596
diff changeset
   353
     Returns the argument, aCollection (sigh)."
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   354
5816
ce15ce5294b4 Cleanup unused method vars
Stefan Vogel <sv@exept.de>
parents: 5668
diff changeset
   355
    |addedCollection|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   356
5359
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   357
    (aCollection isSortedCollection
7554
7ea961a68e34 Save copying in #addAll
Stefan Vogel <sv@exept.de>
parents: 7300
diff changeset
   358
     and:[aCollection sortBlock == sortBlock]) ifTrue:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   359
	addedCollection := aCollection
5030
655a0f0a60c3 use my sortBlock when merge-sorting
Claus Gittinger <cg@exept.de>
parents: 5029
diff changeset
   360
    ] ifFalse:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   361
	addedCollection := Array withAll:aCollection.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   362
	addedCollection sort:sortBlock.
5030
655a0f0a60c3 use my sortBlock when merge-sorting
Claus Gittinger <cg@exept.de>
parents: 5029
diff changeset
   363
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   364
	"/ special case: I am empty - add them en-bloque.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   365
	"/ (but only if the argument is not a sortedCollection,
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   366
	"/  because quicksort degenerates to a veeery slow operation then)
5030
655a0f0a60c3 use my sortBlock when merge-sorting
Claus Gittinger <cg@exept.de>
parents: 5029
diff changeset
   367
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   368
	self size == 0 ifTrue:[
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   369
	    contentsArray := addedCollection.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   370
	    firstIndex := 1.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   371
	    lastIndex := addedCollection size.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   372
	    ^ aCollection
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   373
	].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   374
    ].
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   375
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   376
    "/
5030
655a0f0a60c3 use my sortBlock when merge-sorting
Claus Gittinger <cg@exept.de>
parents: 5029
diff changeset
   377
    "/ do a mergeSort with the sortedContents
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   378
    "/
5030
655a0f0a60c3 use my sortBlock when merge-sorting
Claus Gittinger <cg@exept.de>
parents: 5029
diff changeset
   379
    self mergeSorted:addedCollection.
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   380
    ^ aCollection
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   381
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   382
    "
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   383
     #(7 3 9 10 99) asSortedCollection addAll:#(77 0 1 16 5); yourself
5030
655a0f0a60c3 use my sortBlock when merge-sorting
Claus Gittinger <cg@exept.de>
parents: 5029
diff changeset
   384
5028
1f7e943ce46e use my sortBlock when merge-sorting
Claus Gittinger <cg@exept.de>
parents: 4596
diff changeset
   385
     ( #(7 3 9 10 99) asSortedCollection:[:a :b | a > b])
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   386
	 addAll:#(77 0 1 16 5); yourself
5030
655a0f0a60c3 use my sortBlock when merge-sorting
Claus Gittinger <cg@exept.de>
parents: 5029
diff changeset
   387
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   388
     #(7 3 9 10 99) asSortedCollection
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   389
	addAll:( #(77 0 1 16 5) asSortedCollection:[:a :b | a > b]); yourself
5030
655a0f0a60c3 use my sortBlock when merge-sorting
Claus Gittinger <cg@exept.de>
parents: 5029
diff changeset
   390
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   391
     (#(7 3 9 10 99) asSortedCollection:[:a :b | a > b])
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   392
	addAll:( #(77 0 1 16 5) asSortedCollection:[:a :b | a < b]); yourself
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   393
    "
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   394
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   395
    "Modified: 13.4.1996 / 12:42:15 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   396
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   397
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   398
mergeSorted:aSortedCollection
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   399
    "add all elements of the argument, aSortedCollection to the
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   400
     receiver.
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   401
     This leads to an error, if the argument is not a sortedCollection.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   402
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   403
     This should be used when a number of elements is to be added.
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   404
     Notice, that quicksort degenerates to a veeery slow bubble-like
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   405
     sort when a collection of already sorted elements is given to it.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   406
     Therefore, adding chunks is better done by sorting the chunk and merging
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   407
     it in, instead of resorting the receiver."
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   408
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   409
    |newContentsArray
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   410
     contentsArray2
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   411
     destIndex "{ Class: SmallInteger }"
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   412
     n1        "{ Class: SmallInteger }"
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   413
     n2        "{ Class: SmallInteger }"
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   414
     srcIndex1 "{ Class: SmallInteger }"
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   415
     srcIndex2 "{ Class: SmallInteger }"
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   416
     last1     "{ Class: SmallInteger }"
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   417
     last2     "{ Class: SmallInteger }"
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   418
     end1Reached end2Reached
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   419
     el1 el2 |
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   420
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   421
    n1 := self size.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   422
    n2 := aSortedCollection size.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   423
5381
914e310a69be Fix #mergeSorted if one of the collections is empty.
Stefan Vogel <sv@exept.de>
parents: 5359
diff changeset
   424
    n1 == 0 ifTrue:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   425
	^ aSortedCollection.
5381
914e310a69be Fix #mergeSorted if one of the collections is empty.
Stefan Vogel <sv@exept.de>
parents: 5359
diff changeset
   426
    ].
914e310a69be Fix #mergeSorted if one of the collections is empty.
Stefan Vogel <sv@exept.de>
parents: 5359
diff changeset
   427
    n2 == 0 ifTrue:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   428
	^ self.
5381
914e310a69be Fix #mergeSorted if one of the collections is empty.
Stefan Vogel <sv@exept.de>
parents: 5359
diff changeset
   429
    ].
914e310a69be Fix #mergeSorted if one of the collections is empty.
Stefan Vogel <sv@exept.de>
parents: 5359
diff changeset
   430
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   431
    newContentsArray := Array new:(n1 + n2).
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   432
    destIndex := 1.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   433
5359
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   434
    (aSortedCollection isSortedBy:sortBlock) ifTrue:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   435
	aSortedCollection isSortedCollection ifTrue:[
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   436
	    contentsArray2 := aSortedCollection contentsArray.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   437
	    srcIndex2 := aSortedCollection firstIndex.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   438
	] ifFalse:[
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   439
	    contentsArray2 := aSortedCollection.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   440
	    srcIndex2 := 1.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   441
	]
5030
655a0f0a60c3 use my sortBlock when merge-sorting
Claus Gittinger <cg@exept.de>
parents: 5029
diff changeset
   442
    ] ifFalse:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   443
	contentsArray2 := aSortedCollection.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   444
	srcIndex2 := 1.
5030
655a0f0a60c3 use my sortBlock when merge-sorting
Claus Gittinger <cg@exept.de>
parents: 5029
diff changeset
   445
    ].
655a0f0a60c3 use my sortBlock when merge-sorting
Claus Gittinger <cg@exept.de>
parents: 5029
diff changeset
   446
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   447
    last2 := srcIndex2 + n2 -1.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   448
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   449
    srcIndex1 := firstIndex.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   450
    last1 := srcIndex1 + n1 -1.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   451
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   452
    (srcIndex1 <= last1 and:[srcIndex2 <= last2]) ifTrue:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   453
	el1 := contentsArray at:srcIndex1.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   454
	el2 := contentsArray2 at:srcIndex2.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   455
	end1Reached := end2Reached := false.
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   456
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   457
	[end1Reached or:[end2Reached]] whileFalse:[
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   458
	    (sortBlock value:el1 value:el2) ifTrue:[
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   459
		"/ el1 to come before el2
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   460
		newContentsArray at:destIndex put:el1. destIndex := destIndex + 1.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   461
		srcIndex1 := srcIndex1 + 1.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   462
		srcIndex1 <= last1 ifTrue:[
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   463
		    el1 := contentsArray at:srcIndex1.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   464
		] ifFalse:[
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   465
		    end1Reached := true
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   466
		]
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   467
	    ] ifFalse:[
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   468
		"/ el2 to come before el1
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   469
		newContentsArray at:destIndex put:el2. destIndex := destIndex + 1.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   470
		srcIndex2 := srcIndex2 + 1.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   471
		srcIndex2 <= last2 ifTrue:[
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   472
		    el2 := contentsArray2 at:srcIndex2.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   473
		] ifFalse:[
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   474
		    end2Reached := true
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   475
		]
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   476
	    ]
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   477
	]
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   478
    ].
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   479
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   480
    "/ fill up with remaining elements from source1
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   481
    (srcIndex1 <= last1) ifTrue:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   482
	newContentsArray
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   483
	    replaceFrom:destIndex
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   484
	    to:(destIndex+(last1-srcIndex1))
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   485
	    with:contentsArray
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   486
	    startingAt:srcIndex1
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   487
    ].
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   488
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   489
    "/ fill up with remaining elements from source2
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   490
    (srcIndex2 <= last2) ifTrue:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   491
	newContentsArray
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   492
	    replaceFrom:destIndex
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   493
	    to:(destIndex+(last2-srcIndex2))
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   494
	    with:contentsArray2
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   495
	    startingAt:srcIndex2
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   496
    ].
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   497
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   498
    firstIndex := 1.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   499
    lastIndex := n1 + n2.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   500
    contentsArray := newContentsArray
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   501
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   502
    "
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   503
     #(7 3 9 10 99) asSortedCollection
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   504
	mergeSorted:#(77 0 1 16 5) asSortedCollection
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   505
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   506
     #(7 3 9 10 99) asSortedCollection
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   507
	mergeSorted:#(77 0 3 1 98 99 16 5) asSortedCollection
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   508
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   509
     #() asSortedCollection
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   510
	mergeSorted:#(77 0 3 1 98 99 16 5) asSortedCollection
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   511
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   512
     #(7 3 9 10 99) asSortedCollection
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   513
	mergeSorted:#() asSortedCollection
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   514
    "
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   515
3250
c4b444774f1c oops - mergesort cannot simply copy remaining
Claus Gittinger <cg@exept.de>
parents: 2929
diff changeset
   516
    "Modified: / 30.1.1998 / 01:49:42 / cg"
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   517
! !
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   518
5560
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   519
!SortedCollection methodsFor:'blocked'!
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   520
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   521
add:newObject after:oldObject
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   522
    "catch this - its not allowed for sortedCollections"
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   523
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   524
    self shouldNotImplement
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   525
!
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   526
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   527
add:newObject before:oldObject
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   528
    "catch this - its not allowed for sortedCollections"
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   529
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   530
    self shouldNotImplement
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   531
!
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   532
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   533
addFirst:anObject
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   534
    "catch this - its not allowed for sortedCollections"
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   535
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   536
    self shouldNotImplement
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   537
!
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   538
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   539
addLast:anObject
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   540
    "catch this - its not allowed for sortedCollections"
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   541
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   542
    self shouldNotImplement
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   543
! !
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   544
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   545
!SortedCollection methodsFor:'converting'!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   546
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   547
asSortedCollection
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   548
    "return the receiver as a sorted collection"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   549
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   550
    "could be an instance of a subclass..."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   551
    self class == SortedCollection ifTrue:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   552
	sortBlock == DefaultSortBlock ifTrue:[
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   553
	    ^ self
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   554
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   555
    ].
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   556
    ^ super asSortedCollection
5029
ae3312dda1dd avoid creation of a new sortedCollection in #asSortedCollection:
Claus Gittinger <cg@exept.de>
parents: 5028
diff changeset
   557
!
ae3312dda1dd avoid creation of a new sortedCollection in #asSortedCollection:
Claus Gittinger <cg@exept.de>
parents: 5028
diff changeset
   558
ae3312dda1dd avoid creation of a new sortedCollection in #asSortedCollection:
Claus Gittinger <cg@exept.de>
parents: 5028
diff changeset
   559
asSortedCollection:aSortBlock
ae3312dda1dd avoid creation of a new sortedCollection in #asSortedCollection:
Claus Gittinger <cg@exept.de>
parents: 5028
diff changeset
   560
    "return the receiver as a sorted collection, using aSortBlock.
ae3312dda1dd avoid creation of a new sortedCollection in #asSortedCollection:
Claus Gittinger <cg@exept.de>
parents: 5028
diff changeset
   561
     Return the receiver, if its a sortedCollection and the sortBlock
ae3312dda1dd avoid creation of a new sortedCollection in #asSortedCollection:
Claus Gittinger <cg@exept.de>
parents: 5028
diff changeset
   562
     is the same as the argument-sortBlock"
ae3312dda1dd avoid creation of a new sortedCollection in #asSortedCollection:
Claus Gittinger <cg@exept.de>
parents: 5028
diff changeset
   563
ae3312dda1dd avoid creation of a new sortedCollection in #asSortedCollection:
Claus Gittinger <cg@exept.de>
parents: 5028
diff changeset
   564
    "could be an instance of a subclass..."
ae3312dda1dd avoid creation of a new sortedCollection in #asSortedCollection:
Claus Gittinger <cg@exept.de>
parents: 5028
diff changeset
   565
    self class == SortedCollection ifTrue:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   566
	"/ if the sortBlock is the same, return the receiver
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   567
	aSortBlock == sortBlock ifTrue:[
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   568
	    ^ self
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   569
	].
5029
ae3312dda1dd avoid creation of a new sortedCollection in #asSortedCollection:
Claus Gittinger <cg@exept.de>
parents: 5028
diff changeset
   570
    ].
5030
655a0f0a60c3 use my sortBlock when merge-sorting
Claus Gittinger <cg@exept.de>
parents: 5029
diff changeset
   571
    ^ super asSortedCollection:aSortBlock
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   572
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   573
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   574
!SortedCollection methodsFor:'copying'!
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   575
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   576
copyEmpty:size
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   577
    "return a copy of the receiver with no elements, but
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   578
     the same size. This method has been be redefined to
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   579
     preserve the sortBlock."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   580
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   581
    ^ (self species new:size) sortBlock:sortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   582
!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   583
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   584
postCopyFrom:anOriginal
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   585
    "sent after a copy or when a new collection species has been created.
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   586
     The new collection should have the same sortBlock as the original."
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   587
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   588
    sortBlock := anOriginal sortBlock
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   589
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   590
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   591
     #(4 7 1 99 -1 17) asSortedCollection inspect
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   592
     #(4 7 1 99 -1 17) asSortedCollection copy inspect
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   593
     (#(4 7 1 99 -1 17) asSortedCollection sortBlock:[:a :b | a > b]) inspect
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   594
     (#(4 7 1 99 -1 17) asSortedCollection sortBlock:[:a :b | a > b]) copy inspect
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   595
     (#(4 7 1 99 -1 17) asSortedCollection select:[:e| e even]) inspect
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   596
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   597
! !
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   598
216
a8abff749575 *** empty log message ***
claus
parents: 202
diff changeset
   599
!SortedCollection methodsFor:'enumerating'!
184
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   600
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   601
collect:aBlock
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   602
    "evaluate the argument, aBlock for every element in the collection
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   603
     and return a collection of the results. Redefined to return an OrderedCollection;
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   604
     see X3J20 spec. (SortedCollection>>collect: should return an OrderedCollection)"
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   605
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   606
    |newCollection
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   607
     start  "{ Class:SmallInteger }"
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   608
     stop   "{ Class:SmallInteger }" |
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   609
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   610
    newCollection := OrderedCollection new:(self size).
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   611
    stop := lastIndex.
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   612
    start := firstIndex.
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   613
    start to:stop do:[:index |
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   614
	newCollection add:(aBlock value:(contentsArray at:index)).
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   615
    ].
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   616
    ^ newCollection
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   617
! !
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   618
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   619
!SortedCollection methodsFor:'instance protocol'!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   620
5668
0cbaa16dc17c Inherited #sort: shows a debugger.
Stefan Vogel <sv@exept.de>
parents: 5604
diff changeset
   621
sort:aSortBlock
0cbaa16dc17c Inherited #sort: shows a debugger.
Stefan Vogel <sv@exept.de>
parents: 5604
diff changeset
   622
    "redefined from superclass to change the sortBlock"
0cbaa16dc17c Inherited #sort: shows a debugger.
Stefan Vogel <sv@exept.de>
parents: 5604
diff changeset
   623
0cbaa16dc17c Inherited #sort: shows a debugger.
Stefan Vogel <sv@exept.de>
parents: 5604
diff changeset
   624
    sortBlock ~~ aSortBlock ifTrue:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   625
	self sortBlock:aSortBlock.
5668
0cbaa16dc17c Inherited #sort: shows a debugger.
Stefan Vogel <sv@exept.de>
parents: 5604
diff changeset
   626
    ].
0cbaa16dc17c Inherited #sort: shows a debugger.
Stefan Vogel <sv@exept.de>
parents: 5604
diff changeset
   627
0cbaa16dc17c Inherited #sort: shows a debugger.
Stefan Vogel <sv@exept.de>
parents: 5604
diff changeset
   628
!
0cbaa16dc17c Inherited #sort: shows a debugger.
Stefan Vogel <sv@exept.de>
parents: 5604
diff changeset
   629
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   630
sortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   631
    "return the block used for sorting"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   632
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   633
    ^ sortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   634
!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   635
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   636
sortBlock:aSortBlock
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   637
    "change the sort criteria for a sorted collection, resort the elements of
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   638
    the collection, and return the receiver. The argument, aSortBlock must
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   639
    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
   640
    its arg2 in the collection."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   641
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   642
    sortBlock := aSortBlock.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   643
    lastIndex > firstIndex ifTrue:[
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   644
	contentsArray quickSortFrom:firstIndex to:lastIndex sortBlock:aSortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   645
    ]
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   646
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   647
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   648
     #(9 8 7 6 5 4 3) asSortedCollection
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   649
     #(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
   650
     #(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
   651
     #($f $G $z $Y $o $H) asSortedCollection
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   652
     #($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
   653
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   654
! !
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   655
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   656
!SortedCollection methodsFor:'private'!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   657
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   658
indexForInserting:anObject
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   659
    "search the index at which to insert anObject.
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   660
     Can also be used to search for an existing element
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   661
     by checking if the element at the returned index is the one we look for.
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   662
     Uses a binarySearch since we can depend on the elements being on sorted order.
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   663
     The returned index is a physical one, for accessing contentsArray."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   664
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   665
    |low    "{ Class: SmallInteger}"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   666
     high   "{ Class: SmallInteger}"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   667
     middle "{ Class: SmallInteger}"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   668
     element|
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   669
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   670
    "
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   671
     we can of course use a binary search - since the elements are sorted
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   672
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   673
    low := firstIndex.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   674
    high := lastIndex.
9074
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
   675
    [low > high] whileFalse:[
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
   676
        middle := (low + high) // 2.
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
   677
        element := contentsArray at:middle.
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
   678
        (sortBlock value:element value:anObject) ifTrue:[
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
   679
            "middleelement is smaller than object"
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
   680
            low := middle + 1
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
   681
        ] ifFalse:[
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
   682
            high := middle - 1
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
   683
        ]
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   684
    ].
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   685
    ^ low
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   686
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   687
    "
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   688
     #(1 2 3 4 7 99 1313 981989 898989898) asSortedCollection indexForInserting:50
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   689
     #(1.0 2.0 3 4 7 49.0 51.0 99 1313 981989 898989898) asSortedCollection indexForInserting:50
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   690
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   691
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   692
    "Modified: 12.4.1996 / 13:22:03 / cg"
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   693
!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   694
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   695
setSortBlock: aSortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   696
    "set the sortblock without resorting - private only"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   697
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   698
    sortBlock := aSortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   699
! !
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   700
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   701
!SortedCollection methodsFor:'queries'!
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   702
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   703
isSorted
5359
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   704
    "return true. if my elements are sorted"
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   705
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   706
    ^ true
5359
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   707
!
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   708
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   709
isSortedBy:aBlock
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   710
    "return true, if my elements are sorted (already) by the given criterion (sortBlock)."
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   711
5359
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   712
    aBlock == sortBlock ifTrue:[^ true].
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   713
    ^ super isSortedBy:aBlock
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   714
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   715
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   716
!
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   717
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   718
isSortedCollection
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   719
    "return true. if I am a sorted collection"
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   720
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   721
    ^ true
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   722
! !
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   723
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   724
!SortedCollection methodsFor:'searching'!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   725
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   726
after:anObject ifAbsent:exceptionBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   727
    "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
   728
     If anObject is contained multiple times in the collection, return the
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   729
     the first element which is non-equal to anObject.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   730
     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
   731
     exceptionBlock."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   732
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   733
    |index      "{ Class: SmallInteger }"
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   734
     last       "{ Class: SmallInteger }"|
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   735
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   736
    index := self indexForInserting:anObject.
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   737
    ((index < firstIndex)
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   738
     or:[(contentsArray at:index) ~= anObject]) ifTrue:[^ exceptionBlock value].
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   739
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   740
    "skip multiple occurrences of the same ..."
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   741
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   742
    last := lastIndex.
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   743
    [(index <= last) and:[(contentsArray at:index) = anObject]] whileTrue:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   744
	index := index + 1
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   745
    ].
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   746
    (index > last) ifTrue:[^ nil].
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   747
    ^ contentsArray at:index
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   748
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   749
    "Modified: 12.4.1996 / 13:20:33 / cg"
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   750
!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   751
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   752
before:anObject ifAbsent:exceptionBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   753
    "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
   754
     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
   755
     exceptionBlock."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   756
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   757
    |index      "{ Class: SmallInteger }"|
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   758
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   759
    index := self indexForInserting:anObject.
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   760
    ((index <= firstIndex)
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   761
     or:[(contentsArray at:index) ~= anObject]) ifTrue:[^ exceptionBlock value].
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   762
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   763
    ^ contentsArray at:index - 1
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   764
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   765
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   766
     #(7 3 9 10 99) asSortedCollection before:50
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   767
     #(7 3 9 10 99) asSortedCollection before:1
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   768
     #(7 3 9 10 99) asSortedCollection before:10
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   769
     #(7 3 9 10 99) asSortedCollection before:7
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   770
     #(7 3 9 10 99) asSortedCollection before:99
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   771
     #(7 10 3 10 9 10 10 99) asSortedCollection before:9
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   772
     #(7 10 3 10 9 10 10 99) asSortedCollection before:10
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   773
    "
4596
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   774
!
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   775
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   776
indexOf:anElement
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   777
    "Return the index of anElement within the receiver.
4596
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   778
     If the receiver does not contain anElement, return 0."
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   779
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   780
    ^ self indexOf:anElement ifAbsent:0
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   781
!
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   782
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   783
indexOf:anElement ifAbsent:exceptionBlock
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   784
    "Return the index of anElement within the receiver.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   785
     If the receiver does not contain anElement,
4596
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   786
     return the result of evaluating the argument, exceptionBlock."
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   787
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   788
    |insertionIndex index "{ Class: SmallInteger }"
4596
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   789
     obj|
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   790
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   791
    firstIndex > lastIndex ifTrue:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   792
	"/ empty
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   793
	^ exceptionBlock value
4596
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   794
    ].
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   795
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   796
    "/ if I am small, the inherited linear search is faster ...
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   797
    (lastIndex - firstIndex) < 20 ifTrue:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   798
	^ super indexOf:anElement ifAbsent:exceptionBlock
4596
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   799
    ].
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   800
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   801
    insertionIndex := self indexForInserting:anElement.
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   802
    insertionIndex > lastIndex ifTrue:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   803
	insertionIndex := lastIndex
4596
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   804
    ] ifFalse:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   805
	insertionIndex < firstIndex ifTrue:[
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   806
	    insertionIndex := firstIndex
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   807
	]
4596
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   808
    ].
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   809
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   810
    index := insertionIndex.
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   811
    [index >= firstIndex
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   812
    and:[obj := contentsArray basicAt:index.
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   813
	    anElement = obj ifTrue: [^ index - firstIndex + 1].
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   814
	    [sortBlock value:anElement value:obj]]]
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   815
		    whileTrue: [index := index - 1].
4596
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   816
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   817
    index := insertionIndex.
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   818
    [index <= lastIndex
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   819
    and: [obj := contentsArray basicAt: index.
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   820
	    anElement = obj ifTrue: [^ index - firstIndex + 1].
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   821
	    [sortBlock value:obj value:anElement]]]
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   822
		    whileTrue: [index := index + 1].
4596
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   823
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   824
    ^exceptionBlock value
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   825
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   826
    "
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   827
     #('aa' 'bb' 'cc' 'dd') asSortedCollection indexOf:'bb'
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   828
     #('aa' 'bb' 'cc' 'dd' 'aa' 'bb' 'cc' 'dd') asSortedCollection indexOf:'bb'
4596
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   829
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   830
     |allSyms indices|
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   831
     allSyms := Symbol allInstances asSortedCollection.
4596
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   832
     Time millisecondsToRun:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   833
	 indices := allSyms collect:[:el | allSyms indexOf:el].
4596
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   834
     ].
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   835
     indices = (1 to:allSyms size)
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   836
    "
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   837
! !
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   838
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   839
!SortedCollection methodsFor:'testing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   840
a27a279701f8 Initial revision
claus
parents:
diff changeset
   841
includes:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   842
    "return true, if the argument, anObject is in the collection.
62
e1b4369c61fb *** empty log message ***
claus
parents: 44
diff changeset
   843
     Redefined, since due to being sorted, the inclusion check can
2
claus
parents: 1
diff changeset
   844
     be done with log-n compares i.e. much faster."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   845
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   846
    |index "{ Class: SmallInteger }"|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   847
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   848
    index := self indexForInserting:anObject.
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   849
    ((index < firstIndex) or:[index > lastIndex]) ifTrue:[^ false].
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   850
    ^ (contentsArray at:index) = anObject
2
claus
parents: 1
diff changeset
   851
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   852
    "
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   853
     #(7 3 9 10 99) asSortedCollection includes:50
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   854
     #(7 3 9 10 99) asSortedCollection includes:10
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   855
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   856
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   857
a27a279701f8 Initial revision
claus
parents:
diff changeset
   858
occurrencesOf:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   859
    "return how many times the argument, anObject is in the collection.
62
e1b4369c61fb *** empty log message ***
claus
parents: 44
diff changeset
   860
     Redefined, since due to being sorted, the range of checked objects
5048
b1e10ce753fd comment
Claus Gittinger <cg@exept.de>
parents: 5030
diff changeset
   861
     can be limited i.e. it can be done much faster.
b1e10ce753fd comment
Claus Gittinger <cg@exept.de>
parents: 5030
diff changeset
   862
      Uses #= (i.e. equality) compare."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   863
a27a279701f8 Initial revision
claus
parents:
diff changeset
   864
    |index      "{ Class: SmallInteger }"
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   865
     tally      "{ Class: SmallInteger }"
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   866
     last       "{ Class: SmallInteger }" |
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   867
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   868
    index := self indexForInserting:anObject.
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   869
    last := lastIndex.
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   870
    ((index < firstIndex) or:[index > last]) ifTrue:[^ 0].
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   871
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   872
    "/ there may be multiple of them; count 'em
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   873
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   874
    tally := 0.
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   875
    [(index <= last) and:[(contentsArray at:index) = anObject]] whileTrue:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   876
	tally := tally + 1.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   877
	index := index + 1
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   878
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   879
    ^ tally
2
claus
parents: 1
diff changeset
   880
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   881
    "
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   882
     #(7 3 9 10 99) asSortedCollection occurrencesOf:50
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   883
     #(7 3 9 10 99) asSortedCollection occurrencesOf:10
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   884
     #(7 10 3 10 9 10 10 99) asSortedCollection occurrencesOf:10
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   885
    "
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   886
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   887
    "Modified: 12.4.1996 / 18:48:40 / cg"
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   888
! !
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   889
629
2ceefe9b5a19 version at the end
Claus Gittinger <cg@exept.de>
parents: 607
diff changeset
   890
!SortedCollection class methodsFor:'documentation'!
2ceefe9b5a19 version at the end
Claus Gittinger <cg@exept.de>
parents: 607
diff changeset
   891
2ceefe9b5a19 version at the end
Claus Gittinger <cg@exept.de>
parents: 607
diff changeset
   892
version
9920
316e29a48e51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9918
diff changeset
   893
    ^ '$Header: /cvs/stx/stx/libbasic/SortedCollection.st,v 1.62 2006-09-18 09:05:57 cg Exp $'
629
2ceefe9b5a19 version at the end
Claus Gittinger <cg@exept.de>
parents: 607
diff changeset
   894
! !
7300
461bb09c5954 category
Claus Gittinger <cg@exept.de>
parents: 6737
diff changeset
   895
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   896
SortedCollection initialize!