[前][次][番号順一覧][スレッド一覧]

ruby-changes:15110

From: akr <ko1@a...>
Date: Sat, 20 Mar 2010 13:27:52 +0900 (JST)
Subject: [ruby-changes:15110] Ruby:r26987 (trunk): * array.c (rb_ary_uniq_bang): the array is already unique if the

akr	2010-03-20 13:27:32 +0900 (Sat, 20 Mar 2010)

  New Revision: 26987

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=26987

  Log:
    * array.c (rb_ary_uniq_bang): the array is already unique if the
      length is zero or one.
      (rb_ary_uniq): ditto.

  Modified files:
    trunk/ChangeLog
    trunk/array.c
    trunk/test/ruby/test_array.rb

Index: array.c
===================================================================
--- array.c	(revision 26986)
+++ array.c	(revision 26987)
@@ -3367,6 +3367,8 @@
     long i, j;
 
     rb_ary_modify_check(ary);
+    if (RARRAY_LEN(ary) <= 1)
+        return Qnil;
     if (rb_block_given_p()) {
 	hash = ary_make_hash_by(ary);
 	if (RARRAY_LEN(ary) == (i = RHASH_SIZE(hash))) {
@@ -3412,6 +3414,8 @@
     VALUE hash, uniq, v;
     long i;
 
+    if (RARRAY_LEN(ary) <= 1)
+        return rb_ary_dup(ary);
     if (rb_block_given_p()) {
 	hash = ary_make_hash_by(ary);
 	uniq = ary_new(rb_obj_class(ary), RHASH_SIZE(hash));
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 26986)
+++ ChangeLog	(revision 26987)
@@ -1,3 +1,9 @@
+Sat Mar 20 13:26:09 2010  Tanaka Akira  <akr@f...>
+
+	* array.c (rb_ary_uniq_bang): the array is already unique if the
+	  length is zero or one.
+	  (rb_ary_uniq): ditto.
+
 Sat Mar 20 12:30:54 2010  Nobuyoshi Nakada  <nobu@r...>
 
 	* lib: fixed typo.  a patch by Sho Hashimoto in [ruby-dev:40716].
Index: test/ruby/test_array.rb
===================================================================
--- test/ruby/test_array.rb	(revision 26986)
+++ test/ruby/test_array.rb	(revision 26987)
@@ -1308,6 +1308,30 @@
   end
 
   def test_uniq
+    a = []
+    b = a.uniq
+    assert_equal([], a)
+    assert_equal([], b)
+    assert_not_same(a, b)
+
+    a = [1]
+    b = a.uniq
+    assert_equal([1], a)
+    assert_equal([1], b)
+    assert_not_same(a, b)
+
+    a = [1,1]
+    b = a.uniq
+    assert_equal([1,1], a)
+    assert_equal([1], b)
+    assert_not_same(a, b)
+
+    a = [1,2]
+    b = a.uniq
+    assert_equal([1,2], a)
+    assert_equal([1,2], b)
+    assert_not_same(a, b)
+
     a = @cls[ 1, 2, 3, 2, 1, 2, 3, 4, nil ]
     b = a.dup
     assert_equal(@cls[1, 2, 3, 4, nil], a.uniq)
@@ -1322,6 +1346,25 @@
   end
 
   def test_uniq!
+    a = []
+    b = a.uniq!
+    assert_equal(nil, b)
+
+    a = [1]
+    b = a.uniq!
+    assert_equal(nil, b)
+
+    a = [1,1]
+    b = a.uniq!
+    assert_equal([1], a)
+    assert_equal([1], b)
+    assert_same(a, b)
+
+    a = [1,2]
+    b = a.uniq!
+    assert_equal([1,2], a)
+    assert_equal(nil, b)
+
     a = @cls[ 1, 2, 3, 2, 1, 2, 3, 4, nil ]
     assert_equal(@cls[1, 2, 3, 4, nil], a.uniq!)
     assert_equal(@cls[1, 2, 3, 4, nil], a)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]