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