The Labs \ Source Viewer \ SSCLI \ System \ Boolean

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. /*============================================================
  16. **
  17. ** Class:  Boolean
  18. **
  19. **
  20. ** Purpose: The boolean class serves as a wrapper for the primitive
  21. ** type boolean.
  22. **
  23. **
  24. ===========================================================*/
  25. namespace System
  26. {
  27.    
  28.     using System;
  29.     using System.Globalization;
  30.     // The Boolean class provides the
  31.     // object representation of the boolean primitive type.
  32.     [Serializable()]
  33.     [System.Runtime.InteropServices.ComVisible(true)]
  34.     public struct Boolean : IComparable, IConvertible, IComparable<bool>, IEquatable<bool>
  35.     {
  36.        
  37.         //
  38.         // Member Variables
  39.         //
  40.         private bool m_value;
  41.        
  42.         private static char[] m_trimmableChars;
  43.        
  44.         // The true value.
  45.         //
  46.         internal const int True = 1;
  47.        
  48.         // The false value.
  49.         //
  50.         internal const int False = 0;
  51.        
  52.        
  53.         //
  54.         // Internal Constants are real consts for performance.
  55.         //
  56.        
  57.         // The internal string representation of true.
  58.         //
  59.         internal const string TrueLiteral = "True";
  60.        
  61.         // The internal string representation of false.
  62.         //
  63.         internal const string FalseLiteral = "False";
  64.        
  65.        
  66.         //
  67.         // Public Constants
  68.         //
  69.        
  70.         // The public string representation of true.
  71.         //
  72.         public static readonly string TrueString = TrueLiteral;
  73.        
  74.         // The public string representation of false.
  75.         //
  76.         public static readonly string FalseString = FalseLiteral;
  77.        
  78.         //
  79.         // Overriden Instance Methods
  80.         //
  81. /*=================================GetHashCode==================================
  82.       **Args:  None
  83.       **Returns: 1 or 0 depending on whether this instance represents true or false.
  84.       **Exceptions: None
  85.       **Overriden From: Value
  86.       ==============================================================================*/       
  87.         // Provides a hash code for this instance.
  88.         public override int GetHashCode()
  89.         {
  90.             return (m_value) ? True : False;
  91.         }
  92.        
  93. /*===================================ToString===================================
  94.       **Args: None
  95.       **Returns:  "True" or "False" depending on the state of the boolean.
  96.       **Exceptions: None.
  97.       ==============================================================================*/       
  98.         // Converts the boolean value of this instance to a String.
  99.         public override string ToString()
  100.         {
  101.             if (false == m_value) {
  102.                 return FalseLiteral;
  103.             }
  104.             return TrueLiteral;
  105.         }
  106.        
  107.         public string ToString(IFormatProvider provider)
  108.         {
  109.             if (false == m_value) {
  110.                 return FalseLiteral;
  111.             }
  112.             return TrueLiteral;
  113.         }
  114.        
  115.         // Determines whether two Boolean objects are equal.
  116.         public override bool Equals(object obj)
  117.         {
  118.             //If it's not a boolean, we're definitely not equal
  119.             if (!(obj is bool)) {
  120.                 return false;
  121.             }
  122.            
  123.             return (m_value == ((bool)obj).m_value);
  124.         }
  125.        
  126.         public bool Equals(bool obj)
  127.         {
  128.             return m_value == obj;
  129.         }
  130.        
  131.         // Compares this object to another object, returning an integer that
  132.         // indicates the relationship. For booleans, false sorts before true.
  133.         // null is considered to be less than any instance.
  134.         // If object is not of type boolean, this method throws an ArgumentException.
  135.         //
  136.         // Returns a value less than zero if this object
  137.         //
  138.         public int CompareTo(object obj)
  139.         {
  140.             if (obj == null) {
  141.                 return 1;
  142.             }
  143.             if (!(obj is bool)) {
  144.                 throw new ArgumentException(Environment.GetResourceString("Arg_MustBeBoolean"));
  145.             }
  146.            
  147.             if (m_value == ((bool)obj).m_value) {
  148.                 return 0;
  149.             }
  150.             else if (m_value == false) {
  151.                 return -1;
  152.             }
  153.             return 1;
  154.         }
  155.        
  156.         public int CompareTo(bool value)
  157.         {
  158.             if (m_value == value) {
  159.                 return 0;
  160.             }
  161.             else if (m_value == false) {
  162.                 return -1;
  163.             }
  164.             return 1;
  165.         }
  166.        
  167.         //
  168.         // Static Methods
  169.         //
  170.        
  171.         // Determines whether a String represents true or false.
  172.         //
  173.         public static bool Parse(string value)
  174.         {
  175.             if (value == null)
  176.                 throw new ArgumentNullException("value");
  177.             bool result = false;
  178.             if (!TryParse(value, out result)) {
  179.                 throw new FormatException(Environment.GetResourceString("Format_BadBoolean"));
  180.             }
  181.             else {
  182.                 return result;
  183.             }
  184.         }
  185.        
  186.         // Determines whether a String represents true or false.
  187.         //
  188.         public static bool TryParse(string value, out bool result)
  189.         {
  190.             result = false;
  191.             if (value == null) {
  192.                 return false;
  193.             }
  194.             // For perf reasons, let's first see if they're equal, then do the
  195.             // trim to get rid of white space, and check again.
  196.             if (TrueLiteral.Equals(value, StringComparison.OrdinalIgnoreCase)) {
  197.                 result = true;
  198.                 return true;
  199.             }
  200.             if (FalseLiteral.Equals(value, StringComparison.OrdinalIgnoreCase)) {
  201.                 result = false;
  202.                 return true;
  203.             }
  204.            
  205.             // Special case: Trim whitespace as well as null characters.
  206.             // Solution: Lazily initialize a new character array including 0x0000
  207.             if (null == m_trimmableChars) {
  208.                 char[] m_trimmableCharsTemp = new char[String.WhitespaceChars.Length + 1];
  209.                 Array.Copy(String.WhitespaceChars, m_trimmableCharsTemp, String.WhitespaceChars.Length);
  210.                 m_trimmableCharsTemp[m_trimmableCharsTemp.Length - 1] = (char)0;
  211.                 m_trimmableChars = m_trimmableCharsTemp;
  212.             }
  213.            
  214.             value = value.Trim(m_trimmableChars);
  215.             // Remove leading & trailing white space.
  216.             if (TrueLiteral.Equals(value, StringComparison.OrdinalIgnoreCase)) {
  217.                 result = true;
  218.                 return true;
  219.             }
  220.            
  221.             if (FalseLiteral.Equals(value, StringComparison.OrdinalIgnoreCase)) {
  222.                 result = false;
  223.                 return true;
  224.             }
  225.            
  226.             return false;
  227.         }
  228.        
  229.         //
  230.         // IValue implementation
  231.         //
  232.        
  233.         public TypeCode GetTypeCode()
  234.         {
  235.             return TypeCode.Boolean;
  236.         }
  237.        
  238.        
  239.         /// <internalonly/>
  240.         bool IConvertible.ToBoolean(IFormatProvider provider)
  241.         {
  242.             return m_value;
  243.         }
  244.        
  245.         /// <internalonly/>
  246.         char IConvertible.ToChar(IFormatProvider provider)
  247.         {
  248.             throw new InvalidCastException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("InvalidCast_FromTo"), "Boolean", "Char"));
  249.         }
  250.        
  251.         /// <internalonly/>
  252.         sbyte IConvertible.ToSByte(IFormatProvider provider)
  253.         {
  254.             return Convert.ToSByte(m_value);
  255.         }
  256.        
  257.         /// <internalonly/>
  258.         byte IConvertible.ToByte(IFormatProvider provider)
  259.         {
  260.             return Convert.ToByte(m_value);
  261.         }
  262.        
  263.         /// <internalonly/>
  264.         short IConvertible.ToInt16(IFormatProvider provider)
  265.         {
  266.             return Convert.ToInt16(m_value);
  267.         }
  268.        
  269.         /// <internalonly/>
  270.         ushort IConvertible.ToUInt16(IFormatProvider provider)
  271.         {
  272.             return Convert.ToUInt16(m_value);
  273.         }
  274.        
  275.         /// <internalonly/>
  276.         int IConvertible.ToInt32(IFormatProvider provider)
  277.         {
  278.             return Convert.ToInt32(m_value);
  279.         }
  280.        
  281.         /// <internalonly/>
  282.         uint IConvertible.ToUInt32(IFormatProvider provider)
  283.         {
  284.             return Convert.ToUInt32(m_value);
  285.         }
  286.        
  287.         /// <internalonly/>
  288.         long IConvertible.ToInt64(IFormatProvider provider)
  289.         {
  290.             return Convert.ToInt64(m_value);
  291.         }
  292.        
  293.         /// <internalonly/>
  294.         ulong IConvertible.ToUInt64(IFormatProvider provider)
  295.         {
  296.             return Convert.ToUInt64(m_value);
  297.         }
  298.        
  299.         /// <internalonly/>
  300.         float IConvertible.ToSingle(IFormatProvider provider)
  301.         {
  302.             return Convert.ToSingle(m_value);
  303.         }
  304.        
  305.         /// <internalonly/>
  306.         double IConvertible.ToDouble(IFormatProvider provider)
  307.         {
  308.             return Convert.ToDouble(m_value);
  309.         }
  310.        
  311.         /// <internalonly/>
  312.         decimal IConvertible.ToDecimal(IFormatProvider provider)
  313.         {
  314.             return Convert.ToDecimal(m_value);
  315.         }
  316.        
  317.         /// <internalonly/>
  318.         DateTime IConvertible.ToDateTime(IFormatProvider provider)
  319.         {
  320.             throw new InvalidCastException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("InvalidCast_FromTo"), "Boolean", "DateTime"));
  321.         }
  322.        
  323.         /// <internalonly/>
  324.         object IConvertible.ToType(Type type, IFormatProvider provider)
  325.         {
  326.             return Convert.DefaultToType((IConvertible)this, type, provider);
  327.         }
  328.     }
  329. }

Developer Fusion