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

ruby-changes:25456

From: marcandre <ko1@a...>
Date: Wed, 7 Nov 2012 02:14:13 +0900 (JST)
Subject: [ruby-changes:25456] marcandRe: r37513 (trunk): * struct.c: Support for Struct's enumerators #size

marcandre	2012-11-07 02:14:02 +0900 (Wed, 07 Nov 2012)

  New Revision: 37513

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

  Log:
    * struct.c: Support for Struct's enumerators #size
      [Feature #6636]

  Modified files:
    trunk/struct.c
    trunk/test/ruby/test_enumerator.rb

Index: struct.c
===================================================================
--- struct.c	(revision 37512)
+++ struct.c	(revision 37513)
@@ -429,6 +429,9 @@
     return rb_class_new_instance(size, mem, klass);
 }
 
+static VALUE
+rb_struct_size(VALUE s);
+
 /*
  *  call-seq:
  *     struct.each {|obj| block }  -> struct
@@ -455,7 +458,7 @@
 {
     long i;
 
-    RETURN_ENUMERATOR(s, 0, 0);
+    RETURN_SIZED_ENUMERATOR(s, 0, 0, rb_struct_size);
     for (i=0; i<RSTRUCT_LEN(s); i++) {
 	rb_yield(RSTRUCT_PTR(s)[i]);
     }
@@ -489,7 +492,7 @@
     VALUE members;
     long i;
 
-    RETURN_ENUMERATOR(s, 0, 0);
+    RETURN_SIZED_ENUMERATOR(s, 0, 0, rb_struct_size);
     members = rb_struct_members(s);
     for (i=0; i<RSTRUCT_LEN(s); i++) {
 	rb_yield_values(2, rb_ary_entry(members, i), RSTRUCT_PTR(s)[i]);
@@ -793,7 +796,7 @@
     long i;
 
     rb_check_arity(argc, 0, 0);
-    RETURN_ENUMERATOR(s, 0, 0);
+    RETURN_SIZED_ENUMERATOR(s, 0, 0, rb_struct_size);
     result = rb_ary_new();
     for (i = 0; i < RSTRUCT_LEN(s); i++) {
 	if (RTEST(rb_yield(RSTRUCT_PTR(s)[i]))) {
Index: test/ruby/test_enumerator.rb
===================================================================
--- test/ruby/test_enumerator.rb	(revision 37512)
+++ test/ruby/test_enumerator.rb	(revision 37513)
@@ -456,6 +456,13 @@
     end
   end
 
+  def test_size_for_enum_created_from_struct
+    s = Struct.new(:foo, :bar, :baz).new(1, 2)
+    %i[each each_pair select].each do |method|
+      assert_equal 3, s.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/

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