Commit 231cb595 authored by Yukihiro Matsumoto's avatar Yukihiro Matsumoto

Array#reverse revisited

parent f78d2fad
...@@ -317,7 +317,16 @@ mrb_ary_reverse_bang(mrb_state *mrb, mrb_value self) ...@@ -317,7 +317,16 @@ mrb_ary_reverse_bang(mrb_state *mrb, mrb_value self)
struct RArray *a = mrb_ary_ptr(self); struct RArray *a = mrb_ary_ptr(self);
if (a->len > 1) { if (a->len > 1) {
ary_reverse(a); mrb_value *p1, *p2;
p1 = a->buf;
p2 = a->buf + a->len - 1;
while(p1 < p2) {
mrb_value tmp = *p1;
*p1++ = *p2;
*p2-- = tmp;
}
} }
return self; return self;
} }
...@@ -325,13 +334,21 @@ mrb_ary_reverse_bang(mrb_state *mrb, mrb_value self) ...@@ -325,13 +334,21 @@ mrb_ary_reverse_bang(mrb_state *mrb, mrb_value self)
mrb_value mrb_value
mrb_ary_reverse(mrb_state *mrb, mrb_value self) mrb_ary_reverse(mrb_state *mrb, mrb_value self)
{ {
struct RArray *a = mrb_ary_ptr(self); struct RArray *a = mrb_ary_ptr(self), *b;
mrb_value ary; mrb_value ary;
ary = mrb_ary_new_capa(mrb, a->len); ary = mrb_ary_new_capa(mrb, a->len);
b = mrb_ary_ptr(ary);
if (a->len > 0) { if (a->len > 0) {
mrb_ary_replace(mrb, mrb_ary_ptr(ary), a->buf, a->len); mrb_value *p1, *p2, *e;
ary_reverse(mrb_ary_ptr(ary));
p1 = a->buf;
e = p1 + a->len;
p2 = b->buf + a->len - 1;
while(p1 < e) {
*p2-- = *p1++;
}
b->len = a->len;
} }
return ary; return ary;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment