From 7bb06e7e9a44a6018214df04f4fced2ca55e8fdf Mon Sep 17 00:00:00 2001 From: matz Date: Thu, 21 Sep 2006 06:09:26 +0000 Subject: * numeric.c (int_odd_p): a new method to check even or odd. [RCR#337] * numeric.c (int_even_p): ditto. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@10982 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ numeric.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/ChangeLog b/ChangeLog index 306a5535b..32c1d143b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Thu Sep 21 15:06:24 2006 Yukihiro Matsumoto + + * numeric.c (int_odd_p): a new method to check even or odd. + [RCR#337] + + * numeric.c (int_even_p): ditto. + Thu Sep 21 13:55:07 2006 Yukihiro Matsumoto * ext/etc/etc.c (etc_getpwuid): uid integer should be wraped in diff --git a/numeric.c b/numeric.c index cab949bab..5f0e10f64 100644 --- a/numeric.c +++ b/numeric.c @@ -1698,6 +1698,38 @@ int_int_p(VALUE num) return Qtrue; } +/* + * call-seq: + * int.odd? -> true or false + * + * Returns true if int is an odd number. + */ + +static VALUE +int_odd_p(VALUE num) +{ + if (rb_funcall(num, '%', 1, INT2FIX(2)) != INT2FIX(0)) { + return Qtrue; + } + return Qfalse; +} + +/* + * call-seq: + * int.even? -> true or false + * + * Returns true if int is an even number. + */ + +static VALUE +int_even_p(VALUE num) +{ + if (rb_funcall(num, '%', 1, INT2FIX(2)) == INT2FIX(0)) { + return Qtrue; + } + return Qfalse; +} + /* * call-seq: * int.next => integer @@ -2799,6 +2831,38 @@ fix_zero_p(VALUE num) return Qfalse; } +/* + * call-seq: + * fix.odd? -> true or false + * + * Returns true if fix is an odd number. + */ + +static VALUE +fix_odd_p(VALUE num) +{ + if (num & 2) { + return Qtrue; + } + return Qfalse; +} + +/* + * call-seq: + * fix.even? -> true or false + * + * Returns true if fix is an even number. + */ + +static VALUE +fix_even_p(VALUE num) +{ + if (num & 2) { + return Qfalse; + } + return Qtrue; +} + void Init_Numeric(void) { @@ -2853,6 +2917,8 @@ Init_Numeric(void) rb_undef_method(CLASS_OF(rb_cInteger), "new"); rb_define_method(rb_cInteger, "integer?", int_int_p, 0); + rb_define_method(rb_cInteger, "odd?", int_odd_p, 0); + rb_define_method(rb_cInteger, "even?", int_even_p, 0); rb_define_method(rb_cInteger, "upto", int_upto, 1); rb_define_method(rb_cInteger, "downto", int_downto, 1); rb_define_method(rb_cInteger, "times", int_dotimes, 0); @@ -2910,6 +2976,8 @@ Init_Numeric(void) rb_define_method(rb_cFixnum, "to_f", fix_to_f, 0); rb_define_method(rb_cFixnum, "size", fix_size, 0); rb_define_method(rb_cFixnum, "zero?", fix_zero_p, 0); + rb_define_method(rb_cInteger, "odd?", fix_odd_p, 0); + rb_define_method(rb_cInteger, "even?", fix_even_p, 0); rb_cFloat = rb_define_class("Float", rb_cNumeric); -- cgit