using System; using System.ComponentModel; using System.Globalization; using System.Runtime.InteropServices; namespace Vanara; /// Managed instance of the four-byte BOOL type. [StructLayout(LayoutKind.Sequential), Serializable] [TypeConverter(typeof(BOOLTypeConverter))] public struct BOOL : IComparable, IComparable, IComparable, IConvertible, IEquatable, IEquatable { private uint val; internal const uint True = 1U; internal const uint False = 0U; /// Initializes a new instance of the struct. /// The value. public BOOL(uint value) => val = value; /// Initializes a new instance of the struct. /// The value. public BOOL(bool value) => val = value ? True : False; /// Gets the value. /// The value. public bool Value { get => val != False; private set => val = value ? True : False; } /// Performs an implicit conversion from to . /// The value. /// The result of the conversion. public static implicit operator BOOL(int value) => new(unchecked((uint)value)); /// Performs an implicit conversion from to . /// The value. /// The result of the conversion. public static implicit operator BOOL(uint value) => new(value); /// Performs an implicit conversion from to . /// The value. /// The result of the conversion. public static implicit operator BOOL(bool value) => new(value); /// Performs an explicit conversion from to . /// The value. /// The result of the conversion. public static explicit operator int(BOOL value) => unchecked((int)value.val); /// Performs an explicit conversion from to . /// The value. /// The result of the conversion. public static explicit operator uint(BOOL value) => value.val; /// Performs an implicit conversion from to . /// The value. /// The result of the conversion. public static implicit operator bool(BOOL value) => value.Value; /// Indicates whether two instances are not equal. /// The first integral size to compare. /// The second integral size to compare. /// /// if the value of is not equal to the value of ; otherwise, . /// public static bool operator !=(BOOL s1, BOOL s2) => !s1.Equals(s2); /// Indicates whether a specified is less than another specified . /// The first integral size to compare. /// The second integral size to compare. /// /// if the value of is less than the value of ; otherwise, . /// public static bool operator <(BOOL s1, BOOL s2) => s1.CompareTo(s2) < 0; /// Indicates whether a specified is less than or equal to another specified . /// The first integral size to compare. /// The second integral size to compare. /// /// if the value of is less than or equal to the value of ; /// otherwise, . /// public static bool operator <=(BOOL s1, BOOL s2) => s1.CompareTo(s2) <= 0; /// Indicates whether two instances are equal. /// The first integral size to compare. /// The second integral size to compare. /// /// if the value of is equal to the value of ; otherwise, . /// public static bool operator ==(BOOL s1, BOOL s2) => s1.Equals(s2); /// Indicates whether a specified is greater than another specified . /// The first integral size to compare. /// The second integral size to compare. /// /// if the value of is greater than the value of ; otherwise, . /// public static bool operator >(BOOL s1, BOOL s2) => s1.CompareTo(s2) > 0; /// Indicates whether a specified is greater than or equal to another specified . /// The first integral size to compare. /// The second integral size to compare. /// /// if the value of is greater than or equal to the value of ; /// otherwise, . /// public static bool operator >=(BOOL s1, BOOL s2) => s1.CompareTo(s2) >= 0; /// Implements the operator !. /// The value. /// The result of the operator. public static BOOL operator !(BOOL value) => !value.Value; /// public int CompareTo(BOOL other) => Value.CompareTo(other.Value); /// public int CompareTo(bool other) => Value.CompareTo(other); /// public override bool Equals(object obj) => obj is BOOL s ? Equals(s) : (obj is bool b ? Value.Equals(b) : Value.Equals(obj)); /// public bool Equals(BOOL other) => Value.Equals(other.Value); /// public bool Equals(bool other) => Value.Equals(other); /// public override int GetHashCode() => unchecked((int)val); /// public TypeCode GetTypeCode() => Value.GetTypeCode(); /// public override string ToString() => Value.ToString(); /// public string ToString(IFormatProvider provider) => Value.ToString(provider); /// int IComparable.CompareTo(object obj) => Value.CompareTo(Convert.ChangeType(obj, typeof(ulong))); /// bool IConvertible.ToBoolean(IFormatProvider provider) => ((IConvertible)Value).ToBoolean(provider); /// byte IConvertible.ToByte(IFormatProvider provider) => ((IConvertible)Value).ToByte(provider); /// char IConvertible.ToChar(IFormatProvider provider) => ((IConvertible)Value).ToChar(provider); /// DateTime IConvertible.ToDateTime(IFormatProvider provider) => ((IConvertible)Value).ToDateTime(provider); /// decimal IConvertible.ToDecimal(IFormatProvider provider) => ((IConvertible)Value).ToDecimal(provider); /// double IConvertible.ToDouble(IFormatProvider provider) => ((IConvertible)Value).ToDouble(provider); /// short IConvertible.ToInt16(IFormatProvider provider) => ((IConvertible)Value).ToInt16(provider); /// int IConvertible.ToInt32(IFormatProvider provider) => ((IConvertible)Value).ToInt32(provider); /// long IConvertible.ToInt64(IFormatProvider provider) => ((IConvertible)Value).ToInt64(provider); /// sbyte IConvertible.ToSByte(IFormatProvider provider) => ((IConvertible)Value).ToSByte(provider); /// float IConvertible.ToSingle(IFormatProvider provider) => ((IConvertible)Value).ToSingle(provider); /// object IConvertible.ToType(Type conversionType, IFormatProvider provider) => ((IConvertible)Value).ToBoolean(provider); /// ushort IConvertible.ToUInt16(IFormatProvider provider) => ((IConvertible)Value).ToUInt16(provider); /// uint IConvertible.ToUInt32(IFormatProvider provider) => ((IConvertible)Value).ToUInt32(provider); /// ulong IConvertible.ToUInt64(IFormatProvider provider) => ((IConvertible)Value).ToUInt64(provider); internal class BOOLTypeConverter : UInt32Converter { public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) => value is BOOL b ? base.ConvertTo(context, culture, b.Value, destinationType) : throw new ArgumentException(null, nameof(value)); public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) => new BOOL((uint)base.ConvertFrom(context, culture, value)); } }