CPF/CPF.Mac/Mac/Foundation/NSDecimal.cs
2023-11-21 23:05:03 +08:00

120 lines
4.1 KiB
C#

using System;
using System.Runtime.InteropServices;
namespace CPF.Mac.Foundation
{
public struct NSDecimal
{
public int fields;
public short m1;
public short m2;
public short m3;
public short m4;
public short m5;
public short m6;
public short m7;
public short m8;
[DllImport("/System/Library/Frameworks/Foundation.framework/Foundation", EntryPoint = "NSDecimalCompare")]
public static extern NSComparisonResult Compare(ref NSDecimal left, ref NSDecimal right);
[DllImport("/System/Library/Frameworks/Foundation.framework/Foundation", EntryPoint = "NSDecimalRound")]
public static extern void Round(out NSDecimal result, ref NSDecimal number, int scale, NSRoundingMode mode);
[DllImport("/System/Library/Frameworks/Foundation.framework/Foundation", EntryPoint = "NSDecimalNormalize")]
public static extern NSCalculationError Normalize(ref NSDecimal number1, ref NSDecimal number2);
[DllImport("/System/Library/Frameworks/Foundation.framework/Foundation", EntryPoint = "NSDecimalAdd")]
public static extern NSCalculationError Add(out NSDecimal result, ref NSDecimal left, ref NSDecimal right, NSRoundingMode mode);
[DllImport("/System/Library/Frameworks/Foundation.framework/Foundation", EntryPoint = "NSDecimalSubtract")]
public static extern NSCalculationError Subtract(out NSDecimal result, ref NSDecimal left, ref NSDecimal right, NSRoundingMode mode);
[DllImport("/System/Library/Frameworks/Foundation.framework/Foundation", EntryPoint = "NSDecimalMultiply")]
public static extern NSCalculationError Multiply(out NSDecimal result, ref NSDecimal left, ref NSDecimal right, NSRoundingMode mode);
[DllImport("/System/Library/Frameworks/Foundation.framework/Foundation", EntryPoint = "NSDecimalDivide")]
public static extern NSCalculationError Divide(out NSDecimal result, ref NSDecimal left, ref NSDecimal right, NSRoundingMode mode);
[DllImport("/System/Library/Frameworks/Foundation.framework/Foundation", EntryPoint = "NSDecimalPower")]
public static extern NSComparisonResult Power(out NSDecimal result, ref NSDecimal number, int power, NSRoundingMode mode);
[DllImport("/System/Library/Frameworks/Foundation.framework/Foundation", EntryPoint = "NSDecimalMultiplyByPowerOf10")]
public static extern NSComparisonResult MultiplyByPowerOf10(out NSDecimal result, ref NSDecimal number, short power10, NSRoundingMode mode);
[DllImport("/System/Library/Frameworks/Foundation.framework/Foundation", EntryPoint = "NSDecimalMultiplyByPowerOf10")]
private static extern IntPtr NSDecimalString(ref NSDecimal value, IntPtr locale);
public override string ToString()
{
return $"{fields}:{m1}{m2}{m3}{m4}{m5}{m6}{m7}{m8}";
}
public static NSDecimal operator +(NSDecimal left, NSDecimal right)
{
Add(out NSDecimal result, ref left, ref right, NSRoundingMode.Plain);
return result;
}
public static NSDecimal operator -(NSDecimal left, NSDecimal right)
{
Subtract(out NSDecimal result, ref left, ref right, NSRoundingMode.Plain);
return result;
}
public static NSDecimal operator *(NSDecimal left, NSDecimal right)
{
Multiply(out NSDecimal result, ref left, ref right, NSRoundingMode.Plain);
return result;
}
public static NSDecimal operator /(NSDecimal left, NSDecimal right)
{
Divide(out NSDecimal result, ref left, ref right, NSRoundingMode.Plain);
return result;
}
public static bool operator ==(NSDecimal left, NSDecimal right)
{
return Compare(ref left, ref right) == NSComparisonResult.Same;
}
public static bool operator !=(NSDecimal left, NSDecimal right)
{
return Compare(ref left, ref right) != NSComparisonResult.Same;
}
public static implicit operator NSDecimal(int value)
{
return new NSNumber(value).NSDecimalValue;
}
public static explicit operator int(NSDecimal value)
{
return new NSDecimalNumber(value).Int32Value;
}
public override bool Equals(object obj)
{
if (!(obj is NSDecimal))
{
return false;
}
return this == (NSDecimal)obj;
}
public override int GetHashCode()
{
return fields ^ m1 ^ m2 ^ m3 ^ m4 ^ m5 ^ m6 ^ m7 ^ m8;
}
}
}