using System;
using System.Globalization;
using System.Text;
using IL2CPU.API;
namespace Cosmos.IL2CPU.IL.CustomImplementations.System
{
[Plug(Target = typeof(sbyte))]
public static class Int8Impl
{
public static string ToString(ref sbyte aThis)
{
bool bNegative = false;
sbyte aValue = aThis;
if (aValue < 0)
{
bNegative = true;
aValue *= -1;
}
return GeneralIntegerImplByUInt64.ToString((UInt64)aValue, bNegative);
}
public static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out sbyte result)
{
// Todo, consider how to implemente style and provider
throw new NotImplementedException();
//return TryParse(s, out result);
}
public static bool TryParse(string s, out sbyte result)
{
bool bCanParse = false;
result = 0;
try
{
result = Parse(s);
bCanParse = true;
}
catch(Exception)
{
// Something wrong
}
return bCanParse;
}
public static sbyte Parse(string s)
{
Int64 result = GeneralIntegerImplByUInt64.ParseSignedInteger(s);
if (result > sbyte.MaxValue || result < sbyte.MinValue)
{
throw new OverflowException();
}
return (sbyte)result;
}
}
[Plug(Target = typeof(byte))]
public static class UInt8Impl
{
public static string ToString(ref byte aThis)
{
byte aValue = aThis;
return GeneralIntegerImplByUInt64.ToString((UInt64)aValue, false);
}
public static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out byte result)
{
// Todo, consider how to implemente style and provider
// Exponent, "1E0", "1e3"...
// Decimal point "1.0", "3.5"
throw new NotImplementedException();
//return TryParse(s, out result);
}
public static bool TryParse(string s, out byte result)
{
bool bCanParse = false;
result = 0;
try
{
result = Parse(s);
bCanParse = true;
}
catch (Exception)
{
// Something wrong
}
return bCanParse;
}
public static byte Parse(string s)
{
UInt64 result = GeneralIntegerImplByUInt64.ParseUnsignedInteger(s);
if (result > byte.MaxValue)
{
throw new OverflowException();
}
return (byte)result;
}
}
[Plug(Target = typeof(short))]
public static class Int16Impl
{
public static string ToString(ref short aThis)
{
bool bNegative = false;
short aValue = aThis;
if (aValue < 0)
{
bNegative = true;
aValue *= -1;
}
return GeneralIntegerImplByUInt64.ToString((UInt64)aValue, bNegative);
}
public static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out short result)
{
// Todo, consider how to implemente style and provider
throw new NotImplementedException();
//return TryParse(s, out result);
}
public static bool TryParse(string s, out short result)
{
bool bCanParse = false;
result = 0;
try
{
result = Parse(s);
bCanParse = true;
}
catch (Exception)
{
// Something wrong
}
return bCanParse;
}
public static short Parse(string s)
{
Int64 result = GeneralIntegerImplByUInt64.ParseSignedInteger(s);
if (result > short.MaxValue || result < short.MinValue)
{
throw new OverflowException();
}
return (short)result;
}
}
[Plug(Target = typeof(ushort))]
public static class UInt16Impl
{
public static string ToString(ref ushort aThis)
{
ushort aValue = aThis;
return GeneralIntegerImplByUInt64.ToString((UInt64)aValue, false);
}
public static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out ushort result)
{
// Todo, consider how to implemente style and provider
throw new NotImplementedException();
//return TryParse(s, out result);
}
public static bool TryParse(string s, out ushort result)
{
bool bCanParse = false;
result = 0;
try
{
result = Parse(s);
bCanParse = true;
}
catch (Exception)
{
// Something wrong
}
return bCanParse;
}
public static ushort Parse(string s)
{
UInt64 result = GeneralIntegerImplByUInt64.ParseUnsignedInteger(s);
if (result > ushort.MaxValue)
{
throw new OverflowException();
}
return (ushort)result;
}
}
[Plug(Target = typeof(int))]
public static class Int32Impl
{
public static string ToString(ref int aThis)
{
bool bNegative = false;
int aValue = aThis;
if (aValue < 0)
{
bNegative = true;
aValue *= -1;
}
return GeneralIntegerImplByUInt64.ToString((UInt64)aValue, bNegative);
}
public static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out short result)
{
// Todo, consider how to implemente style and provider
throw new NotImplementedException();
//return TryParse(s, out result);
}
public static bool TryParse(string s, out int result)
{
bool bCanParse = false;
result = 0;
try
{
result = Parse(s);
bCanParse = true;
}
catch (Exception)
{
// Something wrong
}
return bCanParse;
}
public static int Parse(string s)
{
Int64 result = GeneralIntegerImplByUInt64.ParseSignedInteger(s);
if (result > int.MaxValue || result < int.MinValue)
{
throw new OverflowException();
}
return (int)result;
}
}
[Plug(Target = typeof(uint))]
public static class UInt32Impl
{
public static string ToString(ref uint aThis)
{
uint aValue = aThis;
return GeneralIntegerImplByUInt64.ToString((UInt64)aValue, false);
}
public static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out uint result)
{
// Todo, consider how to implemente style and provider
throw new NotImplementedException();
//return TryParse(s, out result);
}
public static bool TryParse(string s, out uint result)
{
bool bCanParse = false;
result = 0;
try
{
result = Parse(s);
bCanParse = true;
}
catch (Exception)
{
// Something wrong
}
return bCanParse;
}
public static uint Parse(string s)
{
UInt64 result = GeneralIntegerImplByUInt64.ParseUnsignedInteger(s);
if (result > uint.MaxValue)
{
throw new OverflowException();
}
return (uint)result;
}
}
internal static class GeneralIntegerImplByUInt64
{
internal static Int64 ParseSignedInteger(string s)
{
bool bNegative;
Int64 result = (Int64)ParseInteger(s, out bNegative);
if (bNegative)
result *= -1;
return result;
}
internal static UInt64 ParseUnsignedInteger(string s)
{
bool bNegative;
UInt64 result = ParseInteger(s, out bNegative);
if (bNegative && result != 0)
{
throw new OverflowException();
}
return result;
}
///
/// ParseInteger
/// Sole algorithm implementation of "integer Parse(string)"
///
///
///
///
private static UInt64 ParseInteger(string s, out bool bNegative)
{
UInt64 result = 0;
int nParseStartPos = 0;
bNegative = false;
if (s.Length >= 1)
{
if (s[0] == '+')
{
nParseStartPos = 1;
}
else if (s[0] == '-')
{
nParseStartPos = 1;
bNegative = true;
}
}
for (int i = nParseStartPos; i < s.Length; i++)
{
sbyte ind = (sbyte)(s[i] - '0');
if (ind < 0 || ind > 9)
{
throw new FormatException("Digit " + s[i] + " not found");
}
result = (result * 10) + (UInt64)ind;
}
return result;
}
///
/// ToString
/// Sole algorithm implementation of "string ToString(integer)"
///
///
///
///
internal static string ToString(UInt64 aValue, bool bIsNegative)
{
char[] xResultChars = new char[21]; // 64 bit UInteger convert to string, with sign symble, max length is 21.
int xCurrentPos = xResultChars.Length - 1;
while (aValue > 0)
{
byte xPos = (byte)(aValue % 10);
aValue /= 10;
xResultChars[xCurrentPos] = (char)('0' + xPos);
xCurrentPos -= 1;
}
if (bIsNegative)
{
xResultChars[xCurrentPos] = '-';
xCurrentPos -= 1;
}
return new String(xResultChars, xCurrentPos + 1, xResultChars.Length - xCurrentPos - 1);
}
}
}