SortedCollection.st
author Claus Gittinger <cg@exept.de>
Fri, 19 Apr 1996 12:47:25 +0200
changeset 1221 46d72af387e9
parent 1175 7ca26065cf02
child 1290 15ba3221b89b
permissions -rw-r--r--
commentary
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1993 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
     3
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
OrderedCollection subclass:#SortedCollection
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
    14
	instanceVariableNames:'sortBlock'
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
    15
	classVariableNames:'DefaultSortBlock'
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
    16
	poolDictionaries:''
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
    17
	category:'Collections-Sequenceable'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    20
!SortedCollection class methodsFor:'documentation'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    22
copyright
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    23
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    24
 COPYRIGHT (c) 1993 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    25
	      All Rights Reserved
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    26
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    27
 This software is furnished under a license and may be used
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    28
 only in accordance with the terms of that license and with the
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    29
 inclusion of the above copyright notice.   This software may not
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    30
 be provided or otherwise made available to, or used by, any
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    31
 other person.  No title to or ownership of the software is
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    32
 hereby transferred.
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    33
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    34
!
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    35
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    36
documentation
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    37
"
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    38
    I keep my elements sorted. The sort order is defined by a sortblock,
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    39
    a two-argument block which, when given two elements of the collection, 
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    40
    should return true if the element given as first arg has to come before the 
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    41
    element given as second arg.
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    42
1156
7ce47f220573 commentary
Claus Gittinger <cg@exept.de>
parents: 1155
diff changeset
    43
    Equal elements may occur multiple times.
7ce47f220573 commentary
Claus Gittinger <cg@exept.de>
parents: 1155
diff changeset
    44
7ce47f220573 commentary
Claus Gittinger <cg@exept.de>
parents: 1155
diff changeset
    45
    SortedCollection uses quickSort to resort and a binary search when adding/removing
7ce47f220573 commentary
Claus Gittinger <cg@exept.de>
parents: 1155
diff changeset
    46
    elements. 
7ce47f220573 commentary
Claus Gittinger <cg@exept.de>
parents: 1155
diff changeset
    47
    Because insertion/removal may require that remaining elements have to
7ce47f220573 commentary
Claus Gittinger <cg@exept.de>
parents: 1155
diff changeset
    48
    be shifted within the container, adding many individual elements may be done faster
7ce47f220573 commentary
Claus Gittinger <cg@exept.de>
parents: 1155
diff changeset
    49
    by creating a completely new collection from the unsorted elements.
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    50
    (see examples)
1156
7ce47f220573 commentary
Claus Gittinger <cg@exept.de>
parents: 1155
diff changeset
    51
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    52
    Thus a sortBlock of [:a :b | a < b] defines ascending sort-order,
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    53
    while [:a :b | a > b] defines descening order.
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    54
    The default sortBlock for SortedCollections is the first one.
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
    55
"
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    56
!
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    57
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    58
examples
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    59
"
1175
7ca26065cf02 commentary
Claus Gittinger <cg@exept.de>
parents: 1173
diff changeset
    60
    when many elements are to be added, it may be better to add them 
7ca26065cf02 commentary
Claus Gittinger <cg@exept.de>
parents: 1173
diff changeset
    61
    all en-bloeque instead of individually.
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    62
    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
    63
    shifted, to create an empty slot for the new element.
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    64
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    65
    timing example:
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    66
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    67
        |o rnd|
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    68
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    69
        o := SortedCollection new.
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    70
        rnd := Random new.
1175
7ca26065cf02 commentary
Claus Gittinger <cg@exept.de>
parents: 1173
diff changeset
    71
        10000 timesRepeat:[
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    72
            o add:rnd next.
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
    73
        ]  
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    74
1175
7ca26065cf02 commentary
Claus Gittinger <cg@exept.de>
parents: 1173
diff changeset
    75
    takes 1365 ms on a P5 (admitted: this is a fast machine ;-)
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    76
    In contrast:
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    77
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    78
        |o rnd|
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    79
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    80
        o := OrderedCollection new.
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    81
        rnd := Random new.
1175
7ca26065cf02 commentary
Claus Gittinger <cg@exept.de>
parents: 1173
diff changeset
    82
        10000 timesRepeat:[
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    83
            o add:rnd next.
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    84
        ].
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    85
        o := o asSortedCollection
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
    86
1175
7ca26065cf02 commentary
Claus Gittinger <cg@exept.de>
parents: 1173
diff changeset
    87
    takes 383 ms on the same machine.
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
    88
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
    89
    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
    90
    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
    91
    the number of added items is more than some threshold number.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
    92
    Building some big collection:
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
    93
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
    94
        |o rnd c|
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
    95
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
    96
        o := OrderedCollection new.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
    97
        rnd := Random new.
1175
7ca26065cf02 commentary
Claus Gittinger <cg@exept.de>
parents: 1173
diff changeset
    98
        10000 timesRepeat:[
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
    99
            o add:rnd next.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   100
        ].
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   101
        o := o asSortedCollection.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   102
1175
7ca26065cf02 commentary
Claus Gittinger <cg@exept.de>
parents: 1173
diff changeset
   103
    adding 1000 elements individually to it:
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   104
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   105
        1000 timesRepeat:[
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   106
            o add:rnd next.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   107
        ].
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   108
1175
7ca26065cf02 commentary
Claus Gittinger <cg@exept.de>
parents: 1173
diff changeset
   109
    takes 258 ms 
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   110
    (because the elements have to be shifted around for each added element);
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   111
1175
7ca26065cf02 commentary
Claus Gittinger <cg@exept.de>
parents: 1173
diff changeset
   112
    while adding them en-bloque with:
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   113
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   114
        c := OrderedCollection new.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   115
        1000 timesRepeat:[
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   116
            c add:rnd next.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   117
        ].
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   118
        o addAll:o
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   119
1175
7ca26065cf02 commentary
Claus Gittinger <cg@exept.de>
parents: 1173
diff changeset
   120
    takes 71 ms
1167
a24366edb65e commentary
Claus Gittinger <cg@exept.de>
parents: 1162
diff changeset
   121
"
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   122
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   123
a27a279701f8 Initial revision
claus
parents:
diff changeset
   124
!SortedCollection class methodsFor:'initialization'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   125
a27a279701f8 Initial revision
claus
parents:
diff changeset
   126
initialize
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   127
    "setup the default sortBlock."
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   128
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   129
    "/ only do this once at early startup
913
7d9881f9c908 only initialize once
Claus Gittinger <cg@exept.de>
parents: 629
diff changeset
   130
    DefaultSortBlock isNil ifTrue:[
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   131
        DefaultSortBlock := [:a :b | a < b ]
913
7d9881f9c908 only initialize once
Claus Gittinger <cg@exept.de>
parents: 629
diff changeset
   132
    ]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   133
913
7d9881f9c908 only initialize once
Claus Gittinger <cg@exept.de>
parents: 629
diff changeset
   134
    "
7d9881f9c908 only initialize once
Claus Gittinger <cg@exept.de>
parents: 629
diff changeset
   135
     SortedCollection initialize
7d9881f9c908 only initialize once
Claus Gittinger <cg@exept.de>
parents: 629
diff changeset
   136
    "
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   137
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   138
    "Modified: 12.4.1996 / 12:29:27 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   139
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   140
a27a279701f8 Initial revision
claus
parents:
diff changeset
   141
!SortedCollection class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   142
a27a279701f8 Initial revision
claus
parents:
diff changeset
   143
new
2
claus
parents: 1
diff changeset
   144
    "return a new sortedCollection, the sorting is done using
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   145
     a compare for a < b, in ascending order"
2
claus
parents: 1
diff changeset
   146
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   147
    ^ super new setSortBlock:DefaultSortBlock
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   148
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   149
    "Modified: 12.4.1996 / 12:28:18 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   150
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   151
a27a279701f8 Initial revision
claus
parents:
diff changeset
   152
new:size
2
claus
parents: 1
diff changeset
   153
    "return a new sortedCollection with preallocated size.
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   154
     The sorting is done using a compare for a < b, in ascending order"
2
claus
parents: 1
diff changeset
   155
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   156
    ^ (super new:size) setSortBlock:DefaultSortBlock
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   157
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   158
    "Modified: 12.4.1996 / 12:28:22 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   159
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   160
a27a279701f8 Initial revision
claus
parents:
diff changeset
   161
sortBlock:aBlock
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   162
    "return a new sortedCollection, whe the sort order is defined
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   163
     by aBlock. 
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   164
     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
   165
     its arg2 in the collection."
2
claus
parents: 1
diff changeset
   166
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   167
    ^ super new setSortBlock:aBlock
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   168
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   169
    "default:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   170
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   171
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   172
     s := SortedCollection new.
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   173
     s add:15; add:99; add:3; add:-29; add:17; add:-6.
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   174
     Transcript showCr:s
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   175
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   176
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   177
    "sorting by absolute values:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   178
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   179
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   180
     s := SortedCollection sortBlock:[:a :b | a abs < b abs].
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   181
     s add:15; add:99; add:3; add:29; add:17; add:-6.
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   182
     Transcript showCr:s
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   183
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   184
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   185
    "default again:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   186
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   187
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   188
     s := SortedCollection new.
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   189
     s add:'foo'; add:'Bar'; add:'baz'; add:'hello'; add:'world'; add:'Wow'.
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   190
     Transcript showCr:s
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   191
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   192
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   193
    "sorting strings caseless:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   194
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   195
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   196
     s := SortedCollection sortBlock:[:a :b | a asLowercase < b asLowercase].
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   197
     s add:'foo'; add:'Bar'; add:'baz'; add:'hello'; add:'world'; add:'Wow'.
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   198
     Transcript showCr:s
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   199
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   200
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   201
    "Modified: 12.4.1996 / 12:26:28 / cg"
329
claus
parents: 216
diff changeset
   202
!
claus
parents: 216
diff changeset
   203
claus
parents: 216
diff changeset
   204
withAll:aCollection sortBlock:aBlock
claus
parents: 216
diff changeset
   205
    "initialize from aCollection and set the sort-block"
claus
parents: 216
diff changeset
   206
claus
parents: 216
diff changeset
   207
    ^ (self sortBlock:aBlock) addAll:aCollection
claus
parents: 216
diff changeset
   208
claus
parents: 216
diff changeset
   209
    "
claus
parents: 216
diff changeset
   210
     SortedCollection withAll:#(1 2 3 4 5 6 7 8 9 0)
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   211
                      sortBlock:[:a :b | a > b] 
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   212
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   213
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   214
    "default:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   215
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   216
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   217
     s := SortedCollection withAll:#(15 99 3 29 17 -6).
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   218
     Transcript showCr:s
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   219
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   220
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   221
    "sorting by absolute values:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   222
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   223
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   224
     s := SortedCollection withAll:#(15 99 3 29 17 -6) sortBlock:[:a :b | a abs < b abs].
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   225
     Transcript showCr:s
329
claus
parents: 216
diff changeset
   226
    "
1155
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   227
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   228
    "default again:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   229
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   230
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   231
     s := SortedCollection withAll:#('foo' 'Bar' 'baz' 'hello' 'world' 'Wow').
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   232
     Transcript showCr:s
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   233
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   234
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   235
    "sorting strings caseless:
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   236
     |s|
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   237
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   238
     s := SortedCollection withAll:#('foo' 'Bar' 'baz' 'hello' 'world' 'Wow') sortBlock:[:a :b | a asLowercase < b asLowercase].
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   239
     Transcript showCr:s
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   240
    "
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   241
4f5fe0bdfe54 commentary
Claus Gittinger <cg@exept.de>
parents: 913
diff changeset
   242
    "Modified: 12.4.1996 / 12:28:09 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   243
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   244
a27a279701f8 Initial revision
claus
parents:
diff changeset
   245
!SortedCollection methodsFor:'adding & removing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   246
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   247
add:anObject
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   248
    "add the argument, anObject at the proper place in the
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   249
     receiver. Returns the argument, anObject."
2
claus
parents: 1
diff changeset
   250
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   251
    |index|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   252
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   253
    lastIndex < firstIndex "i.e. self size == 0" ifTrue:[
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   254
        super add:anObject
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   255
    ] ifFalse:[
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   256
        index := self indexForInserting:anObject. 
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   257
        index := self makeRoomAtIndex:index.
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   258
        contentsArray at:index put:anObject
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   259
    ].
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   260
    ^ anObject
2
claus
parents: 1
diff changeset
   261
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   262
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   263
     |c| #(7 3 9 10 99) asSortedCollection add:5; yourself    
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   264
     #(7 3 9 10 99) asSortedCollection add:1; yourself        
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   265
     #(7 3 9 10 99) asSortedCollection add:1000; yourself     
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   266
    "
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   267
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   268
    "Modified: 12.4.1996 / 16:47:41 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   269
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   270
a27a279701f8 Initial revision
claus
parents:
diff changeset
   271
add:newObject after:oldObject
2
claus
parents: 1
diff changeset
   272
    "catch this - its not allowed for sortedCollections"
claus
parents: 1
diff changeset
   273
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   274
    self shouldNotImplement
a27a279701f8 Initial revision
claus
parents:
diff changeset
   275
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   276
a27a279701f8 Initial revision
claus
parents:
diff changeset
   277
add:newObject before:oldObject
2
claus
parents: 1
diff changeset
   278
    "catch this - its not allowed for sortedCollections"
claus
parents: 1
diff changeset
   279
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   280
    self shouldNotImplement
a27a279701f8 Initial revision
claus
parents:
diff changeset
   281
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   282
a27a279701f8 Initial revision
claus
parents:
diff changeset
   283
addAll:aCollection
a27a279701f8 Initial revision
claus
parents:
diff changeset
   284
    "add all elements of the argument, aCollection to the
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   285
     receiver. Returns the argument, aCollection."
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   286
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   287
    |newContents|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   288
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   289
    "/ special case: I am empty - add them en-bloque.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   290
    "/ (but only if the argument is not a sortedCollection,
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   291
    "/  because quicksort degenerates to a veeery slow operation then)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   292
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   293
    (self size == 0 and:[aCollection isSorted not]) ifTrue:[
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   294
        newContents := Array withAll:(aCollection asArray).
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   295
        newContents == aCollection ifTrue:[
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   296
            newContents := newContents shallowCopy
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   297
        ].
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   298
        newContents sort:sortBlock.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   299
        contentsArray := newContents.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   300
        firstIndex := 1.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   301
        lastIndex := newContents size.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   302
        ^ aCollection
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   303
    ].
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   304
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   305
    "/
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   306
    "/ do a mergeSort
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   307
    "/
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   308
    self mergeSorted:(aCollection asSortedCollection).
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   309
    ^ aCollection
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   310
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   311
    "
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   312
     #(7 3 9 10 99) asSortedCollection addAll:#(77 0 1 16 5); yourself 
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   313
    "
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   314
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   315
    "Modified: 13.4.1996 / 12:42:15 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   316
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   317
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   318
addFirst:anObject
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   319
    "catch this - its not allowed for sortedCollections"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   320
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   321
    self shouldNotImplement
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   322
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   323
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   324
addLast:anObject
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   325
    "catch this - its not allowed for sortedCollections"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   326
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   327
    self shouldNotImplement
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   328
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   329
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   330
at:index put:anObject
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   331
    "catch this - its not allowed for sortedCollections"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   332
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   333
    self shouldNotImplement
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   334
!
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   335
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   336
mergeSorted:aSortedCollection
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   337
    "add all elements of the argument, aSortedCollection to the
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   338
     receiver. 
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   339
     This leads to an error, if the argument is not a sortedCollection.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   340
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   341
     This should be used when a number of elements is to be added. 
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   342
     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
   343
     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
   344
     Therefore, adding chunks is better done by sorting the chunk and merging
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   345
     it in, instead of resorting the receiver."
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   346
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   347
    |newContentsArray 
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   348
     contentsArray2
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   349
     destIndex "{ Class: SmallInteger }"
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   350
     n1        "{ Class: SmallInteger }"
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   351
     n2        "{ Class: SmallInteger }"
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   352
     srcIndex1 "{ Class: SmallInteger }"
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   353
     srcIndex2 "{ Class: SmallInteger }"
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   354
     last1     "{ Class: SmallInteger }"
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   355
     last2     "{ Class: SmallInteger }"  
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   356
     end1Reached end2Reached
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   357
     el1 el2 |
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   358
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   359
    n1 := self size.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   360
    n2 := aSortedCollection size.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   361
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   362
    newContentsArray := Array new:(n1 + n2).
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   363
    destIndex := 1.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   364
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   365
    contentsArray2 := aSortedCollection contentsArray.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   366
    srcIndex2 := aSortedCollection firstIndex.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   367
    last2 := srcIndex2 + n2 -1.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   368
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   369
    srcIndex1 := firstIndex.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   370
    last1 := srcIndex1 + n1 -1.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   371
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   372
    (srcIndex1 <= last1 and:[srcIndex2 <= last2]) ifTrue:[
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   373
        el1 := contentsArray at:srcIndex1.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   374
        el2 := contentsArray2 at:srcIndex2.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   375
        end1Reached := end2Reached := false.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   376
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   377
        [end1Reached or:[end2Reached]] whileFalse:[
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   378
            (sortBlock value:el1 value:el2) ifTrue:[
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   379
                "/ el1 to come before el2
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   380
                newContentsArray at:destIndex put:el1. destIndex := destIndex + 1.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   381
                srcIndex1 := srcIndex1 + 1.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   382
                srcIndex1 <= last1 ifTrue:[
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   383
                    el1 := contentsArray at:srcIndex1.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   384
                ] ifFalse:[
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   385
                    end1Reached := true
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   386
                ]
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   387
            ] ifFalse:[
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   388
                "/ el2 to come before el1
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   389
                newContentsArray at:destIndex put:el2. destIndex := destIndex + 1.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   390
                srcIndex2 := srcIndex2 + 1.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   391
                srcIndex2 <= last2 ifTrue:[
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   392
                    el2 := contentsArray2 at:srcIndex2.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   393
                ] ifFalse:[
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   394
                    end2Reached := true
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   395
                ]
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   396
            ]
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   397
        ]
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   398
    ].
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   399
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   400
    "/ 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
   401
    (srcIndex1 <= last1) ifTrue:[
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   402
        newContentsArray 
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   403
            replaceFrom:destIndex 
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   404
            with:contentsArray
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   405
            startingAt:srcIndex1
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   406
    ].
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   407
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   408
    "/ 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
   409
    (srcIndex2 <= last2) ifTrue:[
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   410
        newContentsArray 
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   411
            replaceFrom:destIndex 
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   412
            with:contentsArray2
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   413
            startingAt:srcIndex2
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
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   416
    firstIndex := 1.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   417
    lastIndex := n1 + n2.
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   418
    contentsArray := newContentsArray
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   419
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   420
    "
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   421
     #(7 3 9 10 99) asSortedCollection 
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   422
        mergeSorted:#(77 0 1 16 5) asSortedCollection 
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   423
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   424
     #(7 3 9 10 99) asSortedCollection 
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   425
        mergeSorted:#(77 0 3 1 98 99 16 5) asSortedCollection 
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   426
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   427
     #() asSortedCollection 
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   428
        mergeSorted:#(77 0 3 1 98 99 16 5) asSortedCollection 
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   429
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   430
     #(7 3 9 10 99) asSortedCollection 
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   431
        mergeSorted:#() asSortedCollection 
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   432
    "
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   433
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   434
    "Modified: 13.4.1996 / 12:48:34 / cg"
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   435
! !
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   436
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   437
!SortedCollection methodsFor:'converting'!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   438
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   439
asSortedCollection
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   440
    "return the receiver as a sorted collection"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   441
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   442
    "could be an instance of a subclass..."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   443
    self class == SortedCollection ifTrue:[
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   444
	^ self
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   445
    ].
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   446
    ^ super asSortedCollection
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   447
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   448
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   449
!SortedCollection methodsFor:'copying'!
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   450
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   451
copyEmpty:size
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   452
    "return a copy of the receiver with no elements, but
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   453
     the same size. This method has been be redefined to
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   454
     preserve the sortBlock."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   455
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   456
    ^ (self species new:size) sortBlock:sortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   457
!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   458
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   459
postCopyFrom:anOriginal
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   460
    "sent after a copy or when a new collection species has been created.
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   461
     The new collection should have the same sortBlock as the original."
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   462
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   463
    sortBlock := anOriginal sortBlock
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   464
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   465
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   466
     #(4 7 1 99 -1 17) asSortedCollection inspect
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   467
     #(4 7 1 99 -1 17) asSortedCollection copy inspect
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   468
     (#(4 7 1 99 -1 17) asSortedCollection sortBlock:[:a :b | a > b]) inspect
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   469
     (#(4 7 1 99 -1 17) asSortedCollection sortBlock:[:a :b | a > b]) copy inspect
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   470
     (#(4 7 1 99 -1 17) asSortedCollection select:[:e| e even]) inspect
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   471
    "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   472
! !
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   473
216
a8abff749575 *** empty log message ***
claus
parents: 202
diff changeset
   474
!SortedCollection methodsFor:'enumerating'!
184
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   475
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   476
collect:aBlock
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   477
    "evaluate the argument, aBlock for every element in the collection
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   478
     and return a collection of the results. Redefined to return an OrderedCollection;
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   479
     see X3J20 spec. (SortedCollection>>collect: should return an OrderedCollection)"
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   480
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   481
    |newCollection
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   482
     start  "{ Class:SmallInteger }"
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   483
     stop   "{ Class:SmallInteger }" |
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   484
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   485
    newCollection := OrderedCollection new:(self size).
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   486
    stop := lastIndex.
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   487
    start := firstIndex.
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   488
    start to:stop do:[:index |
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   489
	newCollection add:(aBlock value:(contentsArray at:index)).
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   490
    ].
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   491
    ^ newCollection
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   492
! !
d795f0b1934a collect: fixed
claus
parents: 159
diff changeset
   493
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   494
!SortedCollection methodsFor:'instance protocol'!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   495
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   496
sortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   497
    "return the block used for sorting"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   498
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   499
    ^ sortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   500
!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   501
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   502
sortBlock:aSortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   503
    "change the sort criteria for a sorted collection, resort the elements of 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   504
    the collection, and return the receiver. The argument, aSortBlock must
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   505
    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
   506
    its arg2 in the collection."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   507
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   508
    sortBlock := aSortBlock.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   509
    lastIndex > firstIndex ifTrue:[
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   510
	contentsArray quickSortFrom:firstIndex to:lastIndex sortBlock:aSortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   511
    ]
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   512
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   513
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   514
     #(9 8 7 6 5 4 3) asSortedCollection
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   515
     #(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
   516
     #(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
   517
     #($f $G $z $Y $o $H) asSortedCollection
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   518
     #($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
   519
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   520
! !
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   521
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   522
!SortedCollection methodsFor:'private'!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   523
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   524
indexForInserting:anObject
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   525
    "search the index at which to insert anObject. 
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   526
     Can also be used to search for an existing element
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   527
     by checking if the element at the returned index is the one we look for.
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   528
     Uses a binarySearch since we can depend on the elements being on sorted order.
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   529
     The returned index is a physical one, for accessing contentsArray."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   530
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   531
    |low    "{ Class: SmallInteger}"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   532
     high   "{ Class: SmallInteger}"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   533
     middle "{ Class: SmallInteger}"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   534
     element|
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   535
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   536
    "
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   537
     we can of course use a binary search - since the elements are sorted
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   538
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   539
    low := firstIndex.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   540
    high := lastIndex.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   541
    [low <= high] whileTrue:[
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   542
        middle := (low + high) // 2.
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   543
        element := contentsArray at:middle.
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   544
        (sortBlock value:element value:anObject) ifTrue:[
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   545
            "middleelement is smaller than object"
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   546
            low := middle + 1
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   547
        ] ifFalse:[
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   548
            high := middle - 1
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   549
        ]
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   550
    ].
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   551
    ^ low
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   552
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   553
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   554
     #(1 2 3 4 7 99 1313 981989 898989898) asSortedCollection indexForInserting:50      
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   555
     #(1.0 2.0 3 4 7 49.0 51.0 99 1313 981989 898989898) asSortedCollection indexForInserting:50 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   556
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   557
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   558
    "Modified: 12.4.1996 / 13:22:03 / cg"
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   559
!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   560
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   561
setSortBlock: aSortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   562
    "set the sortblock without resorting - private only"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   563
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   564
    sortBlock := aSortBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   565
! !
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   566
1173
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   567
!SortedCollection methodsFor:'queries'!
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   568
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   569
isSorted
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   570
    ^ true
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   571
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   572
    "Created: 13.4.1996 / 12:36:29 / cg"
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   573
! !
1d831f2c0d44 added #mergeSorted; changed #addAll: to make use of it
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
   574
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   575
!SortedCollection methodsFor:'searching'!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   576
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   577
after:anObject
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   578
    "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
   579
     If anObject is contained multiple times in the collection, return the
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   580
     the first element which is non-equal to anObject.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   581
     If the receiver does not contain anObject, report an error"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   582
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   583
    ^ self after:anObject ifAbsent:[self errorValueNotFound:anObject]
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   584
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   585
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   586
     #(7 3 9 10 99) asSortedCollection after:50
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   587
     #(7 3 9 10 99) asSortedCollection after:1 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   588
     #(7 3 9 10 99) asSortedCollection after:10
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   589
     #(7 3 9 10 99) asSortedCollection after:7 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   590
     #(7 3 9 10 99) asSortedCollection after:99 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   591
     #(7 10 3 10 9 10 10 99) asSortedCollection after:9  
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   592
     #(7 10 3 10 9 10 10 99) asSortedCollection after:10 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   593
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   594
!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   595
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   596
after:anObject ifAbsent:exceptionBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   597
    "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
   598
     If anObject is contained multiple times in the collection, return the
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   599
     the first element which is non-equal to anObject.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   600
     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
   601
     exceptionBlock."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   602
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   603
    |index      "{ Class: SmallInteger }"
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   604
     last       "{ Class: SmallInteger }"|
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   605
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   606
    index := self indexForInserting:anObject.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   607
    ((index < firstIndex) 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   608
     or:[(contentsArray at:index) ~= anObject]) ifTrue:[^ exceptionBlock value].
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   609
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   610
    "skip multiple occurences of the same ..."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   611
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   612
    last := lastIndex.
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   613
    [(index <= last) and:[(contentsArray at:index) = anObject]] whileTrue:[
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   614
        index := index + 1
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   615
    ].
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   616
    (index > last) ifTrue:[^ nil].
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   617
    ^ contentsArray at:index
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   618
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   619
    "Modified: 12.4.1996 / 13:20:33 / cg"
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   620
!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   621
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   622
before:anObject
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   623
    "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
   624
     If the receiver does not contain anObject, report an error"
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   625
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   626
    ^ self before:anObject ifAbsent:[self errorValueNotFound:anObject]
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   627
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   628
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   629
     #(7 3 9 10 99) asSortedCollection before:50
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   630
     #(7 3 9 10 99) asSortedCollection before:1 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   631
     #(7 3 9 10 99) asSortedCollection before:1000 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   632
     #(7 3 9 10 99) asSortedCollection before:10
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   633
     #(7 3 9 10 99) asSortedCollection before:7 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   634
     #(7 3 9 10 99) asSortedCollection before:99 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   635
     #(7 10 3 10 9 10 10 99) asSortedCollection before:9
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   636
     #(7 10 3 10 9 10 10 99) asSortedCollection before:10
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   637
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   638
!
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   639
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   640
before:anObject ifAbsent:exceptionBlock
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   641
    "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
   642
     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
   643
     exceptionBlock."
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   644
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   645
    |index      "{ Class: SmallInteger }"|
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   646
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   647
    index := self indexForInserting:anObject.
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   648
    ((index <= firstIndex) 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   649
     or:[(contentsArray at:index) ~= anObject]) ifTrue:[^ exceptionBlock value].
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   650
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   651
    ^ contentsArray at:index - 1
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   652
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   653
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   654
     #(7 3 9 10 99) asSortedCollection before:50
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   655
     #(7 3 9 10 99) asSortedCollection before:1 
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   656
     #(7 3 9 10 99) asSortedCollection before:10  
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   657
     #(7 3 9 10 99) asSortedCollection before:7   
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   658
     #(7 3 9 10 99) asSortedCollection before:99   
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   659
     #(7 10 3 10 9 10 10 99) asSortedCollection before:9  
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   660
     #(7 10 3 10 9 10 10 99) asSortedCollection before:10   
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   661
    "
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   662
! !
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   663
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   664
!SortedCollection methodsFor:'testing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   665
a27a279701f8 Initial revision
claus
parents:
diff changeset
   666
includes:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   667
    "return true, if the argument, anObject is in the collection.
62
e1b4369c61fb *** empty log message ***
claus
parents: 44
diff changeset
   668
     Redefined, since due to being sorted, the inclusion check can
2
claus
parents: 1
diff changeset
   669
     be done with log-n compares i.e. much faster."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   670
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   671
    |index "{ Class: SmallInteger }"|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   672
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   673
    index := self indexForInserting:anObject.
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   674
    ((index < firstIndex) or:[index > lastIndex]) ifTrue:[^ false].
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   675
    ^ (contentsArray at:index) = anObject
2
claus
parents: 1
diff changeset
   676
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   677
    "
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   678
     #(7 3 9 10 99) asSortedCollection includes:50
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   679
     #(7 3 9 10 99) asSortedCollection includes:10
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   680
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   681
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   682
a27a279701f8 Initial revision
claus
parents:
diff changeset
   683
occurrencesOf:anObject
a27a279701f8 Initial revision
claus
parents:
diff changeset
   684
    "return how many times the argument, anObject is in the collection.
62
e1b4369c61fb *** empty log message ***
claus
parents: 44
diff changeset
   685
     Redefined, since due to being sorted, the range of checked objects
2
claus
parents: 1
diff changeset
   686
     can be limited i.e. it can be done much faster."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   687
a27a279701f8 Initial revision
claus
parents:
diff changeset
   688
    |index      "{ Class: SmallInteger }"
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   689
     tally      "{ Class: SmallInteger }"
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   690
     last       "{ Class: SmallInteger }" |
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   691
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   692
    index := self indexForInserting:anObject.
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   693
    last := lastIndex.    
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   694
    ((index < firstIndex) or:[index > last]) ifTrue:[^ 0].
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   695
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   696
    "/ there may be multiple of them; count 'em
32
ee1a621c696c *** empty log message ***
claus
parents: 13
diff changeset
   697
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   698
    tally := 0.
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   699
    [(index <= last) and:[(contentsArray at:index) = anObject]] whileTrue:[
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   700
        tally := tally + 1.
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   701
        index := index + 1
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   702
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   703
    ^ tally
2
claus
parents: 1
diff changeset
   704
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   705
    "
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   706
     #(7 3 9 10 99) asSortedCollection occurrencesOf:50
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   707
     #(7 3 9 10 99) asSortedCollection occurrencesOf:10
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   708
     #(7 10 3 10 9 10 10 99) asSortedCollection occurrencesOf:10
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   709
    "
1162
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   710
3995101dfa44 changed for new #makeRoomAtIndex:; added comments
Claus Gittinger <cg@exept.de>
parents: 1156
diff changeset
   711
    "Modified: 12.4.1996 / 18:48:40 / cg"
77
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   712
! !
6c38ca59927f *** empty log message ***
claus
parents: 62
diff changeset
   713
629
2ceefe9b5a19 version at the end
Claus Gittinger <cg@exept.de>
parents: 607
diff changeset
   714
!SortedCollection class methodsFor:'documentation'!
2ceefe9b5a19 version at the end
Claus Gittinger <cg@exept.de>
parents: 607
diff changeset
   715
2ceefe9b5a19 version at the end
Claus Gittinger <cg@exept.de>
parents: 607
diff changeset
   716
version
1175
7ca26065cf02 commentary
Claus Gittinger <cg@exept.de>
parents: 1173
diff changeset
   717
    ^ '$Header: /cvs/stx/stx/libbasic/SortedCollection.st,v 1.30 1996-04-13 13:29:39 cg Exp $'
629
2ceefe9b5a19 version at the end
Claus Gittinger <cg@exept.de>
parents: 607
diff changeset
   718
! !
607
a9a526c51233 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   719
SortedCollection initialize!