[macruby-changes] [131] MacRuby/trunk/array.c
source_changes at macosforge.org
source_changes at macosforge.org
Fri Apr 4 17:53:59 PDT 2008
Revision: 131
http://trac.macosforge.org/projects/ruby/changeset/131
Author: lsansonetti at apple.com
Date: 2008-04-04 17:53:57 -0700 (Fri, 04 Apr 2008)
Log Message:
-----------
faster #rindex, #uniq
Modified Paths:
--------------
MacRuby/trunk/array.c
Modified: MacRuby/trunk/array.c
===================================================================
--- MacRuby/trunk/array.c 2008-04-04 20:59:58 UTC (rev 130)
+++ MacRuby/trunk/array.c 2008-04-05 00:53:57 UTC (rev 131)
@@ -516,11 +516,8 @@
rb_raise(rb_eArgError, "negative array size");
}
#if WITH_OBJC
- {
- int i;
- for (i = 0; i < argc; i++)
- rb_ary_insert(ary, i, argv[i]);
- }
+ CFArrayReplaceValues((CFMutableArrayRef)ary, CFRangeMake(0, 0),
+ (const void **)argv, argc);
#else
RARRAY(ary)->ptr = ALLOC_N(VALUE, argc);
RARRAY(ary)->aux.capa = argc;
@@ -1246,6 +1243,12 @@
}
}
else {
+#if WITH_OBJC
+ i = CFArrayGetLastIndexOfValue((CFArrayRef)ary, CFRangeMake(0, n),
+ (const void *)val);
+ if (i != -1)
+ return LONG2NUM(i);
+#else
while (i--) {
if (rb_equal(RARRAY_AT(ary, i), val))
return LONG2NUM(i);
@@ -1253,6 +1256,7 @@
i = n;
}
}
+#endif
}
return Qnil;
}
@@ -2623,6 +2627,12 @@
for (i=beg; i<end; i++) {
rb_ary_store(ary, i, item);
}
+# if 0
+ const void **vals = (const void **)alloca(sizeof(void *) * (end - beg));
+ for (i=beg; i<end; i++) { vals[i] = (const void *)item; }
+ CFArrayReplaceValues((CFMutableArrayRef)ary, CFRangeMake(beg, end),
+ vals, end);
+# endif
#else
p = RARRAY_PTR(ary) + beg;
pend = p + len;
@@ -3167,6 +3177,7 @@
rb_ary_uniq_bang(VALUE ary)
{
#if WITH_OBJC
+# if 0
long i, n;
bool changed;
@@ -3189,6 +3200,32 @@
}
if (!changed)
return Qnil;
+# else
+ VALUE hash;
+ long i, n, n_orig;
+ bool changed;
+
+ rb_ary_modify(ary);
+ hash = ary_make_hash(ary, 0);
+ n_orig = n = RARRAY_LEN(ary);
+ if (RARRAY_LEN(ary) == RHASH_SIZE(hash))
+ return Qnil;
+ for (i = 0, changed = false; i < n; i++) {
+ VALUE e;
+
+ e = RARRAY_AT(ary, i);
+ if (CFDictionaryContainsKey((CFDictionaryRef)hash, (const void *)e)) {
+ CFDictionaryRemoveValue((CFMutableDictionaryRef)hash,
+ (const void *)e);
+ }
+ else {
+ CFArrayRemoveValueAtIndex((CFMutableArrayRef)ary, i);
+ n--;
+ }
+ }
+ if (n != n_orig)
+ return Qnil;
+# endif
#else
VALUE hash, v, vv;
long i, j;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080404/93684e26/attachment.html
More information about the macruby-changes
mailing list