ruby-changes:25454
From: marcandre <ko1@a...>
Date: Wed, 7 Nov 2012 02:13:41 +0900 (JST)
Subject: [ruby-changes:25454] marcandRe: r37511 (trunk): * hash.c: Support for enumerators created by Hash:
marcandre 2012-11-07 02:13:33 +0900 (Wed, 07 Nov 2012) New Revision: 37511 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=37511 Log: * hash.c: Support for enumerators created by Hash: delete_if, reject!, ... [Feature #6636] Modified files: trunk/hash.c trunk/test/ruby/test_enumerator.rb Index: hash.c =================================================================== --- hash.c (revision 37510) +++ hash.c (revision 37511) @@ -911,6 +911,8 @@ return ST_CONTINUE; } +static VALUE rb_hash_size(VALUE hash); + /* * call-seq: * hsh.delete_if {| key, value | block } -> hsh @@ -929,7 +931,7 @@ VALUE rb_hash_delete_if(VALUE hash) { - RETURN_ENUMERATOR(hash, 0, 0); + RETURN_SIZED_ENUMERATOR(hash, 0, 0, rb_hash_size); rb_hash_modify_check(hash); if (RHASH(hash)->ntbl) rb_hash_foreach(hash, delete_if_i, hash); @@ -950,7 +952,7 @@ { st_index_t n; - RETURN_ENUMERATOR(hash, 0, 0); + RETURN_SIZED_ENUMERATOR(hash, 0, 0, rb_hash_size); rb_hash_modify(hash); if (!RHASH(hash)->ntbl) return Qnil; @@ -1027,7 +1029,7 @@ { VALUE result; - RETURN_ENUMERATOR(hash, 0, 0); + RETURN_SIZED_ENUMERATOR(hash, 0, 0, rb_hash_size); result = rb_hash_new(); rb_hash_foreach(hash, select_i, result); return result; @@ -1056,7 +1058,7 @@ { st_index_t n; - RETURN_ENUMERATOR(hash, 0, 0); + RETURN_SIZED_ENUMERATOR(hash, 0, 0, rb_hash_size); rb_hash_modify_check(hash); if (!RHASH(hash)->ntbl) return Qnil; @@ -1081,7 +1083,7 @@ VALUE rb_hash_keep_if(VALUE hash) { - RETURN_ENUMERATOR(hash, 0, 0); + RETURN_SIZED_ENUMERATOR(hash, 0, 0, rb_hash_size); rb_hash_modify_check(hash); if (RHASH(hash)->ntbl) rb_hash_foreach(hash, keep_if_i, hash); @@ -1310,7 +1312,7 @@ static VALUE rb_hash_each_value(VALUE hash) { - RETURN_ENUMERATOR(hash, 0, 0); + RETURN_SIZED_ENUMERATOR(hash, 0, 0, rb_hash_size); rb_hash_foreach(hash, each_value_i, 0); return hash; } @@ -1343,7 +1345,7 @@ static VALUE rb_hash_each_key(VALUE hash) { - RETURN_ENUMERATOR(hash, 0, 0); + RETURN_SIZED_ENUMERATOR(hash, 0, 0, rb_hash_size); rb_hash_foreach(hash, each_key_i, 0); return hash; } @@ -1380,7 +1382,7 @@ static VALUE rb_hash_each_pair(VALUE hash) { - RETURN_ENUMERATOR(hash, 0, 0); + RETURN_SIZED_ENUMERATOR(hash, 0, 0, rb_hash_size); rb_hash_foreach(hash, each_pair_i, 0); return hash; } Index: test/ruby/test_enumerator.rb =================================================================== --- test/ruby/test_enumerator.rb (revision 37510) +++ test/ruby/test_enumerator.rb (revision 37511) @@ -443,6 +443,13 @@ assert_equal 42, @sized.each_with_object(nil).size end + def test_size_for_enum_created_from_hash + h = {a: 1, b: 2, c: 3} + %i[delete_if reject! select select! keep_if each each_key each_pair].each do |method| + assert_equal 3, h.send(method).size + end + end + def check_consistency_for_combinatorics(method) [ [], [:a, :b, :c, :d, :e] ].product([-2, 0, 2, 5, 6]) do |array, arg| assert_equal array.send(method, arg).to_a.size, array.send(method, arg).size, -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/