From a973f9698fe0045e3fd494ebb9f85c2f686a9ed9 Mon Sep 17 00:00:00 2001 From: matz Date: Wed, 15 Jan 2003 08:07:41 +0000 Subject: * enum.c (enum_all): now works without block. * enum.c (enum_any): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3344 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- enum.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) (limited to 'enum.c') diff --git a/enum.c b/enum.c index 24b6e9e065..f4402926cc 100644 --- a/enum.c +++ b/enum.c @@ -287,7 +287,7 @@ enum_sort_by(obj) } static VALUE -all_i(i, memo) +all_iter_i(i, memo) VALUE i; NODE *memo; { @@ -298,6 +298,18 @@ all_i(i, memo) return Qnil; } +static VALUE +all_i(i, memo) + VALUE i; + NODE *memo; +{ + if (!RTEST(i)) { + memo->u1.value = Qfalse; + rb_iter_break(); + } + return Qnil; +} + static VALUE enum_all(obj) VALUE obj; @@ -306,14 +318,14 @@ enum_all(obj) NODE *memo = rb_node_newnode(NODE_MEMO, Qnil, 0, 0); memo->u1.value = Qtrue; - rb_iterate(rb_each, obj, all_i, (VALUE)memo); + rb_iterate(rb_each, obj, rb_block_given_p() ? all_iter_i : all_i, (VALUE)memo); result = memo->u1.value; rb_gc_force_recycle((VALUE)memo); return result; } static VALUE -any_i(i, memo) +any_iter_i(i, memo) VALUE i; NODE *memo; { @@ -324,6 +336,18 @@ any_i(i, memo) return Qnil; } +static VALUE +any_i(i, memo) + VALUE i; + NODE *memo; +{ + if (RTEST(i)) { + memo->u1.value = Qtrue; + rb_iter_break(); + } + return Qnil; +} + static VALUE enum_any(obj) VALUE obj; @@ -332,7 +356,7 @@ enum_any(obj) NODE *memo = rb_node_newnode(NODE_MEMO, Qnil, 0, 0); memo->u1.value = Qfalse; - rb_iterate(rb_each, obj, any_i, (VALUE)memo); + rb_iterate(rb_each, obj, rb_block_given_p() ? any_iter_i : any_i, (VALUE)memo); result = memo->u1.value; rb_gc_force_recycle((VALUE)memo); return result; -- cgit v1.2.3