Generic For Loops
This commit is contained in:
@@ -1,99 +0,0 @@
|
||||
namespace Upsilon.BaseTypes.Number
|
||||
{
|
||||
internal abstract class Number : LuaType
|
||||
{
|
||||
protected abstract bool IsFloat { get; }
|
||||
|
||||
public override Type Type => Type.Number;
|
||||
|
||||
#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
|
||||
|
||||
public static Number operator - (Number n)
|
||||
{
|
||||
if (n.IsFloat)
|
||||
return new NumberDouble(-((NumberDouble)n).Value);
|
||||
return new NumberLong(-((NumberLong)n).Value);
|
||||
}
|
||||
|
||||
#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
|
||||
|
||||
public static explicit operator double(Number n)
|
||||
{
|
||||
if (n.IsFloat)
|
||||
return ((NumberDouble) n);
|
||||
return ((NumberLong) n).Value;
|
||||
}
|
||||
|
||||
public static explicit operator long(Number n)
|
||||
{
|
||||
if (n.IsFloat)
|
||||
return (long)((NumberDouble) n).Value;
|
||||
return ((NumberLong) n).Value;
|
||||
}
|
||||
}
|
||||
}
|
||||
99
Upsilon/BaseTypes/Number/ScriptNumber.cs
Normal file
99
Upsilon/BaseTypes/Number/ScriptNumber.cs
Normal file
@@ -0,0 +1,99 @@
|
||||
namespace Upsilon.BaseTypes.Number
|
||||
{
|
||||
internal abstract class ScriptNumber : ScriptType
|
||||
{
|
||||
protected abstract bool IsFloat { get; }
|
||||
|
||||
public override Type Type => Type.Number;
|
||||
|
||||
#region Binary Operators
|
||||
|
||||
public static ScriptNumber operator + (ScriptNumber a, ScriptNumber b)
|
||||
{
|
||||
if (!a.IsFloat && !b.IsFloat)
|
||||
return new ScriptNumberLong(((ScriptNumberLong) a).Value + ((ScriptNumberLong) b).Value);
|
||||
if (a.IsFloat && b.IsFloat)
|
||||
return new ScriptNumberDouble(((ScriptNumberDouble) a).Value + ((ScriptNumberDouble) b).Value);
|
||||
if (a.IsFloat)
|
||||
return new ScriptNumberDouble(((ScriptNumberDouble) a).Value + ((ScriptNumberLong) b).Value);
|
||||
return new ScriptNumberDouble(((ScriptNumberLong) a).Value + ((ScriptNumberDouble) b).Value);
|
||||
}
|
||||
|
||||
public static ScriptNumber operator - (ScriptNumber a, ScriptNumber b)
|
||||
{
|
||||
if (!a.IsFloat && !b.IsFloat)
|
||||
return new ScriptNumberLong(((ScriptNumberLong) a).Value - ((ScriptNumberLong) b).Value);
|
||||
if (a.IsFloat && b.IsFloat)
|
||||
return new ScriptNumberDouble(((ScriptNumberDouble) a).Value - ((ScriptNumberDouble) b).Value);
|
||||
if (a.IsFloat)
|
||||
return new ScriptNumberDouble(((ScriptNumberDouble) a).Value - ((ScriptNumberLong) b).Value);
|
||||
return new ScriptNumberDouble(((ScriptNumberLong) a).Value - ((ScriptNumberDouble) b).Value);
|
||||
}
|
||||
|
||||
public static ScriptNumber operator * (ScriptNumber a, ScriptNumber b)
|
||||
{
|
||||
if (!a.IsFloat && !b.IsFloat)
|
||||
return new ScriptNumberLong(((ScriptNumberLong) a).Value * ((ScriptNumberLong) b).Value);
|
||||
if (a.IsFloat && b.IsFloat)
|
||||
return new ScriptNumberDouble(((ScriptNumberDouble) a).Value * ((ScriptNumberDouble) b).Value);
|
||||
if (a.IsFloat)
|
||||
return new ScriptNumberDouble(((ScriptNumberDouble) a).Value * ((ScriptNumberLong) b).Value);
|
||||
return new ScriptNumberDouble(((ScriptNumberLong) a).Value * ((ScriptNumberDouble) b).Value);
|
||||
}
|
||||
|
||||
public static ScriptNumber operator / (ScriptNumber a, ScriptNumber b)
|
||||
{
|
||||
if (!a.IsFloat && !b.IsFloat)
|
||||
return new ScriptNumberLong(((ScriptNumberLong) a).Value / ((ScriptNumberLong) b).Value);
|
||||
if (a.IsFloat && b.IsFloat)
|
||||
return new ScriptNumberDouble(((ScriptNumberDouble) a).Value / ((ScriptNumberDouble) b).Value);
|
||||
if (a.IsFloat)
|
||||
return new ScriptNumberDouble(((ScriptNumberDouble) a).Value / ((ScriptNumberLong) b).Value);
|
||||
return new ScriptNumberDouble(((ScriptNumberLong) a).Value / ((ScriptNumberDouble) b).Value);
|
||||
}
|
||||
#endregion
|
||||
|
||||
public static ScriptNumber operator - (ScriptNumber n)
|
||||
{
|
||||
if (n.IsFloat)
|
||||
return new ScriptNumberDouble(-((ScriptNumberDouble)n).Value);
|
||||
return new ScriptNumberLong(-((ScriptNumberLong)n).Value);
|
||||
}
|
||||
|
||||
#region Equality
|
||||
private bool Equals(ScriptNumber other)
|
||||
{
|
||||
if (!IsFloat && !other.IsFloat)
|
||||
return ((ScriptNumberLong) this).Value.Equals(((ScriptNumberLong) other).Value);
|
||||
if (IsFloat && other.IsFloat)
|
||||
return ((ScriptNumberDouble) this).Value.Equals(((ScriptNumberDouble) 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((ScriptNumber) obj);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public static explicit operator double(ScriptNumber n)
|
||||
{
|
||||
if (n.IsFloat)
|
||||
return ((ScriptNumberDouble) n);
|
||||
return ((ScriptNumberLong) n).Value;
|
||||
}
|
||||
|
||||
public static explicit operator long(ScriptNumber n)
|
||||
{
|
||||
if (n.IsFloat)
|
||||
return (long)((ScriptNumberDouble) n).Value;
|
||||
return ((ScriptNumberLong) n).Value;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,12 +2,12 @@ using System.Globalization;
|
||||
|
||||
namespace Upsilon.BaseTypes.Number
|
||||
{
|
||||
internal class NumberDouble : Number
|
||||
internal class ScriptNumberDouble : ScriptNumber
|
||||
{
|
||||
public double Value { get; }
|
||||
protected override bool IsFloat { get; } = true;
|
||||
|
||||
public NumberDouble(double value)
|
||||
public ScriptNumberDouble(double value)
|
||||
{
|
||||
Value = value;
|
||||
}
|
||||
@@ -22,7 +22,7 @@ namespace Upsilon.BaseTypes.Number
|
||||
return Value.ToString(CultureInfo.InvariantCulture);
|
||||
}
|
||||
|
||||
public static implicit operator double(NumberDouble n)
|
||||
public static implicit operator double(ScriptNumberDouble n)
|
||||
{
|
||||
return n.Value;
|
||||
}
|
||||
@@ -3,12 +3,12 @@ using System.Globalization;
|
||||
|
||||
namespace Upsilon.BaseTypes.Number
|
||||
{
|
||||
internal class NumberLong : Number
|
||||
internal class ScriptNumberLong : ScriptNumber
|
||||
{
|
||||
public long Value { get; set; }
|
||||
protected override bool IsFloat { get; } = false;
|
||||
|
||||
public NumberLong(long val)
|
||||
public ScriptNumberLong(long val)
|
||||
{
|
||||
Value = val;
|
||||
}
|
||||
@@ -23,7 +23,7 @@ namespace Upsilon.BaseTypes.Number
|
||||
return Value.ToString(CultureInfo.InvariantCulture);
|
||||
}
|
||||
|
||||
public static implicit operator long(NumberLong n)
|
||||
public static implicit operator long(ScriptNumberLong n)
|
||||
{
|
||||
if (n == null)
|
||||
return 0;
|
||||
Reference in New Issue
Block a user