void mrb_ary_replace(mrb_state *mrb, mrb_value self, mrb_value other) { struct RArray *a2 = mrb_ary_ptr(other); ary_replace(mrb, mrb_ary_ptr(self), a2->ptr, a2->len); }
static struct RArray* ary_dup(mrb_state *mrb, struct RArray *a) { mrb_int len = ARY_LEN(a); struct RArray *d = ary_new_capa(mrb, len); ary_replace(mrb, d, ARY_PTR(a), len); return d; }
MRB_API void mrb_ary_replace(mrb_state *mrb, mrb_value self, mrb_value other) { struct RArray *a1 = mrb_ary_ptr(self); struct RArray *a2 = mrb_ary_ptr(other); if (a1 != a2) { ary_replace(mrb, a1, ARY_PTR(a2), ARY_LEN(a2)); } }
static void ary_concat(mrb_state *mrb, struct RArray *a, struct RArray *a2) { mrb_int len; if (ARY_LEN(a) == 0) { ary_replace(mrb, a, a2); return; } if (ARY_LEN(a2) > ARY_MAX_SIZE - ARY_LEN(a)) { mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); } len = ARY_LEN(a) + ARY_LEN(a2); ary_modify(mrb, a); if (ARY_CAPA(a) < len) { ary_expand_capa(mrb, a, len); } array_copy(ARY_PTR(a)+ARY_LEN(a), ARY_PTR(a2), ARY_LEN(a2)); mrb_write_barrier(mrb, (struct RBasic*)a); ARY_SET_LEN(a, len); }