| | 1 | | namespace SharpFractions; |
| | 2 | |
|
| | 3 | | public readonly partial struct Fraction : IComparable<Fraction>, IEquatable<Fraction> |
| | 4 | | { |
| 1 | 5 | | public static bool operator == (Fraction frac1, Fraction frac2) => Compare(frac1, frac2) == 0; |
| 1 | 6 | | public static bool operator != (Fraction frac1, Fraction frac2) => Compare(frac1, frac2) != 0; |
| 1 | 7 | | public static bool operator < (Fraction frac1, Fraction frac2) => Compare(frac1, frac2) == -1; |
| 1 | 8 | | public static bool operator > (Fraction frac1, Fraction frac2) => Compare(frac1, frac2) == 1; |
| 1 | 9 | | public static bool operator <= (Fraction frac1, Fraction frac2) => Compare(frac1, frac2) != 1; |
| 1 | 10 | | public static bool operator >= (Fraction frac1, Fraction frac2) => Compare(frac1, frac2) != -1; |
| | 11 | |
|
| | 12 | | public override bool Equals([NotNullWhen(true)] object? obj) |
| 2 | 13 | | { |
| 3 | 14 | | if (obj is null) return false; |
| 2 | 15 | | if (obj is not Fraction frac) return false; |
| 0 | 16 | | return Compare(this, frac) == 0; |
| 2 | 17 | | } |
| | 18 | |
|
| | 19 | | /// <summary> |
| | 20 | | /// All value comparisons call this method. |
| | 21 | | /// </summary> |
| | 22 | | /// <returns> |
| | 23 | | /// 1 if frac1 > frac2, -1 if frac2 > frac1, 0 if equal |
| | 24 | | /// </returns> |
| | 25 | | public static int Compare(Fraction frac1, Fraction frac2) |
| 30 | 26 | | { |
| 30 | 27 | | (frac1, frac2) = PutOnCommonDenominator(frac1, frac2); |
| | 28 | |
|
| 36 | 29 | | if (frac1.Numerator > frac2.Numerator) return 1; |
| 25 | 30 | | if (frac1.Numerator < frac2.Numerator) return -1; |
| 23 | 31 | | return 0; |
| 30 | 32 | | } |
| | 33 | |
|
| 1 | 34 | | public int CompareTo(Fraction other) => Compare(this, other); |
| 21 | 35 | | public bool Equals(Fraction other) => Compare(this, other) == 0; |
| 2 | 36 | | public override int GetHashCode() => (Numerator, Denominator).GetHashCode(); |
| | 37 | | } |