VariableString.st
author claus
Mon, 04 Oct 1993 11:32:27 +0100
changeset 1 85d662a8509f
parent 0 1cf8d1747859
child 3 c9936b5a86a1
permissions -rw-r--r--
2.7.2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     1
"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1990-93 by Claus Gittinger
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     4
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    11
"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    12
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    13
ArrayedCollection subclass:#VariableString
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:'contents'
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    15
       classVariableNames:''
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    16
       poolDictionaries:''
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    17
       category:'Collections-Indexed'
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    18
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    19
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    20
VariableString comment:'
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    21
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    22
COPYRIGHT (c) 1990-93 by Claus Gittinger
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    23
              All Rights Reserved
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    24
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    25
VariableStrings can grow and shrink - in contrast to Strings which are
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    26
fixed in size - this may change in the future.
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    27
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    28
%W% %E%
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    29
'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    30
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    31
!VariableString class methodsFor:'initialization'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    32
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    33
initialize
1
claus
parents: 0
diff changeset
    34
    "clear my superclass - this makes all messages be misunderstood"
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    35
1
claus
parents: 0
diff changeset
    36
    self setSuperclass: nil
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    37
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    38
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    39
!VariableString class methodsFor:'instance creation'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    40
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    41
new
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    42
    "return a new VariableString - with size 0"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    43
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    44
    ^ self new:0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    45
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    46
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    47
new:size
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    48
    "return a new VariableString"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    49
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    50
    ^ (self basicNew) setContents:(String new:size)
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    51
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    52
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    53
copyFrom:aString
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    54
    "return a new VariableString with contents copied from the argument"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    55
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    56
    ^ self basicNew setContents:(String copyFrom:aString)
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    57
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    58
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    59
!VariableString methodsFor:'accessing'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    60
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    61
at:index
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    62
    "return the element at index"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    63
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    64
    ^ contents at:index
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    65
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    66
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    67
at:index put:anObject
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    68
    "set the element at index"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    69
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    70
    ^ contents at:index put:anObject
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    71
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    72
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    73
!VariableString methodsFor:'queries'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    74
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    75
size
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    76
    ^ contents size
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    77
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    78
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    79
isFixedSize
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    80
    "return true if the receiver cannot grow - this will vanish once
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    81
     Arrays and Strings learn how to grow ..."
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    82
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    83
    ^ false
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    84
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    85
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    86
!VariableString methodsFor:'filling & replacing'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    87
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    88
replaceFrom:start to:stop with:aCollection startingAt:repStart
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    89
    "reimplemented for speed
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    90
     - can use Strings fast replace if aCollection
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    91
       is String or VariableString"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    92
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    93
    |col|
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    94
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    95
    col := aCollection.
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    96
    (aCollection isKindOf:VariableString) ifTrue:[
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    97
        ((stop - start + repStart) <= aCollection size) ifTrue:[
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    98
            col := aCollection getContents
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    99
        ]
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   100
    ].
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   101
    (col isMemberOf:String) ifTrue:[
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   102
        (stop <= (contents size)) ifTrue:[
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   103
            ^ contents replaceFrom:start to:stop with:col startingAt:repStart
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   104
        ]
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   105
    ].
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   106
    ^ super replaceFrom:start to:stop with:aCollection startingAt:repStart
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   107
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   108
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   109
!VariableString methodsFor:'converting'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   110
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   111
asText
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   112
    ^ contents asText
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   113
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   114
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   115
!VariableString methodsFor:'kludges'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   116
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   117
shallowCopy:anArray
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   118
    "return a shallow copy of the receiver
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   119
     have to kludge the kludge ... - shallow copy the contents array"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   120
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   121
    |newText|
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   122
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   123
    newText := self class basicNew.
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   124
    newText setContents:(contents shallowCopy).
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   125
    ^ newText
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   126
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   127
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   128
!VariableString methodsFor:'private'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   129
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   130
getContents
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   131
    "return the contents array"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   132
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   133
    ^ contents
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   134
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   135
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   136
setContents:aString
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   137
    "set the contents"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   138
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   139
    contents := aString
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   140
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   141
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   142
!VariableString methodsFor:'error handling'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   143
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   144
doesNotUnderstand:aMessage
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   145
    "this is funny: all message we do not understand, are passed
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   146
     on to the string - so we do not have to care for all
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   147
     possible messages ...(thanks to the Message class)"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   148
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   149
     ^ contents perform:(aMessage selector)
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   150
          withArguments:(aMessage arguments)
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   151
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   152
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   153
!VariableString methodsFor:'grow & shrink'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   154
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   155
grow:newSize
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   156
    |old oldSize|
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   157
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   158
    oldSize := contents size.
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   159
    (newSize < oldSize) ifTrue:[
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   160
        contents := contents copyFrom:1 to:newSize
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   161
    ] ifFalse:[
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   162
        (newSize > oldSize) ifTrue:[
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   163
            old := contents.
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   164
            (newSize > (oldSize * 2)) ifTrue:[
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   165
                contents := String new:newSize
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   166
            ] ifFalse:[
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   167
                contents := String new:(oldSize * 2)
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   168
            ].
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   169
            contents replaceFrom:1 to:oldSize
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   170
                            with:old startingAt:1
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   171
        ]
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   172
    ]
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   173
! !