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));
}
}