-
Notifications
You must be signed in to change notification settings - Fork 0
/
IncrementalOperatorsBool.cs
99 lines (82 loc) · 2.66 KB
/
IncrementalOperatorsBool.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
using System;
namespace IncrementalLib
{
public partial class Incremental
{
/// <summary>
/// Equals operator for Incremental.
/// </summary>
public bool Equals(Incremental other)
{
return Value.Equals(other.Value) && Exponent == other.Exponent && Negative == other.Negative;
}
/// <inheritdoc />
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((Incremental)obj);
}
/// <inheritdoc />
public override int GetHashCode()
{
return HashCode.Combine(Value, Exponent, Negative);
}
/// <summary>
/// Returns true if the two Incrementals are equal.
/// </summary>
public static bool operator ==(Incremental a, Incremental b)
{
if (ReferenceEquals(a, b)) return true;
if (a is null || b is null) return false;
a.Normalize();
b.Normalize();
return a.Value.Equals(b.Value) && a.Exponent == b.Exponent && a.Negative == b.Negative;
}
/// <summary>
/// Returns true if the two Incrementals are not equal.
/// </summary>
public static bool operator !=(Incremental a, Incremental b)
{
return !(a == b);
}
/// <summary>
/// Returns true if <paramref name="a"/> is greater than <paramref name="b"/>.
/// </summary>
public static bool operator >(Incremental a, Incremental b)
{
if (a is null || b is null) return false;
a.Normalize();
b.Normalize();
// Simple comparison for different signs
if (a.Negative && !b.Negative) return false;
if (!a.Negative && b.Negative) return true;
bool negative = a.Negative && b.Negative;
if (a.Exponent > b.Exponent) return !negative;
if (a.Exponent < b.Exponent) return negative;
return negative ? a.Value < b.Value : a.Value > b.Value;
}
/// <summary>
/// Returns true if <paramref name="a"/> is less than <paramref name="b"/>.
/// </summary>
public static bool operator <(Incremental a, Incremental b)
{
return a != b && !(a > b);
}
/// <summary>
/// Returns true if <paramref name="a"/> is greater than or equal to <paramref name="b"/>.
/// </summary>
public static bool operator >=(Incremental a, Incremental b)
{
return a == b || a > b;
}
/// <summary>
/// Returns true if <paramref name="a"/> is less than or equal to <paramref name="b"/>.
/// </summary>
public static bool operator <=(Incremental a, Incremental b)
{
return a == b || a < b;
}
}
}