Merge pull request #2449 from take-cheeze/mrb_ary_resize

Add new API `mrb_ary_resize`(mruby implementation of `rb_ary_resize`).
This commit is contained in:
Yukihiro "Matz" Matsumoto
2014-07-08 23:01:22 +09:00
2 changed files with 23 additions and 0 deletions
+1
View File
@@ -54,6 +54,7 @@ mrb_value mrb_ary_entry(mrb_value ary, mrb_int offset);
mrb_value mrb_ary_shift(mrb_state *mrb, mrb_value self);
mrb_value mrb_ary_clear(mrb_state *mrb, mrb_value self);
mrb_value mrb_ary_join(mrb_state *mrb, mrb_value ary, mrb_value sep);
mrb_value mrb_ary_resize(mrb_state *mrb, mrb_value ary, mrb_int len);
static inline mrb_int
mrb_ary_len(mrb_state *mrb, mrb_value ary)
+22
View File
@@ -231,6 +231,28 @@ ary_shrink_capa(mrb_state *mrb, struct RArray *a)
}
}
mrb_value
mrb_ary_resize(mrb_state *mrb, mrb_value ary, mrb_int new_len)
{
mrb_int old_len;
struct RArray *a = mrb_ary_ptr(ary);
ary_modify(mrb, a);
old_len = RARRAY_LEN(ary);
if (old_len != new_len) {
a->len = new_len;
if (new_len < old_len) {
ary_shrink_capa(mrb, a);
}
else {
ary_expand_capa(mrb, a, new_len);
ary_fill_with_nil(a->ptr + old_len, new_len - old_len);
}
}
return ary;
}
static mrb_value
mrb_ary_s_create(mrb_state *mrb, mrb_value self)
{