6
6
//
7
7
// ===----------------------------------------------------------------------===//
8
8
//
9
- // This is a simple class to represent fractions. It supports multiplication ,
9
+ // This is a simple class to represent fractions. It supports arithmetic ,
10
10
// comparison, floor, and ceiling operations.
11
11
//
12
12
// ===----------------------------------------------------------------------===//
@@ -30,15 +30,15 @@ struct Fraction {
30
30
Fraction () = default ;
31
31
32
32
// / Construct a Fraction from a numerator and denominator.
33
- Fraction (const MPInt &oNum, const MPInt &oDen) : num(oNum), den(oDen) {
33
+ Fraction (const MPInt &oNum, const MPInt &oDen = MPInt( 1 ) ) : num(oNum), den(oDen) {
34
34
if (den < 0 ) {
35
35
num = -num;
36
36
den = -den;
37
37
}
38
38
}
39
39
// / Overloads for passing literals.
40
- Fraction (const MPInt &num, int64_t den) : Fraction(num, MPInt(den)) {}
41
- Fraction (int64_t num, const MPInt &den) : Fraction(MPInt(num), den) {}
40
+ Fraction (const MPInt &num, int64_t den = 1 ) : Fraction(num, MPInt(den)) {}
41
+ Fraction (int64_t num, const MPInt &den = MPInt( 1 ) ) : Fraction(MPInt(num), den) {}
42
42
Fraction (int64_t num, int64_t den) : Fraction(MPInt(num), MPInt(den)) {}
43
43
44
44
// Return the value of the fraction as an integer. This should only be called
@@ -48,6 +48,10 @@ struct Fraction {
48
48
return num / den;
49
49
}
50
50
51
+ llvm::raw_ostream &print (llvm::raw_ostream &os) const {
52
+ return os << " (" << num << " /" << den << " )" ;
53
+ }
54
+
51
55
// / The numerator and denominator, respectively. The denominator is always
52
56
// / positive.
53
57
MPInt num{0 }, den{1 };
@@ -160,6 +164,23 @@ inline llvm::raw_ostream &operator<<(llvm::raw_ostream &os, const Fraction &x) {
160
164
return os;
161
165
}
162
166
167
+ inline Fraction operator /(const Fraction &x, const Fraction &y) {
168
+ return Fraction (x.num * y.den , x.den * y.num );
169
+ }
170
+
171
+ inline Fraction operator +(const Fraction &x, const Fraction &y) {
172
+ return Fraction (x.num * y.den + x.den * y.num , x.den * y.den );
173
+ }
174
+
175
+ inline Fraction operator -(const Fraction &x, const Fraction &y) {
176
+ return Fraction (x.num * y.den - x.den * y.num , x.den * y.den );
177
+ }
178
+
179
+ inline llvm::raw_ostream &operator <<(llvm::raw_ostream &os, const Fraction &x) {
180
+ x.print (os);
181
+ return os;
182
+ }
183
+
163
184
} // namespace presburger
164
185
} // namespace mlir
165
186
0 commit comments