summaryrefslogtreecommitdiff
path: root/array.c
diff options
context:
space:
mode:
Diffstat (limited to 'array.c')
-rw-r--r--array.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/array.c b/array.c
index ccacef51b7..bb821f297f 100644
--- a/array.c
+++ b/array.c
@@ -2777,6 +2777,40 @@ rb_ary_delete(VALUE ary, VALUE item)
}
VALUE
+rb_ary_delete_same_obj(VALUE ary, VALUE item)
+{
+ VALUE v = item;
+ long i1, i2;
+
+ for (i1 = i2 = 0; i1 < RARRAY_LEN(ary); i1++) {
+ VALUE e = RARRAY_PTR(ary)[i1];
+
+ if (e == item) {
+ v = e;
+ continue;
+ }
+ if (i1 != i2) {
+ rb_ary_store(ary, i2, e);
+ }
+ i2++;
+ }
+ if (RARRAY_LEN(ary) == i2) {
+ return Qnil;
+ }
+
+ rb_ary_modify(ary);
+ if (RARRAY_LEN(ary) > i2) {
+ ARY_SET_LEN(ary, i2);
+ if (i2 * 2 < ARY_CAPA(ary) &&
+ ARY_CAPA(ary) > ARY_DEFAULT_SIZE) {
+ ary_resize_capa(ary, i2*2);
+ }
+ }
+
+ return v;
+}
+
+VALUE
rb_ary_delete_at(VALUE ary, long pos)
{
long len = RARRAY_LEN(ary);