[macruby-changes] [155] MacRuby/trunk/string.c

source_changes at macosforge.org source_changes at macosforge.org
Fri Apr 18 22:01:47 PDT 2008


Revision: 155
          http://trac.macosforge.org/projects/ruby/changeset/155
Author:   lsansonetti at apple.com
Date:     2008-04-18 22:01:46 -0700 (Fri, 18 Apr 2008)

Log Message:
-----------
faster #count, #delete

Modified Paths:
--------------
    MacRuby/trunk/string.c

Modified: MacRuby/trunk/string.c
===================================================================
--- MacRuby/trunk/string.c	2008-04-18 20:29:09 UTC (rev 154)
+++ MacRuby/trunk/string.c	2008-04-19 05:01:46 UTC (rev 155)
@@ -5306,6 +5306,7 @@
     }
 
     search_range = CFRangeMake(0, n);
+#if 0 
     while (search_range.length != 0 
 	    && CFStringFindCharacterFromSet(
 		(CFStringRef)str,
@@ -5315,7 +5316,58 @@
 		&result_range)) {
 	(*cb)(&search_range, (const CFRange *)&result_range, str, ctx);
     }
+#else
+    CFStringInlineBuffer buf;
+    CFStringInitInlineBuffer((CFStringRef)str, &buf, search_range);
+    do {
+        long i;
 
+	if (search_range.location + search_range.length < n) {
+	    n = search_range.location + search_range.length;
+	    CFStringInitInlineBuffer((CFStringRef)str, &buf, CFRangeMake(0, n));
+	}
+
+	result_range.length = 0;
+
+	for (i = search_range.location;
+	     i < search_range.location + search_range.length; 
+	     i++) {
+
+	    UniChar c;
+
+	    c = CFStringGetCharacterFromInlineBuffer(&buf, i);
+	    if (CFCharacterSetIsCharacterMember((CFCharacterSetRef)charset, 
+						c)) {
+		if (result_range.length == 0) {
+		    result_range.location = i;
+		    result_range.length = 1;
+		}
+		else {
+		    if (result_range.location + result_range.length == i) {
+			result_range.length++;
+		    }
+		    else {
+			(*cb)(&search_range, (const CFRange *)&result_range, str, 
+				ctx);
+			result_range.location = i;
+			result_range.length = 1;
+			if (search_range.location + search_range.length < n) {
+			    result_range.location -= n 
+				- (search_range.location + search_range.length);
+			}
+			break;
+		    }
+		}
+	    }	    
+	}
+	if (result_range.length != 0) {
+	    (*cb)(&search_range, (const CFRange *)&result_range, str, 
+		    ctx);
+	}
+    }
+    while (search_range.length != 0 && result_range.length != 0); 
+#endif
+
     CFRelease(charset);	
 }
 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080418/4689b509/attachment.html


More information about the macruby-changes mailing list