Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

make both Percent and UDouble readonly (thus immutable). #14

Merged
merged 2 commits into from
Sep 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 34 additions & 2 deletions Noggog.CSharpExt/Structs/Numbers/Percent.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Noggog;

public struct Percent : IComparable, IEquatable<Percent>
public readonly struct Percent : IComparable, IEquatable<Percent>, IComparable<Percent>
{
public static readonly Percent One = new Percent(1d);
public static readonly Percent Zero = new Percent(0d);
Expand Down Expand Up @@ -59,7 +59,7 @@ public static Percent FactoryPutInRange(double d)
{
if (double.IsNaN(d) || double.IsInfinity(d))
{
throw new ArgumentException();
throw new ArgumentException("Argument value out of range", nameof(d));
}
if (d < 0)
{
Expand Down Expand Up @@ -173,4 +173,36 @@ public static bool TryParse(string str, out Percent p)
p = default(Percent);
return false;
}

public int CompareTo(Percent other) => this.Value.CompareTo(other.Value);

public static bool operator ==(Percent left, Percent right)
{
return left.Equals(right);
}

public static bool operator !=(Percent left, Percent right)
{
return !(left == right);
}

public static bool operator <(Percent left, Percent right)
{
return left.CompareTo(right) < 0;
}

public static bool operator <=(Percent left, Percent right)
{
return left.CompareTo(right) <= 0;
}

public static bool operator >(Percent left, Percent right)
{
return left.CompareTo(right) > 0;
}

public static bool operator >=(Percent left, Percent right)
{
return left.CompareTo(right) >= 0;
}
}
48 changes: 42 additions & 6 deletions Noggog.CSharpExt/Structs/Numbers/UDouble.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace Noggog;

public struct UDouble : IComparable<UDouble>, IComparable<double>, IEquatable<UDouble>
public readonly struct UDouble : IComparable<UDouble>, IComparable<double>, IEquatable<UDouble>
{
public readonly double Value;
public const double MinValue = 0d;
Expand Down Expand Up @@ -43,15 +43,20 @@ public static implicit operator double(UDouble d)
return d.Value - amount;
}

public static UDouble operator +(UDouble d, double amount)
{
return d.Value + amount;
}

public override bool Equals(object? obj)
{
if (obj is UDouble uRhs)
{
return Value == uRhs.Value;
}
else if (obj is double)
else if (obj is double d)
{
return Value == (double)obj;
return Value == d;
}
else
{
Expand Down Expand Up @@ -91,8 +96,9 @@ public int CompareTo(double other)

public static UDouble Parse(string str)
{
TryParse(str, out UDouble ud);
return ud;
if (TryParse(str, out UDouble ud))
return ud;
return default;
Comment on lines +99 to +101
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, weird setup I had before. I almost wonder if it should be throwing. We have the TryParse alternate, the Parse should throw if it's a failure... or be renamed to ParseOrDefault or something more clear?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Parse usually does throw an exception on failure, TryParse true/false. not sure if there is a naming convention for ParseOrDefault (which sounds perfectly understandable to me)

}

public static bool TryParse(string str, out UDouble doub)
Expand All @@ -108,7 +114,7 @@ public static bool TryParse(string str, out UDouble doub)

public bool EqualsWithin(UDouble rhs, double within = 0.000000001d)
{
return rhs.Value.EqualsWithin(rhs.Value, within);
return Value.EqualsWithin(rhs.Value, within);
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch! Sounds like i gotta bite the bullet and do some Unit tests soon 😬

}

public bool IsInRange(UDouble min, UDouble max)
Expand All @@ -131,4 +137,34 @@ public UDouble PutInRange(UDouble min, UDouble max)
if (Value > max) return max;
return Value;
}

public static bool operator ==(UDouble left, UDouble right)
{
return left.Equals(right);
}

public static bool operator !=(UDouble left, UDouble right)
{
return !(left == right);
}

public static bool operator <(UDouble left, UDouble right)
{
return left.CompareTo(right) < 0;
}

public static bool operator <=(UDouble left, UDouble right)
{
return left.CompareTo(right) <= 0;
}

public static bool operator >(UDouble left, UDouble right)
{
return left.CompareTo(right) > 0;
}

public static bool operator >=(UDouble left, UDouble right)
{
return left.CompareTo(right) >= 0;
}
}