Lots of work on type binding

This commit is contained in:
2018-11-11 18:12:42 +01:00
parent 699377cdfc
commit 3561979ded
23 changed files with 530 additions and 142 deletions

View File

@@ -0,0 +1,78 @@
namespace Upsilon.BaseTypes.Number
{
public abstract class Number
{
protected abstract bool IsFloat { get; }
#region Binary Operators
public static Number operator + (Number a, Number b)
{
if (!a.IsFloat && !b.IsFloat)
return new NumberLong(((NumberLong) a).Value + ((NumberLong) b).Value);
if (a.IsFloat && b.IsFloat)
return new NumberDouble(((NumberDouble) a).Value + ((NumberDouble) b).Value);
if (a.IsFloat)
return new NumberDouble(((NumberDouble) a).Value + ((NumberLong) b).Value);
return new NumberDouble(((NumberLong) a).Value + ((NumberDouble) b).Value);
}
public static Number operator - (Number a, Number b)
{
if (!a.IsFloat && !b.IsFloat)
return new NumberLong(((NumberLong) a).Value - ((NumberLong) b).Value);
if (a.IsFloat && b.IsFloat)
return new NumberDouble(((NumberDouble) a).Value - ((NumberDouble) b).Value);
if (a.IsFloat)
return new NumberDouble(((NumberDouble) a).Value - ((NumberLong) b).Value);
return new NumberDouble(((NumberLong) a).Value - ((NumberDouble) b).Value);
}
public static Number operator * (Number a, Number b)
{
if (!a.IsFloat && !b.IsFloat)
return new NumberLong(((NumberLong) a).Value * ((NumberLong) b).Value);
if (a.IsFloat && b.IsFloat)
return new NumberDouble(((NumberDouble) a).Value * ((NumberDouble) b).Value);
if (a.IsFloat)
return new NumberDouble(((NumberDouble) a).Value * ((NumberLong) b).Value);
return new NumberDouble(((NumberLong) a).Value * ((NumberDouble) b).Value);
}
public static Number operator / (Number a, Number b)
{
if (!a.IsFloat && !b.IsFloat)
return new NumberLong(((NumberLong) a).Value / ((NumberLong) b).Value);
if (a.IsFloat && b.IsFloat)
return new NumberDouble(((NumberDouble) a).Value / ((NumberDouble) b).Value);
if (a.IsFloat)
return new NumberDouble(((NumberDouble) a).Value / ((NumberLong) b).Value);
return new NumberDouble(((NumberLong) a).Value / ((NumberDouble) b).Value);
}
#endregion
#region Equality
private bool Equals(Number other)
{
if (!IsFloat && !other.IsFloat)
return ((NumberLong) this).Value.Equals(((NumberLong) other).Value);
if (IsFloat && other.IsFloat)
return ((NumberDouble) this).Value.Equals(((NumberDouble) other).Value);
return false;
}
#pragma warning disable 659
public override bool Equals(object obj)
#pragma warning restore 659
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((Number) obj);
}
#endregion
}
}

View File

@@ -0,0 +1,25 @@
using System.Globalization;
namespace Upsilon.BaseTypes.Number
{
public class NumberDouble : Number
{
public double Value { get; }
protected override bool IsFloat { get; } = true;
public NumberDouble(double value)
{
Value = value;
}
public override int GetHashCode()
{
return Value.GetHashCode();
}
public override string ToString()
{
return Value.ToString(CultureInfo.InvariantCulture);
}
}
}

View File

@@ -0,0 +1,25 @@
using System.Globalization;
namespace Upsilon.BaseTypes.Number
{
public class NumberLong : Number
{
public long Value { get; }
protected override bool IsFloat { get; } = true;
public NumberLong(long val)
{
Value = val;
}
public override int GetHashCode()
{
return Value.GetHashCode();
}
public override string ToString()
{
return Value.ToString(CultureInfo.InvariantCulture);
}
}
}