2008-05-19 Sebastien Pouliot <sebastien@ximian.com>
[mono.git] / mcs / class / corlib / System / UInt64.cs
index 79af1c8f330fcd6cb3eedcc8e460906a9eac63b4..424f8f7a428e78e951173fdb9e6c0788c7cf2cb1 100644 (file)
@@ -34,6 +34,9 @@ namespace System
 {
        [Serializable]
        [CLSCompliant (false)]
+#if NET_2_0
+       [System.Runtime.InteropServices.ComVisible (true)]
+#endif
        public struct UInt64 : IFormattable, IConvertible, IComparable
 #if NET_2_0
                , IComparable<UInt64>, IEquatable <UInt64>
@@ -52,13 +55,12 @@ namespace System
                        if (!(value is System.UInt64))
                                throw new ArgumentException (Locale.GetText ("Value is not a System.UInt64."));
 
-                       if (this.m_value == (ulong) value)
-                               return 0;
+                       ulong int64 = (ulong) value;
 
-                       if (this.m_value < (ulong) value)
-                               return -1;
+                       if (m_value == int64)
+                               return 0;
 
-                       return 1;
+                       return (m_value < int64) ? -1 : 1;
                }
 
                public override bool Equals (object obj)
@@ -85,9 +87,9 @@ namespace System
                                return -1;
                }
 
-               public bool Equals (ulong value)
+               public bool Equals (ulong obj)
                {
-                       return value == m_value;
+                       return obj == m_value;
                }
 #endif
 
@@ -244,7 +246,16 @@ namespace System
                                        else
                                                digitValue = (ulong) (hexDigit - 'A' + 10);
 
-                                       number = checked (number * 16 + digitValue);
+                                       if (tryParse){
+                                               // Any number above 32 will do 
+                                               bool can_overflow = number > 0xffff;
+
+                                               number = number * 16 + digitValue;
+
+                                               if (can_overflow && number < 16)
+                                                       return false;
+                                       } else
+                                               number = checked (number * 16 + digitValue);
                                }
                                else if (decimalPointFound) {
                                        nDigits++;
@@ -331,12 +342,12 @@ namespace System
                }
 
                [CLSCompliant (false)]
-               public static ulong Parse (string s, NumberStyles style, IFormatProvider fp
+               public static ulong Parse (string s, NumberStyles style, IFormatProvider provider
                {
                        Exception exc;
                        ulong res;
 
-                       if (!Parse (s, style, fp, false, out res, out exc))
+                       if (!Parse (s, style, provider, false, out res, out exc))
                                throw exc;
 
                        return res;
@@ -371,12 +382,12 @@ namespace System
 
                public override string ToString ()
                {
-                       return NumberFormatter.FormatGeneral (new NumberFormatter.NumberStore (m_value));
+                       return NumberFormatter.NumberToString (m_value, null);
                }
 
                public string ToString (IFormatProvider provider)
                {
-                       return NumberFormatter.FormatGeneral (new NumberFormatter.NumberStore (m_value), provider);
+                       return NumberFormatter.NumberToString (m_value, provider);
                }
 
                public string ToString (string format)
@@ -386,8 +397,7 @@ namespace System
 
                public string ToString (string format, IFormatProvider provider)
                {
-                       NumberFormatInfo nfi = NumberFormatInfo.GetInstance (provider);
-                       return NumberFormatter.NumberToString (format, m_value, nfi);
+                       return NumberFormatter.NumberToString (format, m_value, provider);
                }
 
                // =========== IConvertible Methods =========== //