From 8d9896c3b98aba5eb86a4b9405bc661658cb0a80 Mon Sep 17 00:00:00 2001 From: tadf Date: Sun, 12 Jul 2009 14:57:42 +0000 Subject: * complex.c: added some shortcuts. * rational.c: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@24055 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- rational.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'rational.c') diff --git a/rational.c b/rational.c index d5a87f6b36..a9e60ebc09 100644 --- a/rational.c +++ b/rational.c @@ -166,8 +166,18 @@ f_negative_p(VALUE x) inline static VALUE f_zero_p(VALUE x) { - if (FIXNUM_P(x)) + switch (TYPE(x)) { + case T_FIXNUM: return f_boolcast(FIX2LONG(x) == 0); + case T_BIGNUM: + return Qfalse; + case T_RATIONAL: + { + VALUE num = RRATIONAL(x)->num; + + return f_boolcast(FIXNUM_P(num) && FIX2LONG(num) == 0); + } + } return rb_funcall(x, id_eqeq_p, 1, ZERO); } @@ -176,8 +186,20 @@ f_zero_p(VALUE x) inline static VALUE f_one_p(VALUE x) { - if (FIXNUM_P(x)) + switch (TYPE(x)) { + case T_FIXNUM: return f_boolcast(FIX2LONG(x) == 1); + case T_BIGNUM: + return Qfalse; + case T_RATIONAL: + { + VALUE num = RRATIONAL(x)->num; + VALUE den = RRATIONAL(x)->den; + + return f_boolcast(FIXNUM_P(num) && FIX2LONG(num) == 1 && + FIXNUM_P(den) && FIX2LONG(den) == 1); + } + } return rb_funcall(x, id_eqeq_p, 1, ONE); } @@ -846,6 +868,10 @@ nurat_div(VALUE self, VALUE other) { get_dat2(self, other); + if (f_one_p(self)) + return f_rational_new_no_reduce2(CLASS_OF(self), + bdat->den, bdat->num); + return f_muldiv(self, adat->num, adat->den, bdat->num, bdat->den, '/'); -- cgit v1.2.3