X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=flower%2Frational.cc;h=2d3195514a555f2b0fc10d8da67cd49cb76eb4ff;hb=085f80bad751ed2ab6f146884271ade8633389e0;hp=11aaf1e23b6ce457df53985ca52e62e7143d7708;hpb=f374663d1f993ba98c784afc6df1c9b50ba8fcc7;p=lilypond.git diff --git a/flower/rational.cc b/flower/rational.cc index 11aaf1e23b..2d3195514a 100644 --- a/flower/rational.cc +++ b/flower/rational.cc @@ -3,12 +3,14 @@ source file of the Flower Library - (c) 1997--2000 Han-Wen Nienhuys + (c) 1997--2004 Han-Wen Nienhuys */ -#include -#include + #include "rational.hh" -#include "string.hh" + +#include +#include + #include "string-convert.hh" #include "libc-extension.hh" @@ -17,12 +19,15 @@ Rational::operator double () const return (double)sign_ * num_ / den_; } +#ifdef STREAM_SUPPORT ostream & operator << (ostream &o, Rational r) { - o << r.str (); + o << r.string (); return o; } +#endif + Rational Rational::trunc_rat () const @@ -63,11 +68,13 @@ int gcd (int a, int b) return b; } +#if 0 static int lcm (int a, int b) { return abs (a*b / gcd (a,b)); } +#endif void Rational::set_infinite (int s) @@ -138,18 +145,13 @@ Rational::compare (Rational const &r, Rational const &s) return -1; else if (r.sign_ > s.sign_) return 1; - else if (r.infty_b ()) + else if (r.is_infinity ()) return 0; else if (r.sign_ == 0) return 0; else { - /* - TODO: fix this code; (r-s).sign() is too expensive. - - return r.sign_ * ::sign (r.num_ * s.den_ - s.num_ * r.den_); - */ - return (r - s).sign (); + return r.sign_ * ::sign (int (r.num_ * s.den_) - int (s.num_ * r.den_)); } } @@ -169,9 +171,9 @@ Rational::operator %= (Rational r) Rational & Rational::operator += (Rational r) { - if (infty_b ()) + if (is_infinity ()) ; - else if (r.infty_b ()) + else if (r.is_infinity ()) { *this = r; } @@ -242,7 +244,7 @@ Rational & Rational::operator *= (Rational r) { sign_ *= ::sign (r.sign_); - if (r.infty_b ()) + if (r.is_infinity ()) { sign_ = sign () * 2; goto exit_func; @@ -276,27 +278,18 @@ Rational::operator -= (Rational r) return (*this += r); } -/* - be paranoid about overiding libg++ stuff - */ -Rational & -Rational::operator = (Rational const &r) -{ - copy (r); - return *this; -} - String -Rational::str () const +Rational::to_string () const { - if (infty_b ()) + if (is_infinity ()) { String s (sign_ > 0 ? "" : "-" ); return String (s + "infinity"); } - String s = to_str (num ()); + + String s = ::to_string (num ()); if (den () != 1 && num ()) - s += "/" + to_str (den ()); + s += "/" + ::to_string (den ()); return s; } @@ -311,3 +304,9 @@ sign (Rational r) { return r.sign (); } + +bool +Rational::is_infinity () const +{ + return sign_ == 2 || sign_ == -2; +}