// System.Data.SqlTypes.SqlBoolean // // Authors: // Konstantin Triger // Boris Kirzner // // (C) 2005 Mainsoft Corporation (http://www.mainsoft.com) // // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // namespace System.Data.SqlTypes { public struct SqlBoolean : INullable, IComparable { private bool _value; private bool _isNull; public static readonly SqlBoolean Null = new SqlBoolean(true, false); public static readonly SqlBoolean True = new SqlBoolean(true); public static readonly SqlBoolean False = new SqlBoolean(false); public static readonly SqlBoolean One = new SqlBoolean(1); public static readonly SqlBoolean Zero = new SqlBoolean(0); private SqlBoolean(bool isNull, bool value) { _isNull = isNull; _value = value; } /** * Initializes a new instance of the SqlBoolean instance using the supplied bool value. * @param value The value for the new SqlBoolean instance; either true or false. */ public SqlBoolean(bool value) { _value = value; _isNull = false; } /** * Initializes a new instance of the SqlBoolean instance using the specified integer value. * @param value The integer whose value is to be used for the new SqlBoolean instance. */ public SqlBoolean(int value) { if (value == 0) _value = false; else _value = true; _isNull = false; } public int hashCode() { if (IsNull) return 0; return _value.GetHashCode(); } /** * Indicates whether or not Value is null. * @return true if Value is null, otherwise false. */ public bool IsNull { get { return _isNull; } } /** * Gets the value of the SqlBoolean instance as a byte. * @return A byte representing the value of the SqlBoolean instance. * Byte value will be 1 or 0. */ public int ByteValue { get { if (IsNull) { throw new SqlNullValueException(); } if (_value) return 1; return 0; } } /** * Indicates whether the current Value is False. * @return true if Value is False, otherwise false. */ public bool IsFalse { get { return Value == false; } } /** * Indicates whether the current Value is True. * @return true if Value is True, otherwise false. */ public bool IsTrue { get { return Value == true; } } /** * Gets the value of the SqlBoolean instance. * @return the value of this instance */ public bool Value { get { if (IsNull) { throw new SqlNullValueException(); } return _value; } } /** * Computes the bitwise AND of two specified SqlBoolean instances. * @param x A SqlBoolean instance * @param y A SqlBoolean instance * @return The result of the logical AND operation. */ public static SqlBoolean And(SqlBoolean x, SqlBoolean y) { if (x.IsNull || y.IsNull) return SqlBoolean.Null; bool res = x.IsTrue && y.IsTrue; return new SqlBoolean(res); } /** * Performs a bitwise OR operation on the two specified SqlBoolean instances. * @param x A SqlBoolean instance * @param y A SqlBoolean instance * @return The result of the logical OR operation. */ public static SqlBoolean Or(SqlBoolean x, SqlBoolean y) { if (x.IsNull || y.IsNull) return SqlBoolean.Null; bool res = x.IsTrue || y.IsTrue; return new SqlBoolean(res); } /** * Compares this instance to the supplied object and returns an indication of their relative values. * @param obj The object to compare. * @return A signed number indicating the relative values of the instance and the object. * Less than zero This instance is less than object. * Zero This instance is the same as object. * Greater than zero This instance is greater than object -or- * object is a null reference. */ public int CompareTo(Object obj) { if (obj == null) return 1; if ((obj is SqlBoolean) == false) { throw new ArgumentException("Wrong value type " + obj.GetType().Name + "in SqlBoolean.CompareTo"); } SqlBoolean val = (SqlBoolean)obj; if (this.IsNull) { if (val.IsNull) return 0; return -1; } else if (val.IsNull) return 1; if (this.IsTrue && val.IsFalse) return 1; if (this.IsFalse && val.IsTrue) return -1; return 0; } /** * Compares the supplied object parameter to the Value property of the SqlBoolean object. * @param obj The object to be compared. * @return true if object is an instance of SqlBoolean and the two are equal; otherwise false. */ public bool equals(Object obj) { if (obj == null) return false; if (obj is SqlBoolean) { SqlBoolean val = (SqlBoolean)obj; if (IsNull && val.IsNull) return true; if (IsNull || val.IsNull) return false; return val._value == _value; } return false; } /** * Performs a logical comparison on two instances of SqlBoolean to determine if they are equal. * @param x A SqlBoolean instance. * @param y A SqlBoolean instance. * @return true if the two values are equal, otherwise false. * If one of the parameters is null or null value return SqlBoolean.Null. */ public static SqlBoolean Equals(SqlBoolean x, SqlBoolean y) { if (x.IsNull || y.IsNull) return SqlBoolean.Null; return new SqlBoolean(x._value == y._value); } /** * Compares two instances of SqlBoolean to determine if they are equal. * @param x A SqlBoolean instance * @param y A SqlBoolean instance * @return A SqlBoolean that is True if the two instances are not equal or False if the two instances are equal. * If either instance of SqlDouble is null, the Value of the SqlBoolean will be Null. */ public static SqlBoolean NotEquals(SqlBoolean x, SqlBoolean y) { if (x.IsNull || y.IsNull) return SqlBoolean.Null; return new SqlBoolean(x._value != y._value); } public static SqlBoolean OnesComplement(SqlBoolean x) { if (x.IsNull) { throw new SqlNullValueException(); } return new SqlBoolean(x._value == false); } /** * Converts the String representation of a number to its bool equivalent. * @param s The String to be parsed. * @return A SqlBoolean containing the value represented by the String. */ public static SqlBoolean Parse(String s) { int val = int.Parse(s); return new SqlBoolean(val); } /** * Performs a bitwise XOR operation on the two specified SqlBoolean instances. * @param x A SqlBoolean instance * @param y A SqlBoolean instance * @return The result of the logical XOR operation. */ public static SqlBoolean Xor(SqlBoolean x, SqlBoolean y) { if (x.IsNull || y.IsNull) return SqlBoolean.Null; if (x.IsTrue && y.IsTrue) return new SqlBoolean(false); if (x.IsTrue || y.IsTrue) return new SqlBoolean(true); return new SqlBoolean(false); // both args are False } /** * Converts this SqlBoolean instance to SqlByte. * @return A SqlByte instance whose Value equals the Value of this SqlDouble instance. */ public SqlByte ToSqlByte() { if (IsNull) return SqlByte.Null; return new SqlByte((byte)ByteValue); } /** * Converts this SqlBoolean instance to SqlDecimal. * @return A SqlDecimal instance whose Value equals the Value of this SqlBoolean instance. */ public SqlDecimal ToSqlDecimal() { if (IsNull) return SqlDecimal.Null; return new SqlDecimal(ByteValue); } /** * Converts this SqlBoolean instance to SqlDouble. * @return A SqlDouble instance whose Value equals the Value of this SqlBoolean instance. */ public SqlDouble ToSqlDouble() { if (IsNull) return SqlDouble.Null; return new SqlDouble(ByteValue); } /** * Converts this SqlBoolean instance to SqlSingle. * @return A SqlSingle instance whose Value equals the Value of this SqlBoolean instance. */ public SqlSingle ToSqlSingle() { if (IsNull) return SqlSingle.Null; return new SqlSingle(ByteValue); } /** * Converts this SqlBoolean instance to SqlDouble. * @return A SqlDouble instance whose Value equals the Value of this SqlBoolean instance. */ public SqlInt16 ToSqlInt16() { if (IsNull) return SqlInt16.Null; return new SqlInt16(ByteValue); } /** * Converts this SqlBoolean instance to SqlDouble. * @return A SqlDouble instance whose Value equals the Value of this SqlBoolean instance. */ public SqlInt32 ToSqlInt32() { if (IsNull) return SqlInt32.Null; return new SqlInt32(ByteValue); } /** * Converts this SqlBoolean instance to SqlDouble. * @return A SqlDouble instance whose Value equals the Value of this SqlBoolean instance. */ public SqlInt64 ToSqlInt64() { if (IsNull) return SqlInt64.Null; return new SqlInt64(ByteValue); } /** * Converts this SqlBoolean instance to SqlDecimal. * @return A SqlMoney instance whose Value equals the Value of this SqlBoolean instance. */ public SqlMoney ToSqlMoney() { if (IsNull) return SqlMoney.Null; return new SqlMoney(ByteValue); } /** * Converts this SqlBoolean structure to SqlString. * @return A SqlString structure whose value is a string representing the date and time contained in this SqlBoolean structure. */ public SqlString ToSqlString() { if (IsNull) return SqlString.Null; return new SqlString(ToString()); } public override String ToString() { if (IsNull) return "null"; return _value.ToString(); } public static SqlBoolean op_Implicit(bool x) { return new SqlBoolean(x); } public static bool op_Explicit(SqlBoolean x) { return x.Value; } public static SqlBoolean op_LogicalNot(SqlBoolean x) { return OnesComplement(x); } public static bool op_True(SqlBoolean x) { return x.IsTrue; } public static bool op_False(SqlBoolean x) { return x.IsFalse; } public static SqlBoolean op_BitwiseAnd(SqlBoolean x, SqlBoolean y) { return And(x, y); } public static SqlBoolean op_BitwiseOr(SqlBoolean x, SqlBoolean y) { return Or(x, y); } public static SqlBoolean op_OnesComplement(SqlBoolean x) { return OnesComplement(x); } public static SqlBoolean op_ExclusiveOr(SqlBoolean x, SqlBoolean y) { return Xor(x, y); } public static SqlBoolean op_Explicit(SqlByte x) { if (x.IsNull) return SqlBoolean.Null; return new SqlBoolean(x.Value != 0); } public static SqlBoolean op_Explicit(SqlInt16 x) { if (x.IsNull) return SqlBoolean.Null; return new SqlBoolean(x.Value != 0); } public static SqlBoolean op_Explicit(SqlInt32 x) { if (x.IsNull) return SqlBoolean.Null; return new SqlBoolean(x.Value != 0); } public static SqlBoolean op_Explicit(SqlInt64 x) { if (x.IsNull) return SqlBoolean.Null; return new SqlBoolean(x.Value != 0L); } public static SqlBoolean op_Explicit(SqlDouble x) { if (x.IsNull) return SqlBoolean.Null; return new SqlBoolean(x.Value != 0.0D); } public static SqlBoolean op_Explicit(SqlSingle x) { if (x.IsNull) return SqlBoolean.Null; return new SqlBoolean(x.Value != 0.0F); } public static SqlBoolean op_Explicit(SqlMoney x) { if (x.IsNull) return SqlBoolean.Null; return SqlMoney.NotEquals(x, SqlMoney.Zero); } public static SqlBoolean op_Explicit(SqlDecimal x) { if (x.IsNull) return SqlBoolean.Null; return new SqlBoolean(x.ToDouble() != 0.0D); } public static SqlBoolean op_Explicit(SqlString x) { if (x.IsNull) return SqlBoolean.Null; return Parse(x.Value); } public static SqlBoolean op_Equality(SqlBoolean x, SqlBoolean y) { return Equals(x, y); } public static SqlBoolean op_Inequality(SqlBoolean x, SqlBoolean y) { return NotEquals(x, y); } }}