]> git.donarmstrong.com Git - lilypond.git/blob - flower/include/rational.hh
Merge master into nested-bookparts
[lilypond.git] / flower / include / rational.hh
1 /*
2   rational.hh -- declare rational helpers
3
4   source file of the Flower Library
5
6   (c) 1997--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
7 */
8
9 #ifndef RATIONAL_HH
10 #define RATIONAL_HH
11
12 #include "flower-proto.hh"
13 #include "std-string.hh"
14 #include <limits.h>
15
16 /**
17    Rational numbers.  Included is support for + and - infinity.
18 */
19 class Rational
20 {
21   /**
22      Sign of rational.
23      -2, .. 2
24
25      -2,2 is - and + infinity.
26      -1,1 is negative and positive.
27      0 if *this is zero.
28   */
29   int sign_;
30   U64 num_, den_;
31   void normalize ();
32   void copy (Rational const &);
33
34 public:
35   void set_infinite (int sign);
36   bool is_infinity () const;
37   void invert ();
38   I64 numerator () const { return sign_ * num_; }
39   I64 denominator () const { return den_; }
40   I64 num () const { return numerator (); }
41   I64 den () const { return denominator (); }
42
43   Rational trunc_rat () const;
44   Rational div_rat (Rational) const;
45   Rational mod_rat (Rational) const;
46   Rational abs () const;
47   void negate ();
48   int to_int () const;
49
50   operator double () const { return to_double (); }
51   double to_double () const;
52
53   Rational operator - () const;
54   /**
55      Initialize to 0.
56   */
57   Rational ();
58   Rational (int);
59   Rational (I64);
60   Rational (U64);
61   explicit Rational (I64, I64);
62   explicit Rational (double);
63   Rational (Rational const &r) { copy (r);}
64   Rational &operator = (Rational const &r)
65   {
66     copy (r); return *this;
67   }
68
69   Rational &operator *= (Rational);
70   Rational &operator /= (Rational);
71   Rational &operator += (Rational);
72   Rational &operator -= (Rational);
73   Rational &operator %= (Rational);
74   static int compare (Rational const &, Rational const &);
75   int sign () const;
76   string to_string () const;
77 };
78
79 #include "arithmetic-operator.hh"
80
81 IMPLEMENT_ARITHMETIC_OPERATOR (Rational, /);
82 IMPLEMENT_ARITHMETIC_OPERATOR (Rational, +);
83 IMPLEMENT_ARITHMETIC_OPERATOR (Rational, *);
84 IMPLEMENT_ARITHMETIC_OPERATOR (Rational, -);
85 IMPLEMENT_ARITHMETIC_OPERATOR (Rational, %);
86
87 INSTANTIATE_COMPARE (Rational const &, Rational::compare);
88
89 int compare (Rational const &, Rational const &);
90 int sign (Rational r);
91
92 inline void
93 Rational::copy (Rational const &r)
94 {
95   sign_ = r.sign_;
96   num_ = r.num_;
97   den_ = r.den_;
98 }
99
100 #if 0
101 ostream &
102 operator << (ostream &, Rational);
103 #endif
104
105 const Rational infinity_rat (U64_MAX);
106
107 #endif // RATIONAL_HH