X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=flower%2Finclude%2Frational.hh;h=8583de70e2982368077d2b6575ea112a705a0ffe;hb=9e781b7dc83b60a543ce218aa1a5f139f74c760f;hp=69a9ab1bd20b429bfe6e2f38739b096c8218409d;hpb=bc1e5cfa4aef13a1b9bd2d251dd9cb25dbaf9d03;p=lilypond.git diff --git a/flower/include/rational.hh b/flower/include/rational.hh index 69a9ab1bd2..8583de70e2 100644 --- a/flower/include/rational.hh +++ b/flower/include/rational.hh @@ -1,25 +1,34 @@ /* - rational.hh -- declare rational helpers + This file is part of LilyPond, the GNU music typesetter. - source file of the Flower Library + Copyright (C) 1997--2014 Han-Wen Nienhuys - (c) 1997--2000 Han-Wen Nienhuys -*/ + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ #ifndef RATIONAL_HH #define RATIONAL_HH - -#include "compare.hh" -#include "arithmetic-operator.hh" #include "flower-proto.hh" -class String; +#include "std-string.hh" +#include /** Rational numbers. Included is support for + and - infinity. - */ -class Rational { +*/ +class Rational +{ /** Sign of rational. -2, .. 2 @@ -27,70 +36,84 @@ 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 (); + U64 num_, den_; + 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_; } - int num_i () const { return sign_ * num_; } - int den_i () const { return den_; } + I64 numerator () const { return sign_ * num_; } + I64 denominator () const { return den_; } + I64 num () const { return numerator (); } + I64 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; + int to_int () const; + + operator double () const { return to_double (); } + double to_double () const; + Rational operator - () const; /** - Initialize to 0. - */ + Initialize to 0. + */ Rational (); - Rational (int, int =1); - Rational (double); - Rational (Rational const&r) { copy (r);} + Rational (int); + Rational (I64); + Rational (U64); + explicit Rational (I64, I64); + 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); Rational &operator -= (Rational); Rational &operator %= (Rational); - static int compare (Rational const&, Rational const&); + static int compare (Rational const &, Rational const &); int sign () const; - String str () const; + string to_string () const; }; +#include "arithmetic-operator.hh" + IMPLEMENT_ARITHMETIC_OPERATOR (Rational, / ); -IMPLEMENT_ARITHMETIC_OPERATOR (Rational, + ); -IMPLEMENT_ARITHMETIC_OPERATOR (Rational, * ); -IMPLEMENT_ARITHMETIC_OPERATOR (Rational, - ); +IMPLEMENT_ARITHMETIC_OPERATOR (Rational, +); +IMPLEMENT_ARITHMETIC_OPERATOR (Rational, *); +IMPLEMENT_ARITHMETIC_OPERATOR (Rational, -); IMPLEMENT_ARITHMETIC_OPERATOR (Rational, % ); -INSTANTIATE_COMPARE (Rational const&, Rational::compare); +INSTANTIATE_COMPARE (Rational const &, Rational::compare); -int compare (Rational const&,Rational const&); +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; +const Rational infinity_rat (U64_MAX); #endif // RATIONAL_HH