From b6fe3dae4de7002c2f58bc9cfb993033dff7927d Mon Sep 17 00:00:00 2001 From: matz Date: Thu, 2 Apr 1998 10:03:54 +0000 Subject: call initialize git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@149 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- array.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 3 deletions(-) (limited to 'array.c') diff --git a/array.c b/array.c index 9ef50cfee7..02f0af36f9 100644 --- a/array.c +++ b/array.c @@ -155,6 +155,7 @@ ary_s_new(argc, argv, klass) ary->capa = NIL_P(size)?ARY_DEFAULT_SIZE:NUM2INT(size); ary->ptr = ALLOC_N(VALUE, ary->capa); memclear(ary->ptr, ary->capa); + obj_call_init((VALUE)ary); return (VALUE)ary; } @@ -739,7 +740,8 @@ ary_sort_bang(ary) if (RARRAY(ary)->len == 0) return ary; ary_modify(ary); - qsort(RARRAY(ary)->ptr, RARRAY(ary)->len, sizeof(VALUE), iterator_p()?sort_1:sort_2); + qsort(RARRAY(ary)->ptr, RARRAY(ary)->len, sizeof(VALUE), + iterator_p()?sort_1:sort_2); return ary; } @@ -1117,6 +1119,46 @@ ary_or(ary1, ary2) return ary3; } +static VALUE +ary_uniq_bang(ary) + VALUE ary; +{ + VALUE *p, *q, *t, *end; + VALUE v; + int i; + + ary_modify(ary); + p = RARRAY(ary)->ptr; + end = p + RARRAY(ary)->len; + + while (p < end) { + v = *p++; + q = t = p; + while (q < end) { + if (rb_equal(*q, v)) q++; + else *t++ = *q++; + } + end = t; + } + if (RARRAY(ary)->len = (end - RARRAY(ary)->ptr)) { + return Qnil; + } + + RARRAY(ary)->len = (end - RARRAY(ary)->ptr); + + return ary; +} + +static VALUE +ary_uniq(ary) + VALUE ary; +{ + VALUE v = ary_uniq_bang(ary_clone(ary)); + + if (NIL_P(v)) return ary; + return v; +} + static VALUE ary_compact_bang(ary) VALUE ary; @@ -1130,6 +1172,9 @@ ary_compact_bang(ary) if (NIL_P(*t)) t++; else *p++ = *t++; } + if (RARRAY(ary)->len == (p - RARRAY(ary)->ptr)) { + return Qnil; + } RARRAY(ary)->len = RARRAY(ary)->capa = (p - RARRAY(ary)->ptr); REALLOC_N(RARRAY(ary)->ptr, VALUE, RARRAY(ary)->len); @@ -1140,7 +1185,10 @@ static VALUE ary_compact(ary) VALUE ary; { - return ary_compact_bang(ary_clone(ary)); + VALUE v = ary_compact_bang(ary_clone(ary)); + + if (NIL_P(v)) return ary; + return v; } static VALUE @@ -1224,7 +1272,8 @@ Init_Array() rb_define_method(cArray, "&", ary_and, 1); rb_define_method(cArray, "|", ary_or, 1); - rb_define_method(cArray, "compact", ary_compact, 0); + rb_define_method(cArray, "uniq!", ary_uniq_bang, 0); + rb_define_method(cArray, "uniq", ary_uniq, 0); rb_define_method(cArray, "compact!", ary_compact_bang, 0); rb_define_method(cArray, "nitems", ary_nitems, 0); -- cgit v1.2.3