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

ruby-changes:25464

From: marcandre <ko1@a...>
Date: Wed, 7 Nov 2012 02:16:10 +0900 (JST)
Subject: [ruby-changes:25464] marcandRe: r37521 (trunk): * enumerator.c: Support for lazy.size

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

  New Revision: 37521

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

  Log:
    * enumerator.c: Support for lazy.size
      [Feature #6636]

  Modified files:
    trunk/enumerator.c
    trunk/test/ruby/test_lazy_enumerator.rb

Index: enumerator.c
===================================================================
--- enumerator.c	(revision 37520)
+++ enumerator.c	(revision 37521)
@@ -104,7 +104,7 @@
  */
 VALUE rb_cEnumerator;
 VALUE rb_cLazy;
-static ID id_rewind, id_each, id_new, id_initialize, id_yield, id_call;
+static ID id_rewind, id_each, id_new, id_initialize, id_yield, id_call, id_size;
 static ID id_eqq, id_next, id_result, id_lazy, id_receiver, id_arguments, id_method;
 static VALUE sym_each, sym_cycle;
 
@@ -1240,6 +1240,23 @@
 
 /* Lazy Enumerator methods */
 static VALUE
+lazy_receiver_size(VALUE self)
+{
+    VALUE r = rb_check_funcall(rb_ivar_get(self, id_receiver), id_size, 0, 0);
+    return (r == Qundef) ? Qnil : r;
+}
+
+static VALUE
+lazy_size(VALUE self)
+{
+    struct enumerator *e = enumerator_ptr(self);
+    if (e->size_fn) {
+	return (*e->size_fn)(self);
+    }
+    return Qnil;
+}
+
+static VALUE
 lazy_init_iterator(VALUE val, VALUE m, int argc, VALUE *argv)
 {
     VALUE result;
@@ -1313,7 +1330,7 @@
     rb_block_call(generator, id_initialize, 0, 0,
 		  (rb_block_given_p() ? lazy_init_block_i : lazy_init_block),
 		  obj);
-    enumerator_init(self, generator, meth, argc - offset, argv + offset, 0, Qnil);
+    enumerator_init(self, generator, meth, argc - offset, argv + offset, lazy_receiver_size, Qnil);
     rb_ivar_set(self, id_receiver, obj);
 
     return self;
@@ -1820,6 +1837,7 @@
     rb_define_method(rb_cLazy, "flat_map", lazy_flat_map, 0);
     rb_define_method(rb_cLazy, "collect_concat", lazy_flat_map, 0);
     rb_define_method(rb_cLazy, "select", lazy_select, 0);
+    rb_define_method(rb_cLazy, "size", lazy_size, 0);
     rb_define_method(rb_cLazy, "find_all", lazy_select, 0);
     rb_define_method(rb_cLazy, "reject", lazy_reject, 0);
     rb_define_method(rb_cLazy, "grep", lazy_grep, 1);
@@ -1860,6 +1878,7 @@
     id_rewind = rb_intern("rewind");
     id_each = rb_intern("each");
     id_call = rb_intern("call");
+    id_size = rb_intern("size");
     id_yield = rb_intern("yield");
     id_new = rb_intern("new");
     id_initialize = rb_intern("initialize");
Index: test/ruby/test_lazy_enumerator.rb
===================================================================
--- test/ruby/test_lazy_enumerator.rb	(revision 37520)
+++ test/ruby/test_lazy_enumerator.rb	(revision 37521)
@@ -323,4 +323,10 @@
 #<Enumerator::Lazy: #<Enumerator::Lazy: #<Enumerator::Lazy: #<Enumerator::Lazy: #<Enumerator::Lazy: #<Enumerator::Lazy: #<Enumerator::Lazy: #<Enumerator::Lazy: #<Enumerator::Lazy: #<Enumerator::Lazy: #<Enumerator::Lazy: #<Enumerator::Lazy: #<Enumerator::Lazy: #<Enumerator::Lazy: #<Enumerator::Lazy: 1..10>:map>:collect>:flat_map>:collect_concat>:select>:find_all>:reject>:grep(1)>:zip("a".."c")>:take(10)>:take_while>:drop(3)>:drop_while>:cycle(3)>
 EOS
   end
+
+  def test_size
+    lazy = [1, 2, 3].lazy
+    assert_equal 3, lazy.size
+    assert_equal 42, Enumerator.new(42){}.lazy.size
+  end
 end

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

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