summaryrefslogtreecommitdiff
path: root/rational.c
diff options
context:
space:
mode:
authortadf <tadf@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-06-19 00:31:08 +0000
committertadf <tadf@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-06-19 00:31:08 +0000
commit5134783cdef392aa47692f95427affe4fd59c6fa (patch)
treedc8c74edaca22d9045dcf662fb4ac3ad5295bc17 /rational.c
parent44a1d99635cde200a09e9d6c1667b7b9c1a327f2 (diff)
* numeric.c (*_numerator,*_denominator): moved to rational.c.
* rational.c (*_numerator,*_denominator): moved from numeric.c. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@23741 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'rational.c')
-rw-r--r--rational.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/rational.c b/rational.c
index be441e01a2..ecc0752174 100644
--- a/rational.c
+++ b/rational.c
@@ -1202,6 +1202,57 @@ rb_Rational(VALUE x, VALUE y)
return nurat_s_convert(2, a, rb_cRational);
}
+#define id_numerator rb_intern("numerator")
+#define f_numerator(x) rb_funcall(x, id_numerator, 0)
+
+#define id_denominator rb_intern("denominator")
+#define f_denominator(x) rb_funcall(x, id_denominator, 0)
+
+#define id_to_r rb_intern("to_r")
+#define f_to_r(x) rb_funcall(x, id_to_r, 0)
+
+static VALUE
+numeric_numerator(VALUE self)
+{
+ return f_numerator(f_to_r(self));
+}
+
+static VALUE
+numeric_denominator(VALUE self)
+{
+ return f_denominator(f_to_r(self));
+}
+
+static VALUE
+integer_numerator(VALUE self)
+{
+ return self;
+}
+
+static VALUE
+integer_denominator(VALUE self)
+{
+ return INT2FIX(1);
+}
+
+static VALUE
+float_numerator(VALUE self)
+{
+ double d = RFLOAT_VALUE(self);
+ if (isinf(d) || isnan(d))
+ return self;
+ return rb_call_super(0, 0);
+}
+
+static VALUE
+float_denominator(VALUE self)
+{
+ double d = RFLOAT_VALUE(self);
+ if (isinf(d) || isnan(d))
+ return INT2FIX(1);
+ return rb_call_super(0, 0);
+}
+
static VALUE
nilclass_to_r(VALUE self)
{
@@ -1579,6 +1630,15 @@ Init_Rational(void)
rb_define_method(rb_cInteger, "lcm", rb_lcm, 1);
rb_define_method(rb_cInteger, "gcdlcm", rb_gcdlcm, 1);
+ rb_define_method(rb_cNumeric, "numerator", numeric_numerator, 0);
+ rb_define_method(rb_cNumeric, "denominator", numeric_denominator, 0);
+
+ rb_define_method(rb_cInteger, "numerator", integer_numerator, 0);
+ rb_define_method(rb_cInteger, "denominator", integer_denominator, 0);
+
+ rb_define_method(rb_cFloat, "numerator", float_numerator, 0);
+ rb_define_method(rb_cFloat, "denominator", float_denominator, 0);
+
rb_define_method(rb_cNilClass, "to_r", nilclass_to_r, 0);
rb_define_method(rb_cInteger, "to_r", integer_to_r, 0);
rb_define_method(rb_cFloat, "to_r", float_to_r, 0);