SortedCollection.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 22 Sep 2015 16:28:42 +0100
branchjv
changeset 18759 c1217211909c
parent 18509 85976deb6616
child 19103 71257a47eba2
permissions -rw-r--r--
Changed identification strings to contain jv-branch ...to make explicit that this distribution is not the official one used by eXept and therefore that eXept is not to be blamed in case of any problem.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
     1
"{ Encoding: utf8 }"
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
     2
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     3
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
 COPYRIGHT (c) 1993 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
     5
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
"
5359
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
    14
"{ Package: 'stx:libbasic' }"
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
    15
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
    16
"{ NameSpace: Smalltalk }"
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
    17
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
OrderedCollection subclass:#SortedCollection
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
    19
	instanceVariableNames:'sortBlock'
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
    20
	classVariableNames:'DefaultSortBlock'
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
    21
	poolDictionaries:''
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
    22
	category:'Collections-Sequenceable'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    25
!SortedCollection class methodsFor:'documentation'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    27
copyright
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    28
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    29
 COPYRIGHT (c) 1993 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    30
	      All Rights Reserved
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    31
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    32
 This software is furnished under a license and may be used
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    33
 only in accordance with the terms of that license and with the
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    34
 inclusion of the above copyright notice.   This software may not
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    35
 be provided or otherwise made available to, or used by, any
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    36
 other person.  No title to or ownership of the software is
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    37
 hereby transferred.
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    38
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    39
!
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    40
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    41
documentation
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    42
"
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    43
    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
    44
    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
    45
    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
    46
    element given as second arg.
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    47
1156
7ce47f220573 commentary
Claus Gittinger <cg@exept.de>
parents: 1155
diff changeset
    48
    Equal elements may occur multiple times.
7ce47f220573 commentary
Claus Gittinger <cg@exept.de>
parents: 1155
diff changeset
    49
11274
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
    50
    SortedCollection uses quickSort to resort and a binary search when adding/removing elements.
1156
7ce47f220573 commentary
Claus Gittinger <cg@exept.de>
parents: 1155
diff changeset
    51
    Because insertion/removal may require that remaining elements have to
7ce47f220573 commentary
Claus Gittinger <cg@exept.de>
parents: 1155
diff changeset
    52
    be shifted within the container, adding many individual elements may be done faster
7ce47f220573 commentary
Claus Gittinger <cg@exept.de>
parents: 1155
diff changeset
    53
    by creating a completely new collection from the unsorted elements.
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    54
    (see examples)
1156
7ce47f220573 commentary
Claus Gittinger <cg@exept.de>
parents: 1155
diff changeset
    55
11274
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
    56
    A sortBlock of [:a :b | a < b] defines ascending sort-order,
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    57
    while [:a :b | a > b] defines descening order.
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    58
    The default sortBlock for SortedCollections is the first one.
1290
15ba3221b89b documentation
Claus Gittinger <cg@exept.de>
parents: 1175
diff changeset
    59
3251
87cac58a4e57 added VW compatibility warning
Claus Gittinger <cg@exept.de>
parents: 3250
diff changeset
    60
    Compatibility Warning:
11274
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
    61
        VW seems to use a default sortBlock which compares a<=b, wheras ST/X uses a<b.
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
    62
        That means, that elements which are compared MUST understand #< in ST/X
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
    63
        while the minumum protocol is #<= in VW.
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
    64
        This may be changed in a future release of ST/X
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
    65
        (it is not yet, to not confuse existing applications ...
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
    66
         ... be aware, that the sortBlock has an effect on a few algorithms
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
    67
         found here; especially #indexForInserting is critical.)
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
    68
14304
de0dd4c4c40a changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 14116
diff changeset
    69
    [caveat:]
de0dd4c4c40a changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 14116
diff changeset
    70
        a balanced tree may be a better choice, as inserting may be slow when
de0dd4c4c40a changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 14116
diff changeset
    71
        elements have to be shifted.
3251
87cac58a4e57 added VW compatibility warning
Claus Gittinger <cg@exept.de>
parents: 3250
diff changeset
    72
1290
15ba3221b89b documentation
Claus Gittinger <cg@exept.de>
parents: 1175
diff changeset
    73
    [author:]
11274
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
    74
        Claus Gittinger
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    75
"
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    76
!
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    77
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    78
examples
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    79
"
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
    80
    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
    81
    all en-bloeque instead of individually.
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    82
    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
    83
    shifted, to create an empty slot for the new element.
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    84
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    85
    timing example:
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    86
9074
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
    87
        |o rnd|
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    88
9074
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
    89
        o := SortedCollection new.
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
    90
        rnd := Random new.
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
    91
        10000 timesRepeat:[
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
    92
            o add:rnd next.
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
1175
7ca26065cf02 commentary
Claus Gittinger <cg@exept.de>
parents: 1173
diff changeset
    95
    takes 1365 ms on a P5 (admitted: this is a fast machine ;-)
11274
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
    96
    Times are a'changing: 
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
    97
        Just came around 2005: on my 1.5Ghz laptop, this now takes 260ms...
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
    98
        an another comment 2008: on a 1.8Ghz laptop, it takes now 105ms...
9074
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
    99
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
   100
    In contrast:
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
   101
9074
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
   102
        |o rnd|
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
   103
9074
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
   104
        o := OrderedCollection new.
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
   105
        rnd := Random new.
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
   106
        10000 timesRepeat:[
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
   107
            o add:rnd next.
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
   108
        ].
8358ce743c48 comment
Claus Gittinger <cg@exept.de>
parents: 9073
diff changeset
   109
        o := o asSortedCollection
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
   110
1175
7ca26065cf02 commentary
Claus Gittinger <cg@exept.de>
parents: 1173
diff changeset
   111
    takes 383 ms on the same machine.
11274
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   112
        2005: on my 1.5Ghz laptop, this now takes 100ms
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   113
        2008: on a 1.8Ghz laptop, this now takes 47ms
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   114
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   115
    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
   116
    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
   117
    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
   118
    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
   119
    on the machine ... (and ST/X version ;-).
11268
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   120
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   121
11274
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   122
  adding elements in order:
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   123
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   124
    |c|
11268
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   125
    Time millisecondsToRun:[
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   126
        10 timesRepeat:[
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   127
            |c|
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   128
            c := SortedCollection new.
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   129
            (1 to:100000) do:[:e | c add:e].
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   130
        ]
11274
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   131
    ].    
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   132
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   133
    (5.4.1: 2031 2187)
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   134
    (5.4.3: 484 516)
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   135
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   136
    |c|
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   137
    c := SortedCollection new.
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   138
    (1 to:100000) do:[:e | c add:e].
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   139
    self assert:(c asBag = (1 to:100000) asBag).
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   140
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   141
  adding elements in reverse order:
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   142
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   143
    Time millisecondsToRun:[
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   144
        10 timesRepeat:[
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   145
            |c|
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   146
            c := SortedCollection new.
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   147
            (1 to:100000) reverseDo:[:e | c add:e].
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   148
        ]
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   149
    ].        
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   150
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   151
    (5.4.1: 201969)
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   152
    (5.4.3: 1609 1766)
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   153
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   154
    |c|
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   155
    c := SortedCollection new.
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   156
    (1 to:100000) reverseDo:[:e | c add:e].
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   157
    self assert:(c asBag = (1 to:100000) asBag).
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   158
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   159
  adding elements in random order:
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   160
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   161
    |toAdd|
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   162
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   163
    toAdd := (1 to:100000) asOrderedCollection randomShuffle.
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   164
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   165
    Time millisecondsToRun:[
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   166
        10 timesRepeat:[
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   167
            |c|
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   168
            c := SortedCollection new.
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   169
            toAdd do:[:e | c add:e].
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   170
        ]
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   171
    ].
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   172
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   173
    (5.4.1: 108484)
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   174
    (5.4.3: 75734)
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   175
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   176
    |c|
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   177
    c := SortedCollection new.
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   178
    (1 to:100000) asOrderedCollection randomShuffle do:[:e | c add:e].
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   179
    self assert:(c asBag = (1 to:100000) asBag).
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
   180
"
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   181
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   182
a27a279701f8 Initial revision
claus
parents:
diff changeset
   183
!SortedCollection class methodsFor:'initialization'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   184
a27a279701f8 Initial revision
claus
parents:
diff changeset
   185
initialize
8180
7c346c8015f2 Only use #> for comparisons, since this is the base mechanism.
Stefan Vogel <sv@exept.de>
parents: 7554
diff changeset
   186
    "setup the default sortBlock.
12034
0d6c9626eb0a comment
Claus Gittinger <cg@exept.de>
parents: 11478
diff changeset
   187
     Use #<, since this is the base method in Magnitude."
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   188
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   189
    "/ only do this once at early startup
913
7d9881f9c908 only initialize once
Claus Gittinger <cg@exept.de>
parents: 629
diff changeset
   190
    DefaultSortBlock isNil ifTrue:[
12034
0d6c9626eb0a comment
Claus Gittinger <cg@exept.de>
parents: 11478
diff changeset
   191
        DefaultSortBlock := [:a :b | a < b]
913
7d9881f9c908 only initialize once
Claus Gittinger <cg@exept.de>
parents: 629
diff changeset
   192
    ]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   193
913
7d9881f9c908 only initialize once
Claus Gittinger <cg@exept.de>
parents: 629
diff changeset
   194
    "
7d9881f9c908 only initialize once
Claus Gittinger <cg@exept.de>
parents: 629
diff changeset
   195
     SortedCollection initialize
7d9881f9c908 only initialize once
Claus Gittinger <cg@exept.de>
parents: 629
diff changeset
   196
    "
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   197
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   198
    "Modified: 12.4.1996 / 12:29:27 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   199
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   200
a27a279701f8 Initial revision
claus
parents:
diff changeset
   201
!SortedCollection class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   202
2929
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   203
forStrings
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   204
    "this is supposed to return a sortedCollection, which sorts using
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   205
     the current locales collating sequence. For now, simply use a
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   206
     normal string compare.
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   207
     This will change"
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   208
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   209
    ^ self new
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   210
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   211
    "Modified: 13.9.1997 / 10:18:58 / cg"
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   212
    "Created: 13.9.1997 / 10:41:54 / cg"
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   213
!
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   214
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   215
forStrings:size
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   216
    "this is supposed to return a sortedCollection, which sorts using
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   217
     the current locales collating sequence. For now, simply use a
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   218
     normal string compare.
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   219
     This will change"
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   220
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   221
    ^ self new:size
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   222
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   223
    "Modified: 13.9.1997 / 10:18:58 / cg"
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   224
!
ca74fdc386cc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2248
diff changeset
   225
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   226
new
2
claus
parents: 1
diff changeset
   227
    "return a new sortedCollection, the sorting is done using
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   228
     a compare for a < b, in ascending order"
2
claus
parents: 1
diff changeset
   229
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   230
    ^ super new setSortBlock:DefaultSortBlock
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   231
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   232
    "Modified: 12.4.1996 / 12:28:18 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   233
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   234
a27a279701f8 Initial revision
claus
parents:
diff changeset
   235
new:size
2
claus
parents: 1
diff changeset
   236
    "return a new sortedCollection with preallocated size.
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   237
     The sorting is done using a compare for a < b, in ascending order"
2
claus
parents: 1
diff changeset
   238
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   239
    ^ (super new:size) setSortBlock:DefaultSortBlock
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   240
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   241
    "Modified: 12.4.1996 / 12:28:22 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   242
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   243
a27a279701f8 Initial revision
claus
parents:
diff changeset
   244
sortBlock:aBlock
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   245
    "return a new sortedCollection, whe the sort order is defined
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   246
     by aBlock.
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   247
     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
   248
     its arg2 in the collection."
2
claus
parents: 1
diff changeset
   249
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   250
    ^ super new setSortBlock:aBlock
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   251
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   252
    "default:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   253
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   254
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   255
     s := SortedCollection new.
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   256
     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
   257
     Transcript showCR:s
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   258
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   259
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   260
    "sorting by absolute values:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   261
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   262
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   263
     s := SortedCollection sortBlock:[:a :b | a abs < b abs].
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   264
     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
   265
     Transcript showCR:s
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   266
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   267
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   268
    "default again:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   269
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   270
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   271
     s := SortedCollection new.
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   272
     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
   273
     Transcript showCR:s
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   274
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   275
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   276
    "sorting strings caseless:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   277
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   278
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   279
     s := SortedCollection sortBlock:[:a :b | a asLowercase < b asLowercase].
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   280
     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
   281
     Transcript showCR:s
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   282
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   283
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   284
    "Modified: 12.4.1996 / 12:26:28 / cg"
329
claus
parents: 216
diff changeset
   285
!
claus
parents: 216
diff changeset
   286
claus
parents: 216
diff changeset
   287
withAll:aCollection sortBlock:aBlock
claus
parents: 216
diff changeset
   288
    "initialize from aCollection and set the sort-block"
claus
parents: 216
diff changeset
   289
2248
b11a16f51048 withAll:aCollection sortBlock:aBlock
ca
parents: 1422
diff changeset
   290
    ^ (self sortBlock:aBlock) addAll:aCollection; yourself
329
claus
parents: 216
diff changeset
   291
claus
parents: 216
diff changeset
   292
    "
claus
parents: 216
diff changeset
   293
     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
   294
		      sortBlock:[:a :b | a > b]
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   295
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   296
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   297
    "default:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   298
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   299
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   300
     s := SortedCollection withAll:#(15 99 3 29 17 -6).
1422
9a0b792f2953 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1367
diff changeset
   301
     Transcript showCR:s
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   302
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   303
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   304
    "sorting by absolute values:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   305
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   306
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   307
     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
   308
     Transcript showCR:s
329
claus
parents: 216
diff changeset
   309
    "
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   310
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   311
    "default again:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   312
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   313
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   314
     s := SortedCollection withAll:#('foo' 'Bar' 'baz' 'hello' 'world' 'Wow').
1422
9a0b792f2953 showCr: -> showCR:
Claus Gittinger <cg@exept.de>
parents: 1367
diff changeset
   315
     Transcript showCR:s
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   316
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   317
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   318
    "sorting strings caseless:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   319
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   320
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   321
     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
   322
     Transcript showCR:s
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   323
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   324
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   325
    "Modified: 12.4.1996 / 12:28:09 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   326
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   327
7300
461bb09c5954 category
Claus Gittinger <cg@exept.de>
parents: 6737
diff changeset
   328
!SortedCollection class methodsFor:'Compatibility-Dolphin'!
6411
199e6d88c562 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 5816
diff changeset
   329
199e6d88c562 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 5816
diff changeset
   330
sortBlock:aBlock withAll:aCollection
199e6d88c562 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 5816
diff changeset
   331
    ^ self withAll:aCollection sortBlock:aBlock
199e6d88c562 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 5816
diff changeset
   332
! !
199e6d88c562 dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 5816
diff changeset
   333
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   334
!SortedCollection methodsFor:'adding & removing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   335
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   336
add:anObject
11268
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   337
    "add the argument, anObject at the proper place in the receiver. 
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   338
     Returns the argument, anObject (sigh)."
2
claus
parents: 1
diff changeset
   339
11268
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   340
    |index lastElement|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   341
11274
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   342
    "/
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   343
    "/ cg: the original code was simply:
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   344
    "/
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   345
    "/  index := self indexForInserting:anObject.
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   346
    "/  index := self makeRoomAtIndex:index.
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   347
    "/  contentsArray basicAt:index put:anObject.
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   348
    "/
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   349
    "/  which was nice and simple to understand.
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   350
    "/ However, the code below is 5 times faster, if elements are added in an already ordered fashion,
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   351
    "/ which often happens.
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   352
    "/ so we allow the code to be a bit more complicated...
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   353
11268
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   354
    (lastIndex < firstIndex "i.e. self size == 0"
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   355
    or:[ 
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   356
        lastElement := contentsArray basicAt:lastIndex.
11268
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   357
        (sortBlock value:lastElement value:anObject)    
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   358
    ]) ifTrue:[
11274
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   359
        "/ empty or lastElement is smaller then newElement; add at the end
11268
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   360
        index := lastIndex.
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   361
        (index == contentsArray size) ifTrue:[
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   362
            self makeRoomAtLast.
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   363
            index := lastIndex.
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   364
        ].
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   365
        lastIndex := index := index + 1.
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   366
    ] ifFalse:[
11268
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   367
        index := self indexForInserting:anObject.
11274
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   368
        (index == firstIndex) ifTrue:[
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   369
            (firstIndex == 1) ifTrue:[
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   370
                self makeRoomAtFront.
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   371
            ].
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   372
            index := firstIndex := firstIndex - 1.
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   373
        ] ifFalse:[
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   374
            index := self makeRoomAtIndex:index.
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   375
        ].
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   376
    ].
3340
300d88cf8b14 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3251
diff changeset
   377
    contentsArray basicAt:index put:anObject.
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   378
    ^ anObject
2
claus
parents: 1
diff changeset
   379
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   380
    "
11268
7ce883e9a42e tuned add: if the elements are added in sorted order
Claus Gittinger <cg@exept.de>
parents: 9920
diff changeset
   381
     #(7 3 9 10 99) asSortedCollection add:5; yourself
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   382
     #(7 3 9 10 99) asSortedCollection add:1; yourself
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   383
     #(7 3 9 10 99) asSortedCollection add:1000; yourself
11274
a6f648b1d291 tune adding in order / in reverse order
Claus Gittinger <cg@exept.de>
parents: 11268
diff changeset
   384
     #(7 3 9 10 99) asSortedCollection add:1; yourself   
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   385
    "
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   386
11276
1d4450f49a14 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11274
diff changeset
   387
    "Modified: / 22-10-2008 / 17:09:39 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   388
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   389
a27a279701f8 Initial revision
claus
parents:
diff changeset
   390
addAll:aCollection
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   391
    "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
   392
     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
   393
11286
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   394
    |addedCollection mySize numAdded|
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   395
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   396
    numAdded := aCollection size.
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   397
    mySize := self size.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   398
5359
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   399
    (aCollection isSortedCollection
7554
7ea961a68e34 Save copying in #addAll
Stefan Vogel <sv@exept.de>
parents: 7300
diff changeset
   400
     and:[aCollection sortBlock == sortBlock]) ifTrue:[
11286
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   401
        addedCollection := aCollection.
5030
655a0f0a60c3 use my sortBlock when merge-sorting
Claus Gittinger <cg@exept.de>
parents: 5029
diff changeset
   402
    ] ifFalse:[
11286
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   403
        addedCollection := Array withAll:aCollection.
14101
8c41a875b2cf changed: #addAll:
Stefan Vogel <sv@exept.de>
parents: 12038
diff changeset
   404
        addedCollection stableSort:sortBlock.
5030
655a0f0a60c3 use my sortBlock when merge-sorting
Claus Gittinger <cg@exept.de>
parents: 5029
diff changeset
   405
11286
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   406
        mySize == 0 ifTrue:[
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   407
            "/ special case: I am empty - add them en-bloque.
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   408
            contentsArray := addedCollection.
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   409
            firstIndex := 1.
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   410
            lastIndex := numAdded.
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   411
            ^ aCollection
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   412
        ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   413
    ].
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   414
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   415
    "/
5030
655a0f0a60c3 use my sortBlock when merge-sorting
Claus Gittinger <cg@exept.de>
parents: 5029
diff changeset
   416
    "/ 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
   417
    "/
5030
655a0f0a60c3 use my sortBlock when merge-sorting
Claus Gittinger <cg@exept.de>
parents: 5029
diff changeset
   418
    self mergeSorted:addedCollection.
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   419
    ^ aCollection
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   420
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   421
    "
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   422
     #(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
   423
5028
1f7e943ce46e use my sortBlock when merge-sorting
Claus Gittinger <cg@exept.de>
parents: 4596
diff changeset
   424
     ( #(7 3 9 10 99) asSortedCollection:[:a :b | a > b])
11286
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   425
         addAll:#(77 0 1 16 5); yourself
5030
655a0f0a60c3 use my sortBlock when merge-sorting
Claus Gittinger <cg@exept.de>
parents: 5029
diff changeset
   426
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   427
     #(7 3 9 10 99) asSortedCollection
11286
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   428
        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
   429
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   430
     (#(7 3 9 10 99) asSortedCollection:[:a :b | a > b])
11286
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   431
        addAll:( #(77 0 1 16 5) asSortedCollection:[:a :b | a < b]); yourself
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   432
    "
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   433
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   434
    "
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   435
     |x e|
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   436
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   437
     e := (1 to:100) asSortedCollection.
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   438
     TimeDuration toRun:[
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   439
         10000 timesRepeat:[
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   440
            x := SortedCollection new:100.
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   441
            x addAll:e. 
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   442
         ].
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   443
     ].      
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   444
    "
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   445
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   446
    "Modified: 13.4.1996 / 12:42:15 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   447
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   448
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   449
mergeSorted:aSortedCollection
11286
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   450
    "add all elements of the argument, aSortedCollection to the receiver.
12038
1e214cdac722 comment/format in:
Claus Gittinger <cg@exept.de>
parents: 12034
diff changeset
   451
     This leads to an error, if the argument is not sorted.
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   452
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   453
     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
   454
     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
   455
     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
   456
     Therefore, adding chunks is better done by sorting the chunk and merging
14310
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   457
     it in, instead of resorting the receiver.
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   458
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   459
     aSortedCollection must be sorted by the same sortBlock as myself!!"
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   460
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   461
    |newContentsArray
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   462
     contentsArray2
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   463
     destIndex "{ Class: SmallInteger }"
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   464
     n1        "{ Class: SmallInteger }"
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   465
     n2        "{ Class: SmallInteger }"
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   466
     srcIndex1 "{ Class: SmallInteger }"
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   467
     srcIndex2 "{ Class: SmallInteger }"
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   468
     last1     "{ Class: SmallInteger }"
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   469
     last2     "{ Class: SmallInteger }"
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   470
     end1Reached end2Reached
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   471
     el1 el2 |
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   472
14310
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   473
    n2 := aSortedCollection size.
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   474
    n2 == 0 ifTrue:[
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   475
        ^ self.
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   476
    ].
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   477
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   478
    aSortedCollection isSortedCollection ifTrue:[
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   479
        contentsArray2 := aSortedCollection contentsArray.
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   480
        srcIndex2 := aSortedCollection firstIndex.
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   481
    ] ifFalse:[
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   482
        contentsArray2 := aSortedCollection.
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   483
        srcIndex2 := 1.
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   484
    ].
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   485
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   486
    n1 := self size.
5381
914e310a69be Fix #mergeSorted if one of the collections is empty.
Stefan Vogel <sv@exept.de>
parents: 5359
diff changeset
   487
    n1 == 0 ifTrue:[
14310
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   488
        firstIndex := srcIndex2.
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   489
        lastIndex := firstIndex + n2 - 1.
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   490
        contentsArray := contentsArray2 copy.
11286
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   491
        ^ self.
5381
914e310a69be Fix #mergeSorted if one of the collections is empty.
Stefan Vogel <sv@exept.de>
parents: 5359
diff changeset
   492
    ].
914e310a69be Fix #mergeSorted if one of the collections is empty.
Stefan Vogel <sv@exept.de>
parents: 5359
diff changeset
   493
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   494
    newContentsArray := Array new:(n1 + n2).
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   495
    destIndex := 1.
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
    last2 := srcIndex2 + n2 -1.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   498
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   499
    srcIndex1 := firstIndex.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   500
    last1 := srcIndex1 + n1 -1.
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
    (srcIndex1 <= last1 and:[srcIndex2 <= last2]) ifTrue:[
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   503
        el1 := contentsArray basicAt:srcIndex1.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   504
        el2 := contentsArray2 basicAt:srcIndex2.
11286
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   505
        end1Reached := end2Reached := false.
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   506
11286
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   507
        [end1Reached or:[end2Reached]] whileFalse:[
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   508
            (sortBlock value:el1 value:el2) ifTrue:[
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   509
                "/ el1 to come before el2
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   510
                newContentsArray basicAt:destIndex put:el1. destIndex := destIndex + 1.
11286
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   511
                srcIndex1 := srcIndex1 + 1.
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   512
                srcIndex1 <= last1 ifTrue:[
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   513
                    el1 := contentsArray basicAt:srcIndex1.
11286
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   514
                ] ifFalse:[
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   515
                    end1Reached := true
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   516
                ]
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   517
            ] ifFalse:[
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   518
                "/ el2 to come before el1
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   519
                newContentsArray basicAt:destIndex put:el2. destIndex := destIndex + 1.
11286
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   520
                srcIndex2 := srcIndex2 + 1.
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   521
                srcIndex2 <= last2 ifTrue:[
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   522
                    el2 := contentsArray2 basicAt:srcIndex2.
11286
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   523
                ] ifFalse:[
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   524
                    end2Reached := true
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   525
                ]
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   526
            ]
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   527
        ]
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   528
    ].
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   529
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   530
    "/ 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
   531
    (srcIndex1 <= last1) ifTrue:[
11286
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   532
        newContentsArray
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   533
            replaceFrom:destIndex
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   534
            to:(destIndex+(last1-srcIndex1))
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   535
            with:contentsArray
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   536
            startingAt:srcIndex1
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   537
    ].
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   538
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   539
    "/ 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
   540
    (srcIndex2 <= last2) ifTrue:[
11286
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   541
        newContentsArray
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   542
            replaceFrom:destIndex
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   543
            to:(destIndex+(last2-srcIndex2))
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   544
            with:contentsArray2
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   545
            startingAt:srcIndex2
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   546
    ].
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   547
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   548
    firstIndex := 1.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   549
    lastIndex := n1 + n2.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   550
    contentsArray := newContentsArray
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   551
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   552
    "
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   553
     #(7 3 9 10 99) asSortedCollection
11286
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   554
        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
   555
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   556
     #(7 3 9 10 99) asSortedCollection
11286
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   557
        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
   558
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   559
     #() asSortedCollection
11286
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   560
        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
   561
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   562
     #(7 3 9 10 99) asSortedCollection
11286
76f3020ba113 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11276
diff changeset
   563
        mergeSorted:#() asSortedCollection
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   564
    "
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   565
3250
c4b444774f1c oops - mergesort cannot simply copy remaining
Claus Gittinger <cg@exept.de>
parents: 2929
diff changeset
   566
    "Modified: / 30.1.1998 / 01:49:42 / cg"
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   567
! !
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   568
5560
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   569
!SortedCollection methodsFor:'blocked'!
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   570
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   571
add:newObject after:oldObject
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   572
    "catch this - its not allowed for sortedCollections"
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   573
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   574
    self shouldNotImplement
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   575
!
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   576
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   577
add:newObject before:oldObject
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   578
    "catch this - its not allowed for sortedCollections"
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   579
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   580
    self shouldNotImplement
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   581
!
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   582
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   583
addFirst:anObject
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   584
    "catch this - its not allowed for sortedCollections"
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   585
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   586
    self shouldNotImplement
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   587
!
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   588
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   589
addLast:anObject
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   590
    "catch this - its not allowed for sortedCollections"
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   591
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   592
    self shouldNotImplement
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   593
! !
89a83b354d27 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5381
diff changeset
   594
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   595
!SortedCollection methodsFor:'converting'!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   596
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   597
asSortedCollection
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   598
    "return the receiver as a sorted collection"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   599
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   600
    "could be an instance of a subclass..."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   601
    self class == SortedCollection ifTrue:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   602
	sortBlock == DefaultSortBlock ifTrue:[
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   603
	    ^ self
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   604
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   605
    ].
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   606
    ^ super asSortedCollection
5029
ae3312dda1dd avoid creation of a new sortedCollection in #asSortedCollection:
Claus Gittinger <cg@exept.de>
parents: 5028
diff changeset
   607
!
ae3312dda1dd avoid creation of a new sortedCollection in #asSortedCollection:
Claus Gittinger <cg@exept.de>
parents: 5028
diff changeset
   608
ae3312dda1dd avoid creation of a new sortedCollection in #asSortedCollection:
Claus Gittinger <cg@exept.de>
parents: 5028
diff changeset
   609
asSortedCollection:aSortBlock
ae3312dda1dd avoid creation of a new sortedCollection in #asSortedCollection:
Claus Gittinger <cg@exept.de>
parents: 5028
diff changeset
   610
    "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
   611
     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
   612
     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
   613
ae3312dda1dd avoid creation of a new sortedCollection in #asSortedCollection:
Claus Gittinger <cg@exept.de>
parents: 5028
diff changeset
   614
    "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
   615
    self class == SortedCollection ifTrue:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   616
	"/ if the sortBlock is the same, return the receiver
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   617
	aSortBlock == sortBlock ifTrue:[
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   618
	    ^ self
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   619
	].
5029
ae3312dda1dd avoid creation of a new sortedCollection in #asSortedCollection:
Claus Gittinger <cg@exept.de>
parents: 5028
diff changeset
   620
    ].
5030
655a0f0a60c3 use my sortBlock when merge-sorting
Claus Gittinger <cg@exept.de>
parents: 5029
diff changeset
   621
    ^ super asSortedCollection:aSortBlock
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   622
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   623
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   624
!SortedCollection methodsFor:'copying'!
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   625
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   626
copyEmpty:size
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   627
    "return a copy of the receiver with no elements, but
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   628
     the same size. This method has been be redefined to
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   629
     preserve the sortBlock."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   630
14110
86f18b7f3b54 changed: #copyEmpty:
Stefan Vogel <sv@exept.de>
parents: 14101
diff changeset
   631
    ^ (super copyEmpty:size) sortBlock:sortBlock
607
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
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   634
postCopyFrom:anOriginal
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   635
    "sent after a copy or when a new collection species has been created.
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   636
     The new collection should have the same sortBlock as the original."
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   637
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   638
    sortBlock := anOriginal sortBlock
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   639
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   640
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   641
     #(4 7 1 99 -1 17) asSortedCollection inspect
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   642
     #(4 7 1 99 -1 17) asSortedCollection copy inspect
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   643
     (#(4 7 1 99 -1 17) asSortedCollection sortBlock:[:a :b | a > b]) inspect
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   644
     (#(4 7 1 99 -1 17) asSortedCollection sortBlock:[:a :b | a > b]) copy inspect
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   645
     (#(4 7 1 99 -1 17) asSortedCollection select:[:e| e even]) inspect
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   646
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   647
! !
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   648
216
a8abff749575 *** empty log message ***
claus
parents: 202
diff changeset
   649
!SortedCollection methodsFor:'enumerating'!
184
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   650
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   651
collect:aBlock
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   652
    "evaluate the argument, aBlock for every element in the collection
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   653
     and return a collection of the results. Redefined to return an OrderedCollection;
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   654
     see X3J20 spec. (SortedCollection>>collect: should return an OrderedCollection)"
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   655
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   656
    |newCollection
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   657
     start  "{ Class:SmallInteger }"
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   658
     stop   "{ Class:SmallInteger }" |
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   659
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   660
    newCollection := self speciesForCollecting new:(self size).
184
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   661
    stop := lastIndex.
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   662
    start := firstIndex.
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   663
    start to:stop do:[:index |
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   664
        newCollection add:(aBlock value:(contentsArray basicAt:index)).
184
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   665
    ].
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   666
    ^ newCollection
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   667
! !
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   668
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   669
!SortedCollection methodsFor:'instance protocol'!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   670
5668
0cbaa16dc17c Inherited #sort: shows a debugger.
Stefan Vogel <sv@exept.de>
parents: 5604
diff changeset
   671
sort:aSortBlock
0cbaa16dc17c Inherited #sort: shows a debugger.
Stefan Vogel <sv@exept.de>
parents: 5604
diff changeset
   672
    "redefined from superclass to change the sortBlock"
0cbaa16dc17c Inherited #sort: shows a debugger.
Stefan Vogel <sv@exept.de>
parents: 5604
diff changeset
   673
0cbaa16dc17c Inherited #sort: shows a debugger.
Stefan Vogel <sv@exept.de>
parents: 5604
diff changeset
   674
    sortBlock ~~ aSortBlock ifTrue:[
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   675
	self sortBlock:aSortBlock.
5668
0cbaa16dc17c Inherited #sort: shows a debugger.
Stefan Vogel <sv@exept.de>
parents: 5604
diff changeset
   676
    ].
0cbaa16dc17c Inherited #sort: shows a debugger.
Stefan Vogel <sv@exept.de>
parents: 5604
diff changeset
   677
0cbaa16dc17c Inherited #sort: shows a debugger.
Stefan Vogel <sv@exept.de>
parents: 5604
diff changeset
   678
!
0cbaa16dc17c Inherited #sort: shows a debugger.
Stefan Vogel <sv@exept.de>
parents: 5604
diff changeset
   679
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   680
sortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   681
    "return the block used for sorting"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   682
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   683
    ^ sortBlock
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
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   686
sortBlock:aSortBlock
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   687
    "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
   688
    the collection, and return the receiver. The argument, aSortBlock must
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   689
    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
   690
    its arg2 in the collection."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   691
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   692
    sortBlock := aSortBlock.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   693
    lastIndex > firstIndex ifTrue:[
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   694
	contentsArray quickSortFrom:firstIndex to:lastIndex sortBlock:aSortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   695
    ]
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   696
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
     #(9 8 7 6 5 4 3) asSortedCollection
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   699
     #(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
   700
     #(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
   701
     #($f $G $z $Y $o $H) asSortedCollection
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   702
     #($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
   703
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   704
! !
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   705
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   706
!SortedCollection methodsFor:'private'!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   707
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   708
indexForInserting:anObject
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   709
    "search the index at which to insert anObject.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   710
     Can also be used to search for an existing element
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   711
     by checking if the element at the returned index is the one we look for.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   712
     Uses a binarySearch since we can depend on the elements being in sorted order.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   713
     The returned index is a physical one, for accessing contentsArray."
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   714
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   715
    |low    "{ Class: SmallInteger}"
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   716
     high   "{ Class: SmallInteger}"
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   717
     middle "{ Class: SmallInteger}"
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   718
     element|
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   719
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   720
    "
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   721
     we can of course use a binary search - since the elements are sorted
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   722
    "
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   723
    low := firstIndex.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   724
    high := lastIndex.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   725
    [low > high] whileFalse:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   726
        middle := (low + high) // 2.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   727
        element := contentsArray basicAt:middle.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   728
        (sortBlock value:element value:anObject) ifTrue:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   729
            "middleelement is smaller than object"
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   730
            low := middle + 1
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   731
        ] ifFalse:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   732
            high := middle - 1
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   733
        ]
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   734
    ].
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   735
    ^ low
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   736
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   737
    "
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   738
     #(1 2 3 4 7 99 1313 981989 898989898) asSortedCollection indexForInserting:50
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   739
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   740
     #(1.0 2.0 3 4 7 49.0 51.0 99 1313 981989 898989898) asSortedCollection indexForInserting:50
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   741
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   742
    "
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   743
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   744
    "Modified: 12.4.1996 / 13:22:03 / cg"
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   745
!
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   746
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   747
setSortBlock: aSortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   748
    "set the sortblock without resorting - private only"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   749
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   750
    sortBlock := aSortBlock
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
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   753
!SortedCollection methodsFor:'queries'!
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   754
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   755
isSorted
5359
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   756
    "return true. if my elements are sorted"
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   757
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   758
    ^ true
5359
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   759
!
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   760
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   761
isSortedBy:aBlock
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   762
    "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
   763
5359
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   764
    aBlock == sortBlock ifTrue:[^ true].
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   765
    ^ super isSortedBy:aBlock
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   766
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   767
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   768
!
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   769
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   770
isSortedCollection
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   771
    "return true. if I am a sorted collection"
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   772
396b77b6f1d2 added #isSortedCollection, #isSortedBy:
Claus Gittinger <cg@exept.de>
parents: 5048
diff changeset
   773
    ^ true
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   774
!
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   775
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   776
speciesForCollecting
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   777
    "Redefined to return an OrderedCollection;
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   778
     see X3J20 spec. (SortedCollection>>collect: should return an OrderedCollection)"
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   779
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   780
    ^ OrderedCollection
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   781
! !
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   782
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   783
!SortedCollection methodsFor:'searching'!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   784
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   785
after:anObject ifAbsent:exceptionBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   786
    "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
   787
     If anObject is contained multiple times in the collection, return the
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   788
     the first element which is non-equal to anObject.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   789
     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
   790
     exceptionBlock."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   791
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   792
    |index      "{ Class: SmallInteger }"
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   793
     last       "{ Class: SmallInteger }"|
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   794
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   795
    index := self indexOf:anObject.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   796
    index == 0 ifTrue:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   797
        ^ exceptionBlock value.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   798
    ].
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   799
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   800
    "skip multiple occurrences of the same ..."
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   801
    index := index + firstIndex - 1.
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   802
    last := lastIndex.
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   803
    [(index <= last) and:[(contentsArray basicAt:index) = anObject]] whileTrue:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   804
        index := index + 1
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   805
    ].
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   806
    (index > last) ifTrue:[^ exceptionBlock value].
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   807
    ^ contentsArray basicAt:index
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   808
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   809
    "
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   810
     #(7 3 9 10 99) asSortedCollection after:50
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   811
     #(7 3 9 10 99) asSortedCollection after:3
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   812
     #(7 3 9 10 99) asSortedCollection after:1
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   813
     #(7 3 9 10 99) asSortedCollection after:10
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   814
     #(7 3 9 10 99) asSortedCollection after:7
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   815
     #(7 3 9 10 99) asSortedCollection after:99
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   816
     #(7 10 3 10 9 10 10 99) asSortedCollection after:9
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   817
     #(7 10 3 10 9 10 10 99) asSortedCollection after:10
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   818
    "
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   819
!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   820
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   821
before:anObject ifAbsent:exceptionBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   822
    "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
   823
     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
   824
     exceptionBlock."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   825
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   826
    |index      "{ Class: SmallInteger }"|
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   827
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   828
    index := self indexOf:anObject.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   829
    index <= 1 ifTrue:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   830
        ^ exceptionBlock value.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   831
    ].
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   832
    ^ contentsArray basicAt:firstIndex + index - 2
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   833
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   834
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   835
     #(7 3 9 10 99) asSortedCollection before:50
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   836
     #(7 3 9 10 99) asSortedCollection before:3
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   837
     #(7 3 9 10 99) asSortedCollection before:1
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   838
     #(7 3 9 10 99) asSortedCollection before:10
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   839
     #(7 3 9 10 99) asSortedCollection before:7
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   840
     #(7 3 9 10 99) asSortedCollection before:99
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   841
     #(7 10 3 10 9 10 10 99) asSortedCollection before:9
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   842
     #(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
   843
    "
4596
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   844
!
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   845
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   846
indexOf:anObject
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   847
    "return true, if the argument, anObject is in the collection.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   848
     Redefined, since due to being sorted, the inclusion check can
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   849
     be done with log-n compares i.e. much faster."
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   850
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   851
    |index "{ Class: SmallInteger }"
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   852
     initialIndex "{ Class: SmallInteger }"
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   853
     element|
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   854
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   855
    "/ if I am small, the inherited linear search is faster ...
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   856
    (lastIndex - firstIndex) < 20 ifTrue:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   857
        firstIndex > lastIndex ifTrue:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   858
            "/ empty
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   859
            ^ 0
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   860
        ].
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   861
        ^ super indexOf:anObject.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   862
    ].
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   863
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   864
    initialIndex := self indexForInserting:anObject.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   865
    initialIndex > lastIndex ifTrue:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   866
        initialIndex := lastIndex
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   867
    ] ifFalse:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   868
        initialIndex < firstIndex ifTrue:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   869
            initialIndex := firstIndex
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   870
        ]
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   871
    ].
14310
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   872
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   873
    "the complex case: the collection may include elements, which are odered only by
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   874
     a single component (e.g. Associations by key). So we have to test all
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   875
     previous and next elements having the same component"
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   876
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   877
    "for previous elements: while element is not smaller and not larger than anObject ... compare"
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   878
    index := initialIndex.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   879
    [index >= firstIndex 
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   880
     and:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   881
        element := contentsArray basicAt:index. 
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   882
        ((sortBlock value:element value:anObject) or:[sortBlock value:anObject value:element]) not]
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   883
    ] whileTrue:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   884
        element = anObject ifTrue:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   885
            ^ index - firstIndex + 1.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   886
        ].
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   887
        index := index - 1.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   888
    ].
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   889
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   890
    "for next elements: while element is not smaller and not larger than anObject ... compare"
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   891
    index := initialIndex.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   892
    [index <= lastIndex 
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   893
     and:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   894
        element := contentsArray basicAt:index. 
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   895
        ((sortBlock value:element value:anObject) or:[sortBlock value:anObject value:element]) not]
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   896
    ] whileTrue:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   897
        element = anObject ifTrue:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   898
            ^ index - firstIndex + 1.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   899
        ].
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   900
        index := index + 1.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   901
    ].
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   902
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   903
    ^ 0.
14310
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   904
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   905
    "
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   906
     #(7 3 9 10 99) asSortedCollection indexOf:50
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   907
     #(7 3 9 10 99) asSortedCollection indexOf:10
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   908
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   909
     #('aa' 'bb' 'cc' 'dd') asSortedCollection indexOf:'bb'
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   910
     #('aa' 'bb' 'cc' 'dd' 'aa' 'bb' 'cc' 'dd') asSortedCollection indexOf:'bb'
14310
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   911
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   912
     |allSyms indices|
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   913
     allSyms := Symbol allInstances asSortedCollection.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   914
     Time millisecondsToRun:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   915
         indices := allSyms collect:[:el | allSyms indexOf:el].
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   916
     ].
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   917
     indices = (1 to:allSyms size)
14310
b1787ec39fd8 changed: #mergeSorted:
Stefan Vogel <sv@exept.de>
parents: 14309
diff changeset
   918
    "
4596
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   919
!
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   920
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   921
indexOf:anElement ifAbsent:exceptionBlock
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   922
    "Return the index of anElement within the receiver.
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
   923
     If the receiver does not contain anElement,
4596
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   924
     return the result of evaluating the argument, exceptionBlock."
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   925
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   926
    |idx|
4596
66a082fbc5b3 tuned indexOf
Claus Gittinger <cg@exept.de>
parents: 3340
diff changeset
   927
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   928
    idx := self indexOf:anElement.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   929
    idx == 0 ifTrue:[^ exceptionBlock value].
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
   930
    ^ idx.
16002
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   931
!
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   932
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   933
largest:n
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   934
    "return a collection containing the n largest elements, largest last.
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   935
     Raises an exception, if the receiver does not contain at least n elements"
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   936
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   937
    |mySize|
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   938
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   939
    mySize := self size.
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   940
    n > mySize ifTrue:[
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   941
        self notEnoughElementsError
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   942
    ].
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   943
    sortBlock == DefaultSortBlock ifTrue:[
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   944
        ^ self copyFrom:(mySize-n+1)
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   945
    ].
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   946
    "/ do not trust the sortblock to sort small-to-large
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   947
    ^ super largest:n
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   948
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   949
    "
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   950
     #(10 35 20 45 30 5) asSortedCollection largest:3  
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   951
     (#(10 35 20 45 30 5) asSortedCollection:[:a :b | a > b]) largest:3    
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   952
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   953
     #(10 35 20 45 30 5) asSortedCollection largest:6  
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   954
     #(10 35 20 45 30 5) asSortedCollection largest:7  
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   955
    "
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   956
!
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   957
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   958
max
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   959
    "Return the largest element."
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   960
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   961
    sortBlock == DefaultSortBlock ifTrue:[
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   962
        ^ self last
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   963
    ].
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   964
    ^ super max
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   965
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   966
    "
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   967
     #(10 35 20 45 30 5) asSortedCollection max 
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   968
    "
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   969
!
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   970
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   971
min
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   972
    "Return the smallest element."
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   973
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   974
    sortBlock == DefaultSortBlock ifTrue:[
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   975
        ^ self first
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   976
    ].
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   977
    ^ super min
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   978
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   979
    "
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   980
     #(10 35 20 45 30 5) asSortedCollection min
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   981
    "
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   982
!
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   983
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   984
smallest:n
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   985
    "return a collection containing the n smallest elements, largest last.
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   986
     Raises an exception, if the receiver does not contain at least n elements"
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   987
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   988
    |mySize|
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   989
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   990
    mySize := self size.
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   991
    n > mySize ifTrue:[
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   992
        self notEnoughElementsError
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   993
    ].
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   994
    sortBlock == DefaultSortBlock ifTrue:[
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   995
        ^ self copyTo:n
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   996
    ].
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   997
    "/ do not trust the sortblock to sort small-to-large
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   998
    ^ super smallest:n
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
   999
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
  1000
    "
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
  1001
     #(10 35 20 45 30 5) asSortedCollection smallest:3  
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
  1002
     (#(10 35 20 45 30 5) asSortedCollection:[:a :b | a > b]) smallest:3    
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
  1003
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
  1004
     #(10 35 20 45 30 5) asSortedCollection smallest:6  
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
  1005
     #(10 35 20 45 30 5) asSortedCollection smallest:7  
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
  1006
    "
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
  1007
! !
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
  1008
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
  1009
!SortedCollection methodsFor:'statistical functions'!
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
  1010
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
  1011
median
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
  1012
    "Return the middle element, or as close as we can get."
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
  1013
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1014
    ^ self basicAt:(self size + 1 // 2)
16002
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
  1015
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
  1016
    "
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
  1017
     #(10 35 20 45 30 5) asSortedCollection median
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
  1018
     #(10 35 20 45 30 5) median
5fd1486ee60a class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 16000
diff changeset
  1019
    "
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1020
! !
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1021
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1022
!SortedCollection methodsFor:'testing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1023
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1024
includes:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1025
    "return true, if the argument, anObject is in the collection.
62
e1b4369c61fb *** empty log message ***
claus
parents: 44
diff changeset
  1026
     Redefined, since due to being sorted, the inclusion check can
2
claus
parents: 1
diff changeset
  1027
     be done with log-n compares i.e. much faster."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1028
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1029
    |index "{ Class: SmallInteger }"
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1030
     initialIndex "{ Class: SmallInteger }"
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1031
     element|
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1032
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1033
    "/ if I am small, the inherited linear search is faster ...
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1034
    (lastIndex - firstIndex) < 20 ifTrue:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1035
        firstIndex > lastIndex ifTrue:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1036
            "/ empty
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1037
            ^ false
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1038
        ].
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1039
        ^ super includes:anObject.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1040
    ].
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1041
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1042
    initialIndex := self indexForInserting:anObject.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1043
    ((initialIndex < firstIndex) or:[initialIndex > lastIndex]) ifTrue:[^ false].
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1044
    (contentsArray basicAt:initialIndex) = anObject ifTrue:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1045
        "the simple case - plain objects"
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1046
        ^ true.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1047
    ].
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1048
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1049
    "the complex case: the collection may include elements, which are odered only by
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1050
     a single component (e.g. Associations by key). So we have to test all
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1051
     previous and next elements having the same component"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1052
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1053
    "for previous elements: while element is not smaller and not larger than anObject ... compare"
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1054
    index := initialIndex - 1.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1055
    [index >= firstIndex 
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1056
     and:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1057
        element := contentsArray basicAt:index. 
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1058
        ((sortBlock value:element value:anObject) or:[sortBlock value:anObject value:element]) not]
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1059
    ] whileTrue:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1060
        element = anObject ifTrue:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1061
            ^ true.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1062
        ].
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1063
        index := index - 1.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1064
    ].
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1065
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1066
    "for next elements: while element is not smaller and not larger than anObject ... compare"
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1067
    index := initialIndex + 1.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1068
    [index <= lastIndex 
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1069
     and:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1070
        element := contentsArray basicAt:index. 
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1071
        ((sortBlock value:element value:anObject) or:[sortBlock value:anObject value:element]) not]
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1072
    ] whileTrue:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1073
        element = anObject ifTrue:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1074
            ^ true.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1075
        ].
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1076
        index := index + 1.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1077
    ].
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1078
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1079
    ^ false.
2
claus
parents: 1
diff changeset
  1080
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
  1081
    "
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
  1082
     #(7 3 9 10 99) asSortedCollection includes:50
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
  1083
     #(7 3 9 10 99) asSortedCollection includes:10
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
  1084
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1085
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1086
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1087
occurrencesOf:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1088
    "return how many times the argument, anObject is in the collection.
62
e1b4369c61fb *** empty log message ***
claus
parents: 44
diff changeset
  1089
     Redefined, since due to being sorted, the range of checked objects
5048
b1e10ce753fd comment
Claus Gittinger <cg@exept.de>
parents: 5030
diff changeset
  1090
     can be limited i.e. it can be done much faster.
b1e10ce753fd comment
Claus Gittinger <cg@exept.de>
parents: 5030
diff changeset
  1091
      Uses #= (i.e. equality) compare."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1092
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1093
    |index      "{ Class: SmallInteger }"
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
  1094
     tally      "{ Class: SmallInteger }"
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
  1095
     last       "{ Class: SmallInteger }" |
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1096
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1097
    index := self indexOf:anObject.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1098
    index == 0 ifTrue:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1099
        ^ 0
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1100
    ].
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1101
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1102
    index := index + firstIndex - 1.
8874
f1fdda306d51 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8183
diff changeset
  1103
    last := lastIndex.
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
  1104
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
  1105
    "/ there may be multiple of them; count 'em
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
  1106
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1107
    tally := 0.
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1108
    [(index <= last) and:[(contentsArray basicAt:index) = anObject]] whileTrue:[
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1109
        tally := tally + 1.
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1110
        index := index + 1
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1111
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1112
    ^ tally
2
claus
parents: 1
diff changeset
  1113
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
  1114
    "
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
  1115
     #(7 3 9 10 99) asSortedCollection occurrencesOf:50
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
  1116
     #(7 3 9 10 99) asSortedCollection occurrencesOf:10
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1117
     #(7 10 3 10 9 10 10 10 10 10 10 10 10 99) asSortedCollection occurrencesOf:10
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
  1118
    "
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
  1119
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
  1120
    "Modified: 12.4.1996 / 18:48:40 / cg"
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
  1121
! !
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
  1122
629
2ceefe9b5a19 version at the end
Claus Gittinger <cg@exept.de>
parents: 607
diff changeset
  1123
!SortedCollection class methodsFor:'documentation'!
2ceefe9b5a19 version at the end
Claus Gittinger <cg@exept.de>
parents: 607
diff changeset
  1124
2ceefe9b5a19 version at the end
Claus Gittinger <cg@exept.de>
parents: 607
diff changeset
  1125
version
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1126
    ^ '$Header$'
14309
602e61cb64a3 Remove now unused helper method
Stefan Vogel <sv@exept.de>
parents: 14308
diff changeset
  1127
!
602e61cb64a3 Remove now unused helper method
Stefan Vogel <sv@exept.de>
parents: 14308
diff changeset
  1128
602e61cb64a3 Remove now unused helper method
Stefan Vogel <sv@exept.de>
parents: 14308
diff changeset
  1129
version_CVS
18508
cd84f2138c53 class: SortedCollection
Stefan Vogel <sv@exept.de>
parents: 16002
diff changeset
  1130
    ^ '$Header$'
629
2ceefe9b5a19 version at the end
Claus Gittinger <cg@exept.de>
parents: 607
diff changeset
  1131
! !
7300
461bb09c5954 category
Claus Gittinger <cg@exept.de>
parents: 6737
diff changeset
  1132
16000
74d0c38d1834 class: SortedCollection
Claus Gittinger <cg@exept.de>
parents: 14310
diff changeset
  1133
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1134
SortedCollection initialize!