using System;
using System.Runtime.InteropServices;
namespace Vanara.PInvoke
{
/// Managed instance of the SIZE_T type.
[StructLayout(LayoutKind.Sequential)]
public struct SizeT : IEquatable, IComparable, IConvertible
{
private UIntPtr val;
/// Initializes a new instance of the struct.
/// The value.
public SizeT(uint value) => val = (UIntPtr)value;
/// Initializes a new instance of the struct.
/// The value.
public SizeT(ulong value) => val = new UIntPtr(value);
/// Gets the value.
/// The value.
public ulong Value => val.ToUInt64();
/// Performs an implicit conversion from to .
/// The value.
/// The result of the conversion.
public static implicit operator SizeT(int value) => new SizeT((uint)value);
/// Performs an implicit conversion from to .
/// The value.
/// The result of the conversion.
public static implicit operator SizeT(uint value) => new SizeT(value);
/// Performs an implicit conversion from to .
/// The value.
/// The result of the conversion.
public static implicit operator SizeT(long value) => new SizeT((ulong)value);
/// Performs an implicit conversion from to .
/// The value.
/// The result of the conversion.
public static implicit operator SizeT(ulong value) => new SizeT(value);
/// Performs an implicit conversion from to .
/// The value.
/// The result of the conversion.
public static implicit operator int(SizeT value) => (int)value.Value;
/// Performs an implicit conversion from to .
/// The value.
/// The result of the conversion.
public static implicit operator uint(SizeT value) => (uint)value.Value;
/// Performs an implicit conversion from to .
/// The value.
/// The result of the conversion.
public static implicit operator long(SizeT value) => (long)value.Value;
/// Performs an implicit conversion from to .
/// The value.
/// The result of the conversion.
public static implicit operator ulong(SizeT value) => value.Value;
///
public int CompareTo(SizeT other) => Value.CompareTo(other.Value);
///
public bool Equals(SizeT other) => Value.Equals(other.Value);
///
public override int GetHashCode() => Value.GetHashCode();
///
public TypeCode GetTypeCode() => Value.GetTypeCode();
///
public override string ToString() => Value.ToString();
///
public string ToString(IFormatProvider provider) => Value.ToString(provider);
///
bool IConvertible.ToBoolean(IFormatProvider provider) => ((IConvertible)Value).ToBoolean(provider);
///
char IConvertible.ToChar(IFormatProvider provider) => ((IConvertible)Value).ToChar(provider);
///
sbyte IConvertible.ToSByte(IFormatProvider provider) => ((IConvertible)Value).ToSByte(provider);
///
byte IConvertible.ToByte(IFormatProvider provider) => ((IConvertible)Value).ToByte(provider);
///
short IConvertible.ToInt16(IFormatProvider provider) => ((IConvertible)Value).ToInt16(provider);
///
ushort IConvertible.ToUInt16(IFormatProvider provider) => ((IConvertible)Value).ToUInt16(provider);
///
int IConvertible.ToInt32(IFormatProvider provider) => ((IConvertible)Value).ToInt32(provider);
///
uint IConvertible.ToUInt32(IFormatProvider provider) => ((IConvertible)Value).ToUInt32(provider);
///
long IConvertible.ToInt64(IFormatProvider provider) => ((IConvertible)Value).ToInt64(provider);
///
ulong IConvertible.ToUInt64(IFormatProvider provider) => ((IConvertible)Value).ToUInt64(provider);
///
float IConvertible.ToSingle(IFormatProvider provider) => ((IConvertible)Value).ToSingle(provider);
///
double IConvertible.ToDouble(IFormatProvider provider) => ((IConvertible)Value).ToDouble(provider);
///
decimal IConvertible.ToDecimal(IFormatProvider provider) => ((IConvertible)Value).ToDecimal(provider);
///
DateTime IConvertible.ToDateTime(IFormatProvider provider) => ((IConvertible)Value).ToDateTime(provider);
///
object IConvertible.ToType(Type conversionType, IFormatProvider provider) => ((IConvertible)Value).ToBoolean(provider);
}
}