class: CharacterArray
authorClaus Gittinger <cg@exept.de>
Mon, 03 Aug 2015 12:34:53 +0200
changeset 18657 fee4d5739a73
parent 18656 fab035561c68
child 18658 d1665870d020
class: CharacterArray changed: #asLowercase #asUppercase tuned for regular strings
CharacterArray.st
--- a/CharacterArray.st	Mon Aug 03 12:02:53 2015 +0200
+++ b/CharacterArray.st	Mon Aug 03 12:34:53 2015 +0200
@@ -360,7 +360,6 @@
     "
 ! !
 
-
 !CharacterArray class methodsFor:'pattern matching'!
 
 matchEscapeCharacter
@@ -766,7 +765,6 @@
     ^ Unicode32String
 ! !
 
-
 !CharacterArray methodsFor:'Compatibility-ANSI'!
 
 addLineDelimiters
@@ -3139,22 +3137,42 @@
 
     mySize := self size.
     mySize == 0 ifTrue:[^ self].
+
     newStr := self species new:mySize.
     bitsPerCharacter := newStr bitsPerCharacter.
 
+    "/ handle the very seldom case of an uppercase char which needs
+    "/ more bits in its lowercase variant 
+    "/ (there are only a few of them)
+
+    "/ for 8-bit strings, use faster code.
+    bitsPerCharacter == 8 ifTrue:[
+        1 to:mySize do:[:i |
+            c := (self at:i) asLowercase.   
+            (c codePoint > 16rFF) ifTrue:[
+                (c stringSpecies ~= newStr stringSpecies) ifTrue:[
+                    newStr := c stringSpecies fromString:newStr.
+                ]
+            ].
+            newStr at:i put:c
+        ].
+        ^ newStr
+    ].
+
     1 to:mySize do:[:i |
-	c := (self at:i) asLowercase.
-	(c bitsPerCharacter > bitsPerCharacter
-	 and:[c stringSpecies ~= newStr stringSpecies]) ifTrue:[
-	    newStr := c stringSpecies fromString:newStr.
-	].
-	newStr at:i put:c
+        c := (self at:i) asLowercase.
+        (c bitsPerCharacter > bitsPerCharacter
+         and:[c stringSpecies ~= newStr stringSpecies]) ifTrue:[
+            newStr := c stringSpecies fromString:newStr.
+        ].
+        newStr at:i put:c
     ].
     ^ newStr
 
     "
      'HelloWorld' asLowercase
      'HelloWorld' asLowercaseFirst
+     'HelloWorld' asUppercase
     "
 !
 
@@ -3546,12 +3564,30 @@
     newStr := self species new:mySize.
     bitsPerCharacter := newStr bitsPerCharacter.
 
+    "/ handle the very seldom case of a lowercase char which needs
+    "/ more bits in its uppercase variant 
+    "/ (there are only a few of them)
+
+    "/ for 8-bit strings, use faster code.
+    bitsPerCharacter == 8 ifTrue:[
+        1 to:mySize do:[:i |
+            c := (self at:i) asUppercase.   
+            (c codePoint > 16rFF) ifTrue:[
+                (c stringSpecies ~= newStr stringSpecies) ifTrue:[
+                    newStr := c stringSpecies fromString:newStr.
+                ]
+            ].
+            newStr at:i put:c
+        ].
+        ^ newStr
+    ].
+
     1 to:mySize do:[:i |
-	c := (self at:i) asUppercase.
-	c bitsPerCharacter > bitsPerCharacter ifTrue:[
-	    newStr := c stringSpecies fromString:newStr.
-	].
-	newStr at:i put:c
+        c := (self at:i) asUppercase.
+        c bitsPerCharacter > bitsPerCharacter ifTrue:[
+            newStr := c stringSpecies fromString:newStr.
+        ].
+        newStr at:i put:c
     ].
     ^ newStr
 
@@ -3559,6 +3595,7 @@
      'helloWorld' asUppercase
      'helloWorld' asUppercaseFirst
      (Character value:16rB5) asString asUppercase   -- needs 16 bits !!
+     (Character value:16rFF) asString asUppercase   -- needs 16 bits !!
     "
 !
 
@@ -5739,7 +5776,6 @@
     "Modified: 17.4.1997 / 12:50:23 / cg"
 ! !
 
-
 !CharacterArray methodsFor:'special string converting'!
 
 asUnixFilenameString
@@ -6777,7 +6813,6 @@
     "
 ! !
 
-
 !CharacterArray methodsFor:'substring searching'!
 
 findRangeOfString:subString