X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=flower%2Finclude%2Frational.hh;h=969d0121470db512f58f342046fd5293c735ad29;hb=84dfa31321b6f0c3224ed8c586b64ec97e88402f;hp=587a7f63f1612be4c912e90d57dacb5a4fb31b85;hpb=07ef2535c467fd25ed35ebdc53fde1d63d6323ec;p=lilypond.git diff --git a/flower/include/rational.hh b/flower/include/rational.hh index 587a7f63f1..969d012147 100644 --- a/flower/include/rational.hh +++ b/flower/include/rational.hh @@ -3,76 +3,102 @@ source file of the Flower Library - (c) 1997 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ - #ifndef RATIONAL_HH #define RATIONAL_HH -#if PARANOIA -#ifndef Rational -#define Rational MyRational -#endif -#endif +#include "std-string.hh" +#include -#include "compare.hh" -#include "arithmetic-operator.hh" -#include "fproto.hh" +/** + Rational numbers. Included is support for + and - infinity. +*/ +class Rational +{ + /** + Sign of rational. + -2, .. 2 -class Rational { + -2,2 is - and + infinity. + -1,1 is negative and positive. + 0 if *this is zero. + */ int sign_; unsigned int num_, den_; - void normalise (); + void normalize (); void copy (Rational const &); + public: void set_infinite (int sign); - bool infty_b () const; + bool is_infinity () const; void invert (); - int num () const { return sign_ * num_; } - int den () const { return den_; } - Rational truncated () const; + int numerator () const { return sign_ * num_; } + int denominator () const { return den_; } + int num () const { return numerator (); } + int den () const { return denominator (); } + + Rational trunc_rat () const; + Rational div_rat (Rational) const; + Rational mod_rat (Rational) const; + Rational abs () const; void negate (); - operator bool () const; - operator int () const; - operator double () const; - operator String () const; + int to_int () const; + + operator double () const { return to_double (); } + double to_double () const; + Rational operator - () const; + /** + Initialize to 0. + */ Rational (); - Rational (int, int =1); - Rational (double); - Rational (Rational const&); + Rational (int); + explicit Rational (int, int); + explicit Rational (double); + Rational (Rational const &r) { copy (r);} + Rational &operator = (Rational const &r) + { + copy (r); return *this; + } - Rational &operator = (Rational const &); Rational &operator *= (Rational); - Rational &operator /= (Rational); - Rational &operator += (Rational); - Rational &operator -= (Rational); - static int compare (Rational const&, Rational const&); + Rational &operator /= (Rational); + Rational &operator += (Rational); + Rational &operator -= (Rational); + Rational &operator %= (Rational); + static int compare (Rational const &, Rational const &); int sign () const; - String str () const; + string to_string () const; }; -IMPLEMENT_ARITHMETIC_OPERATOR (Rational, / ); -IMPLEMENT_ARITHMETIC_OPERATOR (Rational, + ); -IMPLEMENT_ARITHMETIC_OPERATOR (Rational, * ); -IMPLEMENT_ARITHMETIC_OPERATOR (Rational, - ); +#include "arithmetic-operator.hh" -INSTANTIATE_COMPARE (Rational const&, Rational::compare); +IMPLEMENT_ARITHMETIC_OPERATOR (Rational, /); +IMPLEMENT_ARITHMETIC_OPERATOR (Rational, +); +IMPLEMENT_ARITHMETIC_OPERATOR (Rational, *); +IMPLEMENT_ARITHMETIC_OPERATOR (Rational, -); +IMPLEMENT_ARITHMETIC_OPERATOR (Rational, %); -int compare (Rational const&,Rational const&); +INSTANTIATE_COMPARE (Rational const &, Rational::compare); + +int compare (Rational const &, Rational const &); int sign (Rational r); inline void -Rational::copy (Rational const&r) +Rational::copy (Rational const &r) { sign_ = r.sign_; num_ = r.num_; den_ = r.den_; } -class ostream; +#if 0 ostream & -operator << (ostream &, Rational); +operator << (ostream &, Rational); +#endif + +const Rational infinity_rat (INT_MAX); #endif // RATIONAL_HH