19 #define ARY_DEFAULT_LEN 4
20 #define ARY_SHRINK_RATIO 5
21 #define ARY_C_MAX_SIZE (SIZE_MAX / sizeof(mrb_value))
22 #define ARY_MAX_SIZE ((ARY_C_MAX_SIZE < (size_t)MRB_INT_MAX) ? (mrb_int)ARY_C_MAX_SIZE : MRB_INT_MAX-1)
27 if (
RARRAY_LEN(ary) == 0)
return mrb_nil_value();
29 return mrb_nil_value();
59 struct RArray *a = ary_new_capa(mrb, capa);
60 return mrb_obj_value(a);
88 for (i = 0; i < size; i++) {
107 while ((
int)(size--)) {
131 array_copy(ptr, p, a->
len);
188 a->
ptr = expanded_ptr;
206 }
while (capa > a->
len * ARY_SHRINK_RATIO);
208 if (capa > a->
len && capa < a->
aux.capa) {
230 if (a->
aux.
capa < len) ary_expand_capa(mrb, a, len);
231 array_copy(a->
ptr+a->
len, ptr, blen);
268 array_copy(a2->
ptr + a1->
len, ptr, blen);
303 if (a1->
len == a2->
len && a1->
ptr == a2->
ptr)
return mrb_fixnum_value(0);
311 for (i=0; i<
len; i++) {
318 return mrb_fixnum_value((len == 0)? 0: (len > 0)? 1: -1);
326 ary_expand_capa(mrb, a, len);
327 array_copy(a->
ptr, argv, len);
370 array_copy(ptr, a1->
ptr, a1->
len);
412 p2 =
b->ptr + a->
len - 1;
429 array_copy(a->
ptr, vals, size);
442 ary_expand_capa(mrb, a, a->
len + 1);
466 if (a->
len == 0)
return mrb_nil_value();
470 #define ARY_SHIFT_SHARED_MIN 10
478 if (a->
len == 0)
return mrb_nil_value();
487 ary_make_shared(mrb, a);
495 while ((
int)(--size)) {
522 ary_expand_capa(mrb, a, a->
len + 1);
547 if (len == 0)
return self;
549 ary_expand_capa(mrb, a, a->
len + len);
550 value_move(a->
ptr + len, a->
ptr, a->
len);
552 array_copy(a->
ptr, vals, len);
565 if (n < 0) n += a->
len;
566 if (n < 0 || a->len <= (
int)n)
return mrb_nil_value();
584 if (a->
len <= (
int)n) {
586 ary_expand_capa(mrb, a, n + 1);
587 ary_fill_with_nil(a->
ptr + a->
len, n + 1 - a->
len);
611 if (a->
len < len || a->
len < head + len) {
627 if (tail < a->len) size += a->
len - tail;
629 ary_expand_capa(mrb, a, size);
632 ary_fill_with_nil(a->
ptr + a->
len, (
int)(head - a->
len));
634 else if (head < a->len) {
635 value_move(a->
ptr + head + argc, a->
ptr + tail, a->
len - tail);
638 for(i = 0; i < argc; i++) {
639 *(a->
ptr + head +
i) = *(argv + i);
657 if (shared->
refcnt == 0) {
668 ary_make_shared(mrb, a);
676 return mrb_obj_value(b);
696 if (index < 0) index += a->
len;
697 if (index < 0 || a->len < (
int)index)
return mrb_nil_value();
699 if (len < 0)
return mrb_nil_value();
702 return ary_subseq(mrb, a, index, len);
709 return mrb_nil_value();
734 return mrb_nil_value();
748 if (index < 0) index += a->
len;
749 if (index < 0 || a->len <= (
int)index)
return mrb_nil_value();
756 while ((
int)(--len)) {
762 ary_shrink_capa(mrb, a);
774 return (a->
len > 0)? a->
ptr[0]: mrb_nil_value();
780 if (size > a->
len) size = a->
len;
782 return ary_subseq(mrb, a, 0, size);
800 if (len == 0)
return (a->
len > 0)? a->
ptr[a->
len - 1]: mrb_nil_value();
807 if (size > a->
len) size = a->
len;
809 return ary_subseq(mrb, a, a->
len - size, size);
823 return mrb_fixnum_value(i);
826 return mrb_nil_value();
838 return mrb_fixnum_value(i);
841 return mrb_nil_value();
860 return mrb_fixnum_value(a->
len);
882 return mrb_bool_value(a->
len == 0);
897 return ary_elt(ary, offset);
905 char head[] = {
'[' };
906 char sep[] = {
',',
' ' };
907 char tail[] = {
']' };
928 s = inspect_ary(mrb,
RARRAY_PTR(ary)[i], list);
985 val = join_ary(mrb, val, sep, list);
1063 if (
mrb_obj_equal(mrb, ary1, ary2))
return mrb_true_value();
1067 return mrb_false_value();
1070 return mrb_bool_value(
mrb_equal(mrb, ary2, ary1));
1075 if (!
mrb_equal(mrb, ary_elt(ary1, i), ary_elt(ary2, i))) {
1076 return mrb_false_value();
1079 return mrb_true_value();
1098 if (
mrb_obj_equal(mrb, ary1, ary2))
return mrb_true_value();
1102 if (!
mrb_eql(mrb, ary_elt(ary1, i), ary_elt(ary2, i))) {
1103 return mrb_false_value();
1106 return mrb_true_value();