diff options
Diffstat (limited to 'array.c')
-rw-r--r-- | array.c | 68 |
1 files changed, 40 insertions, 28 deletions
@@ -6,7 +6,7 @@ $Date$ created at: Fri Aug 6 09:46:12 JST 1993 - Copyright (C) 1993-1996 Yukihiro Matsumoto + Copyright (C) 1993-1998 Yukihiro Matsumoto ************************************************/ @@ -115,7 +115,12 @@ ary_new4(n, elts) VALUE ary; ary = ary_new2(n); - MEMCPY(RARRAY(ary)->ptr, elts, VALUE, n); + if (elts) { + MEMCPY(RARRAY(ary)->ptr, elts, VALUE, n); + } + else { + memclear(RARRAY(ary)->ptr, n); + } RARRAY(ary)->len = n; return ary; @@ -136,14 +141,14 @@ assoc_new(car, cdr) } static VALUE -ary_s_new(argc, argv, class) +ary_s_new(argc, argv, klass) int argc; VALUE *argv; - VALUE class; + VALUE klass; { VALUE size; NEWOBJ(ary, struct RArray); - OBJSETUP(ary, class, T_ARRAY); + OBJSETUP(ary, klass, T_ARRAY); rb_scan_args(argc, argv, "01", &size); ary->len = 0; @@ -155,13 +160,13 @@ ary_s_new(argc, argv, class) } static VALUE -ary_s_create(argc, argv, class) +ary_s_create(argc, argv, klass) int argc; VALUE *argv; - VALUE class; + VALUE klass; { NEWOBJ(ary, struct RArray); - OBJSETUP(ary, class, T_ARRAY); + OBJSETUP(ary, klass, T_ARRAY); ary->len = argc; ary->capa = argc; @@ -403,24 +408,19 @@ ary_index(ary, val) } static VALUE -ary_indexes(ary, args) - VALUE ary, args; +ary_indexes(argc, argv, ary) + int argc; + VALUE *argv; + VALUE ary; { - VALUE *p, *pend; VALUE new_ary; - int i = 0; + int i; - if (!args || NIL_P(args)) { - return ary_new2(0); + new_ary = ary_new2(argc); + for (i=0; i<argc; i++) { + ary_store(new_ary, i, ary_entry(ary, NUM2INT(argv[i]))); } - new_ary = ary_new2(RARRAY(args)->len); - - p = RARRAY(args)->ptr; pend = p + RARRAY(args)->len; - while (p < pend) { - ary_store(new_ary, i++, ary_entry(ary, NUM2INT(*p))); - p++; - } return new_ary; } @@ -683,6 +683,8 @@ ary_reverse(ary) VALUE *p1, *p2; VALUE tmp; + if (RARRAY(ary)->len == 0) return ary; + p1 = RARRAY(ary)->ptr; p2 = p1 + RARRAY(ary)->len - 1; /* points last item */ @@ -734,6 +736,8 @@ VALUE ary_sort_bang(ary) VALUE 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); return ary; @@ -743,6 +747,7 @@ VALUE ary_sort(ary) VALUE ary; { + if (RARRAY(ary)->len == 0) return ary; return ary_sort_bang(ary_clone(ary)); } @@ -816,20 +821,27 @@ ary_delete_if(ary) return ary; } -#if 0 static VALUE -ary_replace(ary) +ary_filter(ary) VALUE ary; { int i; + ary_modify(ary); for (i = 0; i < RARRAY(ary)->len; i++) { RARRAY(ary)->ptr[i] = rb_yield(RARRAY(ary)->ptr[i]); } + return ary; +} +static VALUE +ary_replace_method(ary, ary2) + VALUE ary, ary2; +{ + Check_Type(ary2, T_ARRAY); + ary_replace(ary, 0, RARRAY(ary2)->len, ary2); return ary; } -#endif static VALUE ary_clear(ary) @@ -1183,7 +1195,8 @@ Init_Array() rb_define_alias(cArray, "size", "length"); rb_define_method(cArray, "empty?", ary_empty_p, 0); rb_define_method(cArray, "index", ary_index, 1); - rb_define_method(cArray, "indexes", ary_indexes, -2); + rb_define_method(cArray, "indexes", ary_indexes, -1); + rb_define_method(cArray, "indices", ary_indexes, -1); rb_define_method(cArray, "clone", ary_clone, 0); rb_define_method(cArray, "dup", ary_dup, 0); rb_define_method(cArray, "join", ary_join_method, -1); @@ -1194,9 +1207,8 @@ Init_Array() rb_define_method(cArray, "delete", ary_delete, 1); rb_define_method(cArray, "delete_at", ary_delete_at, 1); rb_define_method(cArray, "delete_if", ary_delete_if, 0); -#if 0 - rb_define_method(cArray, "replace", ary_replace, 0); -#endif + rb_define_method(cArray, "filter", ary_filter, 0); + rb_define_method(cArray, "replace", ary_replace_method, 1); rb_define_method(cArray, "clear", ary_clear, 0); rb_define_method(cArray, "fill", ary_fill, -1); rb_define_method(cArray, "include?", ary_includes, 1); |