Skip to content

Commit 4b17f78

Browse files
author
LoneWandererProductions
committed
Convert Faction to struct
Remove absolute Dispose
1 parent c3d62a4 commit 4b17f78

3 files changed

Lines changed: 234 additions & 347 deletions

File tree

CommonLibraryTests/FractureTests.cs

Lines changed: 51 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,28 @@ public class FractureTests
2525
public void Fractures()
2626
{
2727
var one = new Fraction(14, 2);
28+
// 14/2 = 7/1
2829
Assert.AreEqual(7, one.Numerator, "Expected numerator to be 7 after simplification.");
2930
Assert.AreEqual(1, one.Denominator, "Expected denominator to be 1 after simplification.");
30-
Assert.AreEqual(0, one.Exponent, "Expected exponent to be 0.");
31-
Assert.AreEqual(7, one.ExponentNumerator, "Expected exponent numerator to be 7.");
32-
Assert.AreEqual(7, one.Decimal, "Expected decimal value to be 7.");
31+
Assert.AreEqual(7, one.WholePart, "Expected WholePart to be 7.");
32+
Assert.AreEqual(0, one.RemainderNumerator, "Expected RemainderNumerator to be 0.");
33+
Assert.AreEqual(7m, one.ToDecimal(), "Expected decimal value to be 7.");
3334

3435
one = new Fraction(14, 8);
35-
Assert.AreEqual(3, one.Numerator, "Expected numerator to be 3 after simplification.");
36+
// 14/8 = 7/4 (or 1 3/4)
37+
Assert.AreEqual(7, one.Numerator, "Expected numerator to be 7 after simplification.");
3638
Assert.AreEqual(4, one.Denominator, "Expected denominator to be 4.");
37-
Assert.AreEqual(1, one.Exponent, "Expected exponent to be 1.");
38-
Assert.AreEqual(7, one.ExponentNumerator, "Expected exponent numerator to be 7.");
39-
Assert.AreEqual(1.75m, one.Decimal, "Expected decimal value to be 1.75.");
39+
Assert.AreEqual(1, one.WholePart, "Expected WholePart to be 1.");
40+
Assert.AreEqual(3, one.RemainderNumerator, "Expected RemainderNumerator to be 3.");
41+
Assert.AreEqual(1.75m, one.ToDecimal(), "Expected decimal value to be 1.75.");
4042

43+
// Mixed Number: 0 1/2
4144
one = new Fraction(0, 1, 2);
42-
Assert.AreEqual(0, one.Numerator, "Expected numerator to be 0.");
43-
Assert.AreEqual(1, one.Denominator, "Expected denominator to be 1.");
44-
Assert.AreEqual(0, one.Exponent, "Expected exponent to be 0.");
45-
Assert.AreEqual(0, one.ExponentNumerator, "Expected exponent numerator to be 0.");
46-
Assert.AreEqual(0, one.Decimal, "Expected decimal value to be 0.");
45+
Assert.AreEqual(1, one.Numerator, "Expected numerator to be 1.");
46+
Assert.AreEqual(2, one.Denominator, "Expected denominator to be 2.");
47+
Assert.AreEqual(0, one.WholePart, "Expected WholePart to be 0.");
48+
Assert.AreEqual(1, one.RemainderNumerator, "Expected RemainderNumerator to be 1.");
49+
Assert.AreEqual(0.5m, one.ToDecimal(), "Expected decimal value to be 0.5.");
4750
}
4851

4952
/// <summary>
@@ -52,76 +55,76 @@ public void Fractures()
5255
[TestMethod]
5356
public void FracturesOperations()
5457
{
55-
var one = new Fraction(1, 2, 2);
56-
Assert.AreEqual(5, one.ExponentNumerator, "Expected exponent numerator to be 5.");
57-
var two = new Fraction(1, 2, 2);
58-
Assert.AreEqual(5, two.ExponentNumerator, "Expected exponent numerator to be 5.");
58+
// 2 1/2 = 5/2
59+
var one = new Fraction(2, 1, 2);
60+
Assert.AreEqual(5, one.Numerator, "Expected numerator to be 5.");
61+
62+
var two = new Fraction(2, 1, 2);
63+
Assert.AreEqual(5, two.Numerator, "Expected numerator to be 5.");
5964

65+
// 5/2 + 5/2 = 10/2 = 5/1
6066
var result = one + two;
6167
Assert.AreEqual(5, result.Numerator, "Expected numerator to be 5.");
6268
Assert.AreEqual(1, result.Denominator, "Expected denominator to be 1.");
63-
Assert.AreEqual(0, result.Exponent, "Expected exponent to be 0.");
64-
Assert.AreEqual(5, result.ExponentNumerator, "Expected exponent numerator to be 5.");
65-
Assert.AreEqual(5, result.Decimal, "Expected decimal value to be 5.");
69+
Assert.AreEqual(5, result.WholePart, "Expected WholePart to be 5.");
70+
Assert.AreEqual(0, result.RemainderNumerator, "Expected RemainderNumerator to be 0.");
71+
Assert.AreEqual(5m, result.ToDecimal(), "Expected decimal value to be 5.");
6672

73+
// 5/2 - 5/2 = 0/1
6774
result = one - two;
6875
Assert.AreEqual(0, result.Numerator, "Expected numerator to be 0.");
69-
Assert.AreEqual(4, result.Denominator, "Expected denominator to be 4.");
70-
Assert.AreEqual(0, result.Exponent, "Expected exponent to be 0.");
71-
Assert.AreEqual(0, result.ExponentNumerator, "Expected exponent numerator to be 0.");
72-
Assert.AreEqual(0, result.Decimal, "Expected decimal value to be 0.");
76+
Assert.AreEqual(1, result.Denominator, "Expected denominator to be 1 (simplified).");
77+
Assert.AreEqual(0m, result.ToDecimal(), "Expected decimal value to be 0.");
7378

79+
// 4/2 = 2/1
7480
one = new Fraction(4, 2);
75-
Assert.AreEqual(2, one.ExponentNumerator, "Expected exponent numerator to be 2.");
7681
Assert.AreEqual(2, one.Numerator, "Expected numerator to be 2.");
7782
Assert.AreEqual(1, one.Denominator, "Expected denominator to be 1.");
7883

79-
two = new Fraction(1, 1, 4);
80-
Assert.AreEqual(4, two.ExponentNumerator, "Expected exponent numerator to be 4.");
84+
// Whole number 4 (4/1)
85+
two = new Fraction(4, 0, 1);
86+
Assert.AreEqual(4, two.Numerator, "Expected numerator to be 4.");
8187

88+
// 2/1 * 4/1 = 8/1
8289
result = one * two;
8390
Assert.AreEqual(8, result.Numerator, "Expected numerator to be 8.");
8491
Assert.AreEqual(1, result.Denominator, "Expected denominator to be 1.");
85-
Assert.AreEqual(0, result.Exponent, "Expected exponent to be 0.");
86-
Assert.AreEqual(8, result.ExponentNumerator, "Expected exponent numerator to be 8.");
87-
Assert.AreEqual(8, result.Decimal, "Expected decimal value to be 8.");
92+
Assert.AreEqual(8m, result.ToDecimal(), "Expected decimal value to be 8.");
8893

94+
// 2/1 / 4/1 = 2/4 = 1/2
8995
result = one / two;
9096
Assert.AreEqual(1, result.Numerator, "Expected numerator to be 1.");
9197
Assert.AreEqual(2, result.Denominator, "Expected denominator to be 2.");
92-
Assert.AreEqual(0, result.Exponent, "Expected exponent to be 0.");
93-
Assert.AreEqual(1, result.ExponentNumerator, "Expected exponent numerator to be 1.");
94-
Assert.AreEqual(0.5m, result.Decimal, "Expected decimal value to be 0.5.");
98+
Assert.AreEqual(0.5m, result.ToDecimal(), "Expected decimal value to be 0.5.");
9599

96100
// Edge case tests
97-
one = new Fraction(2, 2);
98-
two = new Fraction(1, 2, 1);
101+
one = new Fraction(2, 2); // 1/1
102+
two = new Fraction(1, 1, 2); // 1 1/2 = 3/2
99103

104+
// 1/1 + 3/2 = 5/2
100105
result = one + two;
101-
Assert.AreEqual(1, result.Numerator, "Expected numerator to be 1.");
106+
Assert.AreEqual(5, result.Numerator, "Expected numerator to be 5.");
102107
Assert.AreEqual(2, result.Denominator, "Expected denominator to be 2.");
103-
Assert.AreEqual(2, result.Exponent, "Expected exponent to be 2.");
104-
Assert.AreEqual(5, result.ExponentNumerator, "Expected exponent numerator to be 5.");
105-
Assert.AreEqual(2.5m, result.Decimal, "Expected decimal value to be 2.5.");
108+
Assert.AreEqual(2, result.WholePart, "Expected WholePart to be 2.");
109+
Assert.AreEqual(1, result.RemainderNumerator, "Expected RemainderNumerator to be 1.");
110+
Assert.AreEqual(2.5m, result.ToDecimal(), "Expected decimal value to be 2.5.");
106111

107112
// Negative handling
108-
one = new Fraction(-1, 2);
109-
two = new Fraction(1, 2, -1);
110-
var three = new Fraction(1, 4, -1);
113+
one = new Fraction(-1, 2); // -1/2
114+
two = new Fraction(-1, 1, 2); // -1 1/2 = -3/2
115+
var three = new Fraction(-1, 1, 4); // -1 1/4 = -5/4
111116

117+
// -1/2 * -3/2 = 3/4
112118
result = one * two;
113119
Assert.AreEqual(3, result.Numerator, "Expected numerator to be 3.");
114120
Assert.AreEqual(4, result.Denominator, "Expected denominator to be 4.");
115-
Assert.AreEqual(0, result.Exponent, "Expected exponent to be 0.");
116-
Assert.AreEqual(3, result.ExponentNumerator, "Expected exponent numerator to be 3.");
117-
Assert.AreEqual(0.75m, result.Decimal, "Expected decimal value to be 0.75.");
121+
Assert.AreEqual(0.75m, result.ToDecimal(), "Expected decimal value to be 0.75.");
118122

123+
// -1/2 * -5/4 = 5/8
119124
result = one * three;
120125
Assert.AreEqual(5, result.Numerator, "Expected numerator to be 5.");
121126
Assert.AreEqual(8, result.Denominator, "Expected denominator to be 8.");
122-
Assert.AreEqual(0, result.Exponent, "Expected exponent to be 0.");
123-
Assert.AreEqual(5, result.ExponentNumerator, "Expected exponent numerator to be 5.");
124-
Assert.AreEqual(0.625m, result.Decimal, "Expected decimal value to be 0.625.");
127+
Assert.AreEqual(0.625m, result.ToDecimal(), "Expected decimal value to be 0.625.");
125128
}
126129

127130
/// <summary>
@@ -145,6 +148,7 @@ public void FractionNegativeHandling()
145148
Assert.AreEqual(-1, frac.Numerator, "Expected numerator to be -1.");
146149
Assert.AreEqual(3, frac.Denominator, "Expected denominator to be 3.");
147150

151+
// The denominator should flip to positive, keeping the negative on the numerator
148152
var frac2 = new Fraction(3, -9);
149153
Assert.AreEqual(-1, frac2.Numerator, "Expected numerator to be -1.");
150154
Assert.AreEqual(3, frac2.Denominator, "Expected denominator to be 3.");

Mathematics/BaseMatrix.cs

Lines changed: 5 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ namespace Mathematics
2121
/// Idea and Inspiration:
2222
/// https://bratched.com/en/?s=matrix
2323
/// </summary>
24-
public sealed class BaseMatrix : IDisposable
24+
public sealed class BaseMatrix
2525
{
2626
/// <summary>
2727
/// Initializes a new instance of the <see cref="BaseMatrix" /> class.
@@ -64,14 +64,6 @@ public BaseMatrix()
6464
{
6565
}
6666

67-
/// <summary>
68-
/// Gets a value indicating whether this <see cref="BaseMatrix" /> is disposed.
69-
/// </summary>
70-
/// <value>
71-
/// <c>true</c> if disposed; otherwise, <c>false</c>.
72-
/// </value>
73-
private bool Disposed { get; set; }
74-
7567
/// <summary>
7668
/// Gets or sets the matrix.
7769
/// </summary>
@@ -108,54 +100,7 @@ public BaseMatrix()
108100
public double this[int x, int y]
109101
{
110102
get => Matrix[x, y];
111-
init => Matrix[x, y] = value;
112-
}
113-
114-
/// <inheritdoc />
115-
/// <summary>
116-
/// Free up all the Memory.
117-
/// See:
118-
/// https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1063?view=vs-2019
119-
/// </summary>
120-
public void Dispose()
121-
{
122-
Dispose(true);
123-
GC.SuppressFinalize(this);
124-
}
125-
126-
/// <summary>
127-
/// Releases unmanaged and - optionally - managed resources.
128-
/// </summary>
129-
/// <param name="disposing">
130-
/// <c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only
131-
/// unmanaged resources.
132-
/// </param>
133-
private void Dispose(bool disposing)
134-
{
135-
if (Disposed)
136-
{
137-
return;
138-
}
139-
140-
if (disposing)
141-
{
142-
// free managed resources
143-
Matrix = null;
144-
}
145-
146-
Disposed = true;
147-
}
148-
149-
/// <summary>
150-
/// NOTE: Leave out the finalizer altogether if this class doesn't
151-
/// own unmanaged resources, but leave the other methods
152-
/// exactly as they are.
153-
/// Finalizes an instance of the <see cref="BaseMatrix" /> class.
154-
/// </summary>
155-
~BaseMatrix()
156-
{
157-
// Finalizer calls Dispose(false)
158-
Dispose(false);
103+
set => Matrix[x, y] = value;
159104
}
160105

161106
/// <summary>
@@ -332,7 +277,8 @@ public override bool Equals(object obj)
332277
/// </returns>
333278
public override int GetHashCode()
334279
{
335-
return HashCode.Combine(Matrix);
280+
// A simple, safe hash for dynamic matrices
281+
return Matrix != null ? HashCode.Combine(Width, Height) : 0;
336282
}
337283

338284
/// <summary>
@@ -397,7 +343,7 @@ public static explicit operator Vector3D(BaseMatrix first)
397343
/// </returns>
398344
public static implicit operator BaseMatrix(double[,] m)
399345
{
400-
return new BaseMatrix { Matrix = m };
346+
return new BaseMatrix(m);
401347
}
402348

403349
/// <summary>

0 commit comments

Comments
 (0)