summaryrefslogtreecommitdiff
path: root/numeric.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-05 09:12:58 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-05 09:12:58 +0000
commit89dac0bc8cf7c40e0ddb626a4af5b3782905265d (patch)
tree1c43d6aa0fa7cd14d1290f00994e866ed76b64fc /numeric.c
parent727ae9a4f521251b7273a0edf4e4970960bbee27 (diff)
* numeric.c (int_odd_p): new method Integer#odd?.
(int_even_p): new method Integer#even?. (int_pred): new method Integer#pred. (fix_odd_p): new method Fixnum#odd?. (fix_even_p): new method Fixnum#even?. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@14111 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'numeric.c')
-rw-r--r--numeric.c99
1 files changed, 90 insertions, 9 deletions
diff --git a/numeric.c b/numeric.c
index 9d2c4508ac..b588081f23 100644
--- a/numeric.c
+++ b/numeric.c
@@ -1786,6 +1786,39 @@ int_int_p(num)
/*
* call-seq:
+ * int.odd? -> true or false
+ *
+ * Returns <code>true</code> if <i>int</i> 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 <code>true</code> if <i>int</i> 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
* int.succ => integer
*
@@ -1808,6 +1841,26 @@ int_succ(num)
/*
* call-seq:
+ * int.pred => integer
+ *
+ * Returns the <code>Integer</code> equal to <i>int</i> - 1.
+ *
+ * 1.pred #=> 0
+ * (-1).pred #=> -2
+ */
+
+static VALUE
+int_pred(VALUE num)
+{
+ if (FIXNUM_P(num)) {
+ long i = FIX2LONG(num) - 1;
+ return LONG2NUM(i);
+ }
+ return rb_funcall(num, '-', 1, INT2FIX(1));
+}
+
+/*
+ * call-seq:
* int.chr => string
*
* Returns a string containing the ASCII character represented by the
@@ -2262,15 +2315,6 @@ int_pow(x, y)
return LONG2NUM(z);
}
-static VALUE
-int_even_p(VALUE num)
-{
- if (rb_funcall(num, '%', 1, INT2FIX(2)) == INT2FIX(0)) {
- return Qtrue;
- }
- return Qfalse;
-}
-
/*
* call-seq:
* fix ** other => Numeric
@@ -2907,6 +2951,38 @@ fix_zero_p(num)
return Qfalse;
}
+/*
+ * call-seq:
+ * fix.odd? -> true or false
+ *
+ * Returns <code>true</code> if <i>fix</i> 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 <code>true</code> if <i>fix</i> is an even number.
+ */
+
+static VALUE
+fix_even_p(VALUE num)
+{
+ if (num & 2) {
+ return Qfalse;
+ }
+ return Qtrue;
+}
+
void
Init_Numeric()
{
@@ -2961,12 +3037,15 @@ Init_Numeric()
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);
rb_include_module(rb_cInteger, rb_mPrecision);
rb_define_method(rb_cInteger, "succ", int_succ, 0);
rb_define_method(rb_cInteger, "next", int_succ, 0);
+ rb_define_method(rb_cInteger, "pred", int_pred, 0);
rb_define_method(rb_cInteger, "chr", int_chr, 0);
rb_define_method(rb_cInteger, "ord", int_ord, 0);
rb_define_method(rb_cInteger, "to_i", int_to_i, 0);
@@ -3020,6 +3099,8 @@ Init_Numeric()
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_cFixnum, "odd?", fix_odd_p, 0);
+ rb_define_method(rb_cFixnum, "even?", fix_even_p, 0);
rb_cFloat = rb_define_class("Float", rb_cNumeric);