using System.Runtime.CompilerServices; using System.Runtime.InteropServices; namespace SVM.Core.Data { [StructLayout(LayoutKind.Sequential)] public struct CompactDouble : INumbericData { public double Value; public CompactDouble(double value) { Value = value; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public CompactDouble Add(CompactDouble R) { return new CompactDouble(Value + R.Value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public CompactDouble Sub(CompactDouble R) { return new CompactDouble(Value - R.Value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public CompactDouble Mul(CompactDouble R) { return new CompactDouble(Value * R.Value); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public CompactDouble Div(CompactDouble R) { return new CompactDouble(Value / R.Value); } public SVMSimpleResult AddOF(CompactDouble R) { CompactDouble result = default; bool IsOF = false; checked { try { result = new CompactDouble(Value + R.Value); } catch (System.Exception) { unchecked { IsOF = true; result = new CompactDouble(Value + R.Value); } } } return new SVMSimpleResult(IsOF, result); } public SVMSimpleResult SubOF(CompactDouble R) { CompactDouble result = default; bool IsOF = false; checked { try { result = new CompactDouble(Value - R.Value); } catch (System.Exception) { unchecked { IsOF = true; result = new CompactDouble(Value - R.Value); } } } return new SVMSimpleResult(IsOF, result); } public SVMSimpleResult DivOF(CompactDouble R) { CompactDouble result = default; bool IsOF = false; checked { try { result = new CompactDouble(Value / R.Value); } catch (System.Exception) { unchecked { IsOF = true; result = new CompactDouble(Value / R.Value); } } } return new SVMSimpleResult(IsOF, result); } public SVMSimpleResult MulOF(CompactDouble R) { CompactDouble result = default; bool IsOF = false; checked { try { result = new CompactDouble(Value * R.Value); } catch (System.Exception) { unchecked { IsOF = true; result = new CompactDouble(Value * R.Value); } } } return new SVMSimpleResult(IsOF, result); } public bool LT(CompactDouble R) { return Value < R.Value; } public bool GT(CompactDouble R) { return Value > R.Value; } public bool LE(CompactDouble R) { return Value <= R.Value; } public bool GE(CompactDouble R) { return Value >= R.Value; } public bool EQ(CompactDouble R) { return Value == R.Value; } public bool NE(CompactDouble R) { return Value != R.Value; } public INumbericData Cast_Byte() { return new CompactByte((byte)Value); } public INumbericData Cast_SByte() { return new CompactSByte((sbyte)Value); } public INumbericData Cast_Short() { return new CompactShort((short)Value); } public INumbericData Cast_UShort() { return new CompactUShort((ushort)Value); } public INumbericData Cast_Int() { return new CompactInt((int)Value); } public INumbericData Cast_UInt() { return new CompactUInt((uint)Value); } public INumbericData Cast_Long() { return new CompactLong((long)Value); } public INumbericData Cast_ULong() { return new CompactULong((ulong)Value); } public INumbericData Cast_Double() { return new CompactDouble(Value); } public INumbericData Cast_Float() { return new CompactSingle((float)Value); } public unsafe void Write(byte* targetPtr) { ((double*)targetPtr)[0] = Value; } public int SizeOf() { return sizeof(double); } public CompactDouble Mod(CompactDouble R) { return new CompactDouble(Value % R.Value); } } }