Author: thebeing
Date: Fri Sep  4 11:48:07 2015
New Revision: 38969

URL: http://svn.gna.org/viewcvs/gnustep?rev=38969&view=rev
Log:
Optimise appending UTF-16 strings for formatting

If the string being appended to already uses unichar as the underlying 
character type, append the new characters using memcpy() instead of
looping over them individually. Also includes test cases to verify that
nothing breaks.


Added:
    libs/base/trunk/Tests/base/NSString/unichar_format.m
Modified:
    libs/base/trunk/ChangeLog
    libs/base/trunk/Source/GSString.m

Modified: libs/base/trunk/ChangeLog
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/ChangeLog?rev=38969&r1=38968&r2=38969&view=diff
==============================================================================
--- libs/base/trunk/ChangeLog   (original)
+++ libs/base/trunk/ChangeLog   Fri Sep  4 11:48:07 2015
@@ -1,3 +1,9 @@
+2015-09-04 Niels Grewe <[email protected]>
+
+       * Source/GSString.m: Optimisation for formatting strings that are 
stored as
+       UTF-16 (use memcpy instead of looping over the characters).
+       * Tests/base/NSString/unichar_format.m: Test cases for formatting.
+
 2015-09-01 Niels Grewe <[email protected]>
 
        * Source/NSRegularExpression.m: Fix handling of empty capture groups.

Modified: libs/base/trunk/Source/GSString.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/GSString.m?rev=38969&r1=38968&r2=38969&view=diff
==============================================================================
--- libs/base/trunk/Source/GSString.m   (original)
+++ libs/base/trunk/Source/GSString.m   Fri Sep  4 11:48:07 2015
@@ -6267,12 +6267,8 @@
    */
   if (s->_flags.wide == 1)
     {
-      unsigned         i;
-
-      for (i = 0; i < l; i++)
-       {
-         s->_contents.u[s->_count++] = u[i];
-       }
+      memcpy(s->_contents.u + s->_count, u, l * sizeof(unichar));
+      s->_count += l;
     }
   else
     {

Added: libs/base/trunk/Tests/base/NSString/unichar_format.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Tests/base/NSString/unichar_format.m?rev=38969&view=auto
==============================================================================
--- libs/base/trunk/Tests/base/NSString/unichar_format.m        (added)
+++ libs/base/trunk/Tests/base/NSString/unichar_format.m        Fri Sep  4 
11:48:07 2015
@@ -0,0 +1,24 @@
+#import "ObjectTesting.h"
+#import <Foundation/NSAutoreleasePool.h>
+#import <Foundation/NSString.h>
+
+int main()
+{
+  NSAutoreleasePool    *arp = [NSAutoreleasePool new];
+  NSString              *narrow = @"aaaa"; // fits in a single byte
+  NSString              *wide = @"a\u20AC\u20ACa"; // Euro signs, requires 
UTF-16 storage
+  NSString             *narrowNarrowFormat = [NSString stringWithFormat: 
@"a%@a", narrow];
+  NSString             *narrowWideFormat = [NSString stringWithFormat: 
@"a%@a", wide];
+  NSString             *wideNarrowFormat = [NSString stringWithFormat: 
@"\u20AC%@\u20ac", narrow];
+  NSString             *wideWideFormat = [NSString stringWithFormat: 
@"\u20AC%@\u20ac", wide];
+  PASS_EQUAL(narrowNarrowFormat, @"aaaaaa",
+             "Formatting byte-width string into a byte-width string works.");
+  PASS_EQUAL(narrowWideFormat, @"aa\u20AC\u20ACaa",
+             "Formatting a 16 bit wide string into a byte-width string 
works.");
+  PASS_EQUAL(wideNarrowFormat, @"\u20ACaaaa\u20AC",
+             "Formatting a byte-width string into a 16 bit wide string 
works.");
+  PASS_EQUAL(wideWideFormat, @"\u20ACa\u20AC\u20ACa\u20AC",
+             "Formatting a 16 bit wide string into a 16 bit wide string 
works.");
+  [arp release]; arp = nil;
+  return 0;
+}


_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs

Reply via email to