From d0f9184f8be497313e3b26911c99fa0d23a8ebed Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 20 Sep 2018 03:18:53 +0000 Subject: Introduce rb_ary_union method in Array MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Avoid repeating code and improve readability in `rb_ary_or` and `rb_ary_union_multi`. [Fix GH-1747] [Feature #14097] From: Ana María Martínez Gómez git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64788 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- array.c | 39 +++++++++++++++------------------------ 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/array.c b/array.c index ae3cc49e26..e49071d5a1 100644 --- a/array.c +++ b/array.c @@ -4271,6 +4271,17 @@ ary_hash_orset(st_data_t *key, st_data_t *value, st_data_t arg, int existing) return ST_CONTINUE; } +static void +rb_ary_union(VALUE ary_union, VALUE ary) +{ + long i; + for (i = 0; i < RARRAY_LEN(ary); i++) { + VALUE elt = rb_ary_elt(ary, i); + if (rb_ary_includes_by_eql(ary_union, elt)) continue; + rb_ary_push(ary_union, elt); + } +} + /* * call-seq: * ary | other_ary -> new_ary @@ -4295,16 +4306,8 @@ rb_ary_or(VALUE ary1, VALUE ary2) ary2 = to_ary(ary2); if (RARRAY_LEN(ary1) + RARRAY_LEN(ary2) <= SMALL_ARRAY_LEN) { ary3 = rb_ary_new(); - for (i=0; i