[前][次][番号順一覧][スレッド一覧]

ruby-changes:12071

From: tadf <ko1@a...>
Date: Fri, 19 Jun 2009 09:31:27 +0900 (JST)
Subject: [ruby-changes:12071] Ruby:r23741 (trunk): * numeric.c (*_numerator,*_denominator): moved to rational.c.

tadf	2009-06-19 09:31:08 +0900 (Fri, 19 Jun 2009)

  New Revision: 23741

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=23741

  Log:
    * numeric.c (*_numerator,*_denominator): moved to rational.c.
    * rational.c (*_numerator,*_denominator): moved from numeric.c.

  Modified files:
    trunk/ChangeLog
    trunk/numeric.c
    trunk/rational.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 23740)
+++ ChangeLog	(revision 23741)
@@ -1,3 +1,9 @@
+Fri Jun 19 09:28:45 2009  Tadayoshi Funaba  <tadf@d...>
+
+	* numeric.c (*_numerator,*_denominator): moved to rational.c.
+
+	* rational.c (*_numerator,*_denominator): moved from numeric.c.
+
 Fri Jun 19 08:14:07 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* bignum.c (big_lshift, big_rshift): return Bignum always withou
Index: numeric.c
===================================================================
--- numeric.c	(revision 23740)
+++ numeric.c	(revision 23741)
@@ -1384,24 +1384,6 @@
     return LONG2FIX(val);
 }
 
-static VALUE
-flo_numerator(VALUE num)
-{
-    double d = RFLOAT_VALUE(num);
-    if (isinf(d) || isnan(d))
-	return num;
-    return rb_call_super(0, 0);
-}
-
-static VALUE
-flo_denominator(VALUE num)
-{
-    double d = RFLOAT_VALUE(num);
-    if (isinf(d) || isnan(d))
-	return INT2FIX(1);
-    return rb_call_super(0, 0);
-}
-
 /*
  *  call-seq:
  *     num.floor    => integer
@@ -1789,20 +1771,6 @@
 
 #endif  /* HAVE_LONG_LONG */
 
-static VALUE
-num_numerator(VALUE num)
-{
-    return rb_funcall(rb_funcall(num, rb_intern("to_r"), 0),
-		      rb_intern("numerator"), 0);
-}
-
-static VALUE
-num_denominator(VALUE num)
-{
-    return rb_funcall(rb_funcall(num, rb_intern("to_r"), 0),
-		      rb_intern("denominator"), 0);
-}
-
 /*
  * Document-class: Integer
  *
@@ -2006,18 +1974,6 @@
     return num;
 }
 
-static VALUE
-int_numerator(VALUE num)
-{
-    return num;
-}
-
-static VALUE
-int_denominator(VALUE num)
-{
-    return INT2FIX(1);
-}
-
 /********************************************************************
  *
  * Document-class: Fixnum
@@ -3190,9 +3146,6 @@
     rb_define_method(rb_cNumeric, "truncate", num_truncate, 0);
     rb_define_method(rb_cNumeric, "step", num_step, -1);
 
-    rb_define_method(rb_cNumeric, "numerator", num_numerator, 0);
-    rb_define_method(rb_cNumeric, "denominator", num_denominator, 0);
-
     rb_cInteger = rb_define_class("Integer", rb_cNumeric);
     rb_undef_alloc_func(rb_cInteger);
     rb_undef_method(CLASS_OF(rb_cInteger), "new");
@@ -3215,9 +3168,6 @@
     rb_define_method(rb_cInteger, "truncate", int_to_i, 0);
     rb_define_method(rb_cInteger, "round", int_round, -1);
 
-    rb_define_method(rb_cInteger, "numerator", int_numerator, 0);
-    rb_define_method(rb_cInteger, "denominator", int_denominator, 0);
-
     rb_cFixnum = rb_define_class("Fixnum", rb_cInteger);
 
     rb_define_method(rb_cFixnum, "to_s", fix_to_s, -1);
@@ -3310,9 +3260,6 @@
     rb_define_method(rb_cFloat, "round", flo_round, -1);
     rb_define_method(rb_cFloat, "truncate", flo_truncate, 0);
 
-    rb_define_method(rb_cFloat, "numerator", flo_numerator, 0);
-    rb_define_method(rb_cFloat, "denominator", flo_denominator, 0);
-
     rb_define_method(rb_cFloat, "nan?",      flo_is_nan_p, 0);
     rb_define_method(rb_cFloat, "infinite?", flo_is_infinite_p, 0);
     rb_define_method(rb_cFloat, "finite?",   flo_is_finite_p, 0);
Index: rational.c
===================================================================
--- rational.c	(revision 23740)
+++ rational.c	(revision 23741)
@@ -1202,7 +1202,58 @@
     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)
 {
     return rb_rational_new1(INT2FIX(0));
@@ -1579,6 +1630,15 @@
     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);

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]