2002-07-10 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / corlib / System / Char.cs
index 284deeeffd53c6e938b0f5907263648e428a2544..58e5dc33ab6b007959447b33e2e86857f7ff2914 100644 (file)
 // doesn't list this class as implementing IFormattable.
 
 using System.Globalization;
+using System.Runtime.CompilerServices;
 
 namespace System {
        
-       public struct Char : IComparable { //, IFormattable, IConvertible {
+       [Serializable]
+       public struct Char : IComparable, IConvertible { //, IFormattable {
                public const char MaxValue = (char) 0xffff;
                public const char MinValue = (char) 0;
                
                // VES needs to know about value.  public is workaround
                // so source will compile
-               public byte value;
+               public char value;
                
                public int CompareTo (object v)
                {
-                       if (!(v is System.Byte))
-                               throw new ArgumentException ("Value is not a System.Byte");
+                       if (v == null)
+                               return 1;
+                       
+                       if (!(v is System.Char))
+                               throw new ArgumentException (Locale.GetText ("Value is not a System.Char"));
+
+                       char xv = (char) v;
+                       if (value == xv)
+                               return 0;
 
-                       return value - ((byte) v);
+                       if (value > xv)
+                               return 1;
+                       else
+                               return -1;
                }
 
                public override bool Equals (object o)
                {
-                       if (!(o is System.Byte))
+                       if (!(o is System.Char))
                                return false;
 
-                       return ((byte) o) == value;
+                       return ((Char) o) == value;
                }
 
                public override int GetHashCode ()
@@ -47,293 +59,341 @@ namespace System {
                        return value;
                }
 
-               public static double GetNumericValue (char c)
-               {
-                       if ((c >= 48) && (c <= 57))
-                               return (double) (c - '0');
-                       return -1;
-               }
+               [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+               public static extern double GetNumericValue (char c);
 
                public static double GetNumericValue (string str, int index)
                {
                        if (str == null) 
-                               throw new ArgumentNullException ("Str is a null reference");
+                               throw new ArgumentNullException (Locale.GetText ("str is a null reference"));
                        
                        if (index < 0 || index >= str.Length)
-                               throw new ArgumentOutOfRangeException
-                               ("The value of index is less than zero, or greater than or equal to the length of str");
+                               throw new ArgumentOutOfRangeException (Locale.GetText (
+                                       "The value of index is less than zero, or greater than or equal to the length of str"));
+                                       
                        
                        return GetNumericValue (str[index]);
                }
 
-               public static UnicodeCategory GetUnicodeCategory (char c) 
-               { 
-                       // TODO: Implement me
-                       return UnicodeCategory.OtherSymbol;
-               }
+               [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+               public static extern UnicodeCategory GetUnicodeCategory (char c); 
 
                public static UnicodeCategory GetUnicodeCategory (string str, int index) {
                        if (str == null) 
-                               throw new ArgumentNullException ("Str is a null reference");
+                               throw new ArgumentNullException (Locale.GetText ("str is a null reference"));
                        
                        if (index < 0 || index >= str.Length)
-                               throw new ArgumentOutOfRangeException
-                               ("The value of index is less than zero, or greater than or equal to the length of str");
+                               throw new ArgumentOutOfRangeException (Locale.GetText ("The value of index is less "+
+                                                         "than zero, or greater than or equal to the length of str"));
                        
                        return GetUnicodeCategory (str[index]);
                }
 
-               public static bool IsControl (char c)
-               {
-                       // TODO: Make me Unicode aware
-                       return ((c > 1) && (c < 32));
-               }
+               [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+               public static extern bool IsControl (char c);
 
                public static bool IsControl (string str, int index)
                {
                        if (str == null) 
-                               throw new ArgumentNullException ("Str is a null reference");
+                               throw new ArgumentNullException (Locale.GetText ("Str is a null reference"));
                        
                        if (index < 0 || index >= str.Length)
-                               throw new ArgumentOutOfRangeException
-                               ("The value of index is less than zero, or greater than or equal to the length of str");
+                               throw new ArgumentOutOfRangeException (Locale.GetText (
+                                       "The value of index is less than zero, or greater than or equal to the length of str"));
                        
                        return IsControl (str[index]);
                }
                
-               public static bool IsDigit (char c)
-               {
-                       return ((c >= '0') && (c <= '9'));
-               }
+               [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+               public static extern bool IsDigit (char c);
 
                public static bool IsDigit (string str, int index)
                {
                        if (str == null) 
-                               throw new ArgumentNullException ("Str is a null reference");
+                               throw new ArgumentNullException (Locale.GetText ("Str is a null reference"));
                        
                        if (index < 0 || index >= str.Length)
-                               throw new ArgumentOutOfRangeException
-                               ("The value of index is less than zero, or greater than or equal to the length of str");
+                               throw new ArgumentOutOfRangeException (Locale.GetText (
+                                "The value of index is less than zero, or greater than or equal to the length of str"));
                        
                        return IsDigit (str[index]);
                }
 
-               public static bool IsLetter (char c)
-               {
-                       // TODO: Make me Unicode aware
-                       return ((c >= 65) && (c <= 126));
-               }
+               [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+               public static extern bool IsLetter (char c);
 
                public static bool IsLetter (string str, int index)
                {
                        if (str == null) 
-                               throw new ArgumentNullException ("Str is a null reference");
+                               throw new ArgumentNullException (Locale.GetText ("str is a null reference"));
                        
                        if (index < 0 || index >= str.Length)
-                               throw new ArgumentOutOfRangeException
-                               ("The value of index is less than zero, or greater than or equal to the length of str");
+                               throw new ArgumentOutOfRangeException (Locale.GetText (
+                                "The value of index is less than zero, or greater than or equal to the length of str"));
                        
                        return IsLetter (str[index]);
                }
 
                public static bool IsLetterOrDigit (char c)
                {
-                       // TODO: Implement me
-                       return false;
+                       if (IsLetter (c) == false && IsDigit (c) == false)
+                               return false;
+                       else
+                               return true;
                }
 
                public static bool IsLetterOrDigit (string str, int index)
                {
                        if (str == null) 
-                               throw new ArgumentNullException ("Str is a null reference");
+                               throw new ArgumentNullException (Locale.GetText ("str is a null reference"));
                        
                        if (index < 0 || index >= str.Length)
-                               throw new ArgumentOutOfRangeException
-                               ("The value of index is less than zero, or greater than or equal to the length of str");
+                               throw new ArgumentOutOfRangeException (Locale.GetText (
+                                "The value of index is less than zero, or greater than or equal to the length of str"));
                        
                        return IsLetterOrDigit (str[index]);
                }
-               
-               public static bool IsLower (char c)
-               {
-                       // TODO: Implement me
-                       return false;
-               }
+
+               [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+               public static extern bool IsLower (char c);
                
                public static bool IsLower (string str, int index)
                {
                        if (str == null) 
-                               throw new ArgumentNullException ("Str is a null reference");
+                               throw new ArgumentNullException (Locale.GetText ("str is a null reference"));
                        
                        if (index < 0 || index >= str.Length)
-                               throw new ArgumentOutOfRangeException
-                               ("The value of index is less than zero, or greater than or equal to the length of str");
+                               throw new ArgumentOutOfRangeException (Locale.GetText (
+                                "The value of index is less than zero, or greater than or equal to the length of str"));
                        
                        return IsLower (str[index]);
                }
 
-               public static bool IsNumber (char c)
-               {
-                       // TODO: Implement me
-                       return false;
-               }
+               [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+               public static extern bool IsNumber (char c);
                
                public static bool IsNumber (string str, int index)
                {
                        if (str == null) 
-                               throw new ArgumentNullException ("Str is a null reference");
+                               throw new ArgumentNullException (Locale.GetText ("str is a null reference"));
                        
                        if (index < 0 || index >= str.Length)
-                               throw new ArgumentOutOfRangeException
-                               ("The value of index is less than zero, or greater than or equal to the length of str");
+                               throw new ArgumentOutOfRangeException (Locale.GetText (
+                               "The value of index is less than zero, or greater than or equal to the length of str"));
                        
                        return IsNumber (str[index]);
                }
 
-               public static bool IsPunctuation (char c)
-               {
-                       // TODO: Implement me
-                       return false;
-               }
+               [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+               public static extern bool IsPunctuation (char c);
                
                public static bool IsPunctuation (string str, int index)
                {
                        if (str == null) 
-                               throw new ArgumentNullException ("Str is a null reference");
+                               throw new ArgumentNullException (Locale.GetText ("str is a null reference"));
                        
                        if (index < 0 || index >= str.Length)
-                               throw new ArgumentOutOfRangeException
-                               ("The value of index is less than zero, or greater than or equal to the length of str");
+                               throw new ArgumentOutOfRangeException (Locale.GetText (
+                                "The value of index is less than zero, or greater than or equal to the length of str"));
                        
                        return IsPunctuation (str[index]);
                }
 
-               public static bool IsSeparator (char c)
-               {
-                       // TODO: Implement me
-                       return false;
-               }
+               [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+               public static extern bool IsSeparator (char c);
                
                public static bool IsSeparator (string str, int index)
                {
                        if (str == null) 
-                               throw new ArgumentNullException ("Str is a null reference");
+                               throw new ArgumentNullException (Locale.GetText ("str is a null reference"));
                        
                        if (index < 0 || index >= str.Length)
-                               throw new ArgumentOutOfRangeException
-                               ("The value of index is less than zero, or greater than or equal to the length of str");
+                               throw new ArgumentOutOfRangeException (Locale.GetText (
+                                "The value of index is less than zero, or greater than or equal to the length of str"));
                        
                        return IsSeparator (str[index]);
                }
 
-               public static bool IsSurrogate (char c)
-               {
-                       // TODO: Implement me
-                       return false;
-               }
+               [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+               public static extern bool IsSurrogate (char c);
                
                public static bool IsSurrogate (string str, int index)
                {
                        if (str == null) 
-                               throw new ArgumentNullException ("Str is a null reference");
+                               throw new ArgumentNullException (Locale.GetText ("str is a null reference"));
                        
                        if (index < 0 || index >= str.Length)
-                               throw new ArgumentOutOfRangeException
-                               ("The value of index is less than zero, or greater than or equal to the length of str");
+                               throw new ArgumentOutOfRangeException (Locale.GetText (
+                                "The value of index is less than zero, or greater than or equal to the length of str"));
                        
                        return IsSurrogate (str[index]);
                }
 
-               public static bool IsSymbol (char c)
-               {
-                       // TODO: Implement me
-                       return false;
-               }
+               [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+               public static extern bool IsSymbol (char c);
                
                public static bool IsSymbol (string str, int index)
                {
                        if (str == null) 
-                               throw new ArgumentNullException ("Str is a null reference");
+                               throw new ArgumentNullException (Locale.GetText ("str is a null reference"));
                        
                        if (index < 0 || index >= str.Length)
-                               throw new ArgumentOutOfRangeException
-                               ("The value of index is less than zero, or greater than or equal to the length of str");
+                               throw new ArgumentOutOfRangeException (Locale.GetText (
+                                       "The value of index is less than zero, or greater than or equal to the length of str"));
                        
                        return IsSymbol (str[index]);
                }
 
-               public static bool IsUpper (char c)
-               {
-                       // TODO: Implement me
-                       return false;
-               }
+               [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+               public static extern bool IsUpper (char c);
                
                public static bool IsUpper (string str, int index)
                {
                        if (str == null) 
-                               throw new ArgumentNullException ("Str is a null reference");
+                               throw new ArgumentNullException (Locale.GetText ("str is a null reference"));
                        
                        if (index < 0 || index >= str.Length)
-                               throw new ArgumentOutOfRangeException
-                               ("The value of index is less than zero, or greater than or equal to the length of str");
+                               throw new ArgumentOutOfRangeException (Locale.GetText (
+                                "The value of index is less than zero, or greater than or equal to the length of str"));
                        
                        return IsUpper (str[index]);
                }
 
-               public static bool IsWhiteSpace (char c)
-               {
-                       // TODO: Implement me
-                       return false;
-               }
+               [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+               public static extern bool IsWhiteSpace (char c);
                
                public static bool IsWhiteSpace (string str, int index)
                {
                        if (str == null) 
-                               throw new ArgumentNullException ("Str is a null reference");
+                               throw new ArgumentNullException (Locale.GetText ("str is a null reference"));
                        
                        if (index < 0 || index >= str.Length)
-                               throw new ArgumentOutOfRangeException
-                               ("The value of index is less than zero, or greater than or equal to the length of str");
+                               throw new ArgumentOutOfRangeException (Locale.GetText (
+                                       "The value of index is less than zero, or greater than or equal to the length of str"));
                        
                        return IsWhiteSpace (str[index]);
                }
 
                public static char Parse (string str)
                {
-                       // TODO: Implement me
-                       return (char) 0;
-               }
+                       if (str == null)
+                               throw new ArgumentNullException (Locale.GetText ("str is a null reference"));
 
-               public static char ToLower (char c)
-               {
-                       // TODO: make me unicode aware
-                       return (c >= 'A' && c <= 'Z') ? (char) (c + 33) : c;
+                       if (str.Length != 1)
+                               throw new FormatException ("string contains more than one character.");
+                       
+                       return str [0];
                }
 
-               public static char ToUpper (char c)
-               {
-                       // TODO: make me unicode aware
-                       return (char) ((c >= 'a' && c <= 'z') ? c - 33 : c);
-               }
+               [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+               public static extern char ToLower (char c);
+
+               [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
+               public static extern char ToUpper (char c);
 
                public override string ToString ()
                {
                        // LAMESPEC: ECMA draft lists this as returning ToString (null), 
                        // However it doesn't list another ToString() method.
-                       return ToString (null);
+                       return new String (value, 1);
                }
 
                public string ToString (IFormatProvider fp)
                {
                        // LAMESPEC: ECMA draft doesn't say Char implements IFormattable
-                       return "";
+                       return new String (value, 1);
                }
 
                // =========== IConvertible Methods =========== //
                
                public TypeCode GetTypeCode ()
                {
-                       return TypeCode.Byte;
+                       return TypeCode.Char;
                }         
+
+               object IConvertible.ToType (Type conversionType, IFormatProvider provider)
+               {
+                       return System.Convert.ToType(value, conversionType, provider);
+               }
+               
+               bool IConvertible.ToBoolean (IFormatProvider provider)
+               {
+                       throw new InvalidCastException();
+               }
+               
+               byte IConvertible.ToByte (IFormatProvider provider)
+               {
+                       return System.Convert.ToByte(value);
+               }
+               
+               char IConvertible.ToChar (IFormatProvider provider)
+               {
+                       return value;
+               }
+               
+               [CLSCompliant(false)]
+               DateTime IConvertible.ToDateTime (IFormatProvider provider)
+               {
+                       throw new InvalidCastException();
+               }
+               
+               decimal IConvertible.ToDecimal (IFormatProvider provider)
+               {
+                       throw new InvalidCastException();
+               }
+               
+               double IConvertible.ToDouble (IFormatProvider provider)
+               {
+                       throw new InvalidCastException();
+               }
+               
+               short IConvertible.ToInt16 (IFormatProvider provider)
+               {
+                       return System.Convert.ToInt16(value);
+               }
+               
+               int IConvertible.ToInt32 (IFormatProvider provider)
+               {
+                       return System.Convert.ToInt32(value);
+               }
+               
+               long IConvertible.ToInt64 (IFormatProvider provider)
+               {
+                       return System.Convert.ToInt64(value);
+               }
+               
+               [CLSCompliant(false)] 
+               sbyte IConvertible.ToSByte (IFormatProvider provider)
+               {
+                       return System.Convert.ToSByte(value);
+               }
+               
+               float IConvertible.ToSingle (IFormatProvider provider)
+               {
+                       throw new InvalidCastException();
+               }
+               
+               string IConvertible.ToString (IFormatProvider provider)
+               {
+                       return ToString(provider);
+               }
+
+               [CLSCompliant(false)]
+               ushort IConvertible.ToUInt16 (IFormatProvider provider)
+               {
+                       return System.Convert.ToUInt16(value);
+               }
+               
+               [CLSCompliant(false)]
+               uint IConvertible.ToUInt32 (IFormatProvider provider)
+               {
+                       return System.Convert.ToUInt32(value);
+               }
+               
+               [CLSCompliant(false)]
+               ulong IConvertible.ToUInt64 (IFormatProvider provider)
+               {
+                       return System.Convert.ToUInt64(value);
+               }
        }
 }