Bug #14263 » array-eql-by-hash.patch
| array.c | ||
|---|---|---|
|
}
|
||
|
static VALUE
|
||
|
rb_ary_includes_by_eql(VALUE ary, VALUE item)
|
||
|
rb_ary_includes_by_hash(VALUE ary, VALUE item)
|
||
|
{
|
||
|
long i;
|
||
|
VALUE e;
|
||
|
VALUE e, item_hash, e_hash;
|
||
|
ID id_hash = rb_intern("hash");
|
||
|
item_hash = rb_funcall(item, id_hash, 0);
|
||
|
for (i=0; i<RARRAY_LEN(ary); i++) {
|
||
|
e = RARRAY_AREF(ary, i);
|
||
|
if (rb_eql(item, e)) {
|
||
|
return Qtrue;
|
||
|
}
|
||
|
e = RARRAY_AREF(ary, i);
|
||
|
e_hash = rb_funcall(e, id_hash, 0);
|
||
|
if (rb_eql(item_hash, e_hash)) {
|
||
|
return Qtrue;
|
||
|
}
|
||
|
}
|
||
|
return Qfalse;
|
||
|
}
|
||
| ... | ... | |
|
if (RARRAY_LEN(ary1) <= SMALL_ARRAY_LEN || RARRAY_LEN(ary2) <= SMALL_ARRAY_LEN) {
|
||
|
for (i=0; i<RARRAY_LEN(ary1); i++) {
|
||
|
VALUE elt = rb_ary_elt(ary1, i);
|
||
|
if (rb_ary_includes_by_eql(ary2, elt)) continue;
|
||
|
if (rb_ary_includes_by_hash(ary2, elt)) continue;
|
||
|
rb_ary_push(ary3, elt);
|
||
|
}
|
||
|
return ary3;
|
||
| ... | ... | |
|
if (RARRAY_LEN(ary1) <= SMALL_ARRAY_LEN && RARRAY_LEN(ary2) <= SMALL_ARRAY_LEN) {
|
||
|
for (i=0; i<RARRAY_LEN(ary1); i++) {
|
||
|
v = RARRAY_AREF(ary1, i);
|
||
|
if (!rb_ary_includes_by_eql(ary2, v)) continue;
|
||
|
if (rb_ary_includes_by_eql(ary3, v)) continue;
|
||
|
if (!rb_ary_includes_by_hash(ary2, v)) continue;
|
||
|
if (rb_ary_includes_by_hash(ary3, v)) continue;
|
||
|
rb_ary_push(ary3, v);
|
||
|
}
|
||
|
return ary3;
|
||
| ... | ... | |
|
ary3 = rb_ary_new();
|
||
|
for (i=0; i<RARRAY_LEN(ary1); i++) {
|
||
|
VALUE elt = rb_ary_elt(ary1, i);
|
||
|
if (rb_ary_includes_by_eql(ary3, elt)) continue;
|
||
|
if (rb_ary_includes_by_hash(ary3, elt)) continue;
|
||
|
rb_ary_push(ary3, elt);
|
||
|
}
|
||
|
for (i=0; i<RARRAY_LEN(ary2); i++) {
|
||
|
VALUE elt = rb_ary_elt(ary2, i);
|
||
|
if (rb_ary_includes_by_eql(ary3, elt)) continue;
|
||
|
if (rb_ary_includes_by_hash(ary3, elt)) continue;
|
||
|
rb_ary_push(ary3, elt);
|
||
|
}
|
||
|
return ary3;
|
||