blob: 61b0915e559ec6dcc41bbbaa432e8537e47000ad [file] [log] [blame]
//===- Fraction.h - MLIR Fraction Class -------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This is a simple class to represent fractions. It supports multiplication,
// comparison, floor, and ceiling operations.
//
//===----------------------------------------------------------------------===//
#ifndef MLIR_ANALYSIS_PRESBURGER_FRACTION_H
#define MLIR_ANALYSIS_PRESBURGER_FRACTION_H
#include "mlir/Support/MathExtras.h"
namespace mlir {
/// A class to represent fractions. The sign of the fraction is represented
/// in the sign of the numerator; the denominator is always positive.
///
/// Note that overflows may occur if the numerator or denominator are not
/// representable by 64-bit integers.
struct Fraction {
/// Default constructor initializes the represented rational number to zero.
Fraction() : num(0), den(1) {}
/// Construct a Fraction from a numerator and denominator.
Fraction(int64_t oNum, int64_t oDen) : num(oNum), den(oDen) {
if (den < 0) {
num = -num;
den = -den;
}
}
/// The numerator and denominator, respectively. The denominator is always
/// positive.
int64_t num, den;
};
/// Three-way comparison between two fractions.
/// Returns +1, 0, and -1 if the first fraction is greater than, equal to, or
/// less than the second fraction, respectively.
inline int compare(Fraction x, Fraction y) {
int64_t diff = x.num * y.den - y.num * x.den;
if (diff > 0)
return +1;
if (diff < 0)
return -1;
return 0;
}
inline int64_t floor(Fraction f) { return floorDiv(f.num, f.den); }
inline int64_t ceil(Fraction f) { return ceilDiv(f.num, f.den); }
inline Fraction operator-(Fraction x) { return Fraction(-x.num, x.den); }
inline bool operator<(Fraction x, Fraction y) { return compare(x, y) < 0; }
inline bool operator<=(Fraction x, Fraction y) { return compare(x, y) <= 0; }
inline bool operator==(Fraction x, Fraction y) { return compare(x, y) == 0; }
inline bool operator!=(Fraction x, Fraction y) { return compare(x, y) != 0; }
inline bool operator>(Fraction x, Fraction y) { return compare(x, y) > 0; }
inline bool operator>=(Fraction x, Fraction y) { return compare(x, y) >= 0; }
inline Fraction operator*(Fraction x, Fraction y) {
return Fraction(x.num * y.num, x.den * y.den);
}
} // namespace mlir
#endif // MLIR_ANALYSIS_PRESBURGER_FRACTION_H