2020-11-15 11:12:37 +02:00

218 lines
7.9 KiB
C#

using JavaUnsafe = system.runtime.interopservices.JavaUnsafe;
namespace system
{
public class Single : system.ValueType, system.ValueMethod, java.lang.Cloneable,
System.IComparable, System.IComparable<float>,
System.IConvertible, System.IEquatable<float>, System.IFormattable
{
[java.attr.RetainType] protected float v;
public static Single Box(float v) => new Single() { v = v };
public static Single Box(float[] a, int i) => new Single.InArray(a, i);
public virtual float Get() => v;
public virtual float VolatileGet() =>
java.lang.Float.intBitsToFloat(JavaUnsafe.Obj.getIntVolatile(this, ValueOffset));
public virtual void Set(float v) => this.v = v;
public virtual void VolatileSet(float v) =>
JavaUnsafe.Obj.putIntVolatile(this, ValueOffset, java.lang.Float.floatToRawIntBits(v));
public static void Set(float v, Single o) => o.Set(v);
public static void VolatileSet(float v, Single o) => o.VolatileSet(v);
public override bool Equals(object obj)
{
var objSingle = obj as Single;
return (objSingle != null && objSingle.Get() == Get());
}
public override int GetHashCode()
{
int v = java.lang.Float.floatToRawIntBits(Get());
if (((v - 1) & 0x7FFFFFFF) >= 0x7F800000)
v &= 0x7F800000;
return v;
}
public override string ToString() => ParseNumbers.DoubleToString(Get());
// System.IEquatable<float>
public bool Equals(float v) => v == Get();
// System.IFormattable
public string ToString(string format, System.IFormatProvider provider)
{
if (string.IsNullOrEmpty(format))
return ToString();
return ParseNumbers.FormatNumber(
(java.lang.String) (object) format, provider, java.lang.Float.valueOf(Get()));
}
public string ToString(string format) => ToString(format, null);
public string ToString(System.IFormatProvider provider) => ToString();
// System.IComparable
public virtual int CompareTo(object obj)
{
if (obj is Single objSingle)
return CompareTo(objSingle.Get());
else if (object.ReferenceEquals(obj, null))
return 1;
throw new System.ArgumentException();
}
// System.IComparable<float>
public int CompareTo(float b)
{
var a = Get();
return (a < b ? -1 : a > b ? 1 : 0);
}
void ValueMethod.Clear() => Set(0);
void ValueMethod.CopyTo(ValueType into) => ((Single) into).Set(Get());
ValueType ValueMethod.Clone() => Box(Get());
static long ValueOffset
{
get
{
if (_ValueOffset == -1)
{
_ValueOffset = JavaUnsafe.FieldOffset(
(java.lang.Class) typeof(Single),
java.lang.Float.TYPE);
}
return _ValueOffset;
}
}
[java.attr.RetainType] static long _ValueOffset = -1;
//
// Is
//
public static bool IsNaN(float f) => java.lang.Float.isNaN(f);
public static bool IsFinite(float f) => ! java.lang.Float.isInfinite(f);
public static bool IsInfinity(float f) => java.lang.Float.isInfinite(f);
public static bool IsPositiveInfinity (float f) => f == java.lang.Float.POSITIVE_INFINITY;
public static bool IsNegativeInfinity(float f) => f == java.lang.Float.NEGATIVE_INFINITY;
public static bool IsNegative(float f) => f < 0.0;
public static bool IsNormal(float f) => f >= java.lang.Float.MIN_NORMAL;
public static bool IsSubnormal(float f) => f < java.lang.Float.MIN_NORMAL;
//
// CodeNumber.Indirection methods
//
public int Get_U8() => throw new System.NotSupportedException();
public int Get_I8() => throw new System.NotSupportedException();
public void Set_I8(int v) => throw new System.NotSupportedException();
public int Get_U16() => throw new System.NotSupportedException();
public int Get_I16() => throw new System.NotSupportedException();
public void Set_I16(int v) => throw new System.NotSupportedException();
public int Get_I32() => java.lang.Float.floatToRawIntBits(v);
public void Set_I32(int v) => Set(java.lang.Float.intBitsToFloat(v));
public long Get_I64() => throw new System.NotSupportedException();
public void Set_I64(long v) => throw new System.NotSupportedException();
public double Get_F64() => throw new System.NotSupportedException();
public void Set_F64(double v) => throw new System.NotSupportedException();
//
// IConvertible
//
public System.TypeCode GetTypeCode() => System.TypeCode.Single;
bool System.IConvertible.ToBoolean(System.IFormatProvider provider)
=> System.Convert.ToBoolean(Get());
char System.IConvertible.ToChar(System.IFormatProvider provider)
=> System.Convert.ToChar(Get());
sbyte System.IConvertible.ToSByte(System.IFormatProvider provider)
=> System.Convert.ToSByte(Get());
byte System.IConvertible.ToByte(System.IFormatProvider provider)
=> System.Convert.ToByte(Get());
short System.IConvertible.ToInt16(System.IFormatProvider provider)
=> System.Convert.ToInt16(Get());
ushort System.IConvertible.ToUInt16(System.IFormatProvider provider)
=> System.Convert.ToUInt16(Get());
int System.IConvertible.ToInt32(System.IFormatProvider provider)
=> System.Convert.ToInt32(Get());
uint System.IConvertible.ToUInt32(System.IFormatProvider provider)
=> System.Convert.ToUInt32(Get());
long System.IConvertible.ToInt64(System.IFormatProvider provider)
=> System.Convert.ToInt64(Get());
ulong System.IConvertible.ToUInt64(System.IFormatProvider provider)
=> System.Convert.ToUInt64(Get());
float System.IConvertible.ToSingle(System.IFormatProvider provider)
=> System.Convert.ToSingle(Get());
double System.IConvertible.ToDouble(System.IFormatProvider provider)
=> System.Convert.ToDouble(Get());
System.Decimal System.IConvertible.ToDecimal(System.IFormatProvider provider)
=> System.Convert.ToDecimal(Get());
System.DateTime System.IConvertible.ToDateTime(System.IFormatProvider provider)
=> throw new System.InvalidCastException();
object System.IConvertible.ToType(System.Type type, System.IFormatProvider provider)
=> system.Convert.DefaultToType((System.IConvertible) this, type, provider);
//
// InArray
//
private sealed class InArray : Single
{
[java.attr.RetainType] private float[] a;
[java.attr.RetainType] private int i;
public InArray(float[] array, int index)
{
if (index < 0 || index >= array.Length)
throw new System.IndexOutOfRangeException();
a = array;
i = index;
}
public override float Get() => a[i];
public override float VolatileGet() =>
java.lang.Float.intBitsToFloat(
JavaUnsafe.Obj.getIntVolatile(a, JavaUnsafe.ElementOffset32(i)));
public override void Set(float v) => a[i] = v;
public override void VolatileSet(float v) =>
JavaUnsafe.Obj.putIntVolatile(a, JavaUnsafe.ElementOffset32(i),
java.lang.Float.floatToRawIntBits(v));
}
}
}