2006-01-24 Chris Toshok <toshok@ximian.com>
[mono.git] / mcs / class / corlib / System.Globalization / CompareInfo.cs
index 68ade8793c87c218a3ec0e67c6467153cdaa342a..3f589ca124d78c0598ecfccd80604783bc5af9c0 100644 (file)
@@ -56,6 +56,9 @@ namespace System.Globalization
                [NonSerialized]
                private IntPtr ICU_collator;
                private int win32LCID;  // Unused, but MS.NET serializes this
+#if NET_2_0
+               private string m_name; // Unused, but MS.NET serializes this
+#endif
 
                [NonSerialized]
                SimpleCollator collator;
@@ -241,7 +244,6 @@ namespace System.Globalization
                                                 CompareOptions.None));
                }
 
-               [MonoTODO("Does not support CompareOptions.OrdinalIgnoreCase")]
                public virtual int Compare (string string1, int offset1,
                                            int length1, string string2,
                                            int offset2, int length2,
@@ -361,6 +363,13 @@ namespace System.Globalization
                public virtual SortKey GetSortKey(string source,
                                                  CompareOptions options)
                {
+#if NET_2_0
+                       switch (options) {
+                       case CompareOptions.Ordinal:
+                       case CompareOptions.OrdinalIgnoreCase:
+                               throw new ArgumentException ("Now allowed CompareOptions.", "options");
+                       }
+#endif
                        if (UseManagedCollation)
                                return collator.GetSortKey (source, options);
                        SortKey key=new SortKey (culture, source, options);
@@ -465,18 +474,15 @@ namespace System.Globalization
                        int count, char c, CompareOptions opt,
                        bool first)
                {
-                       return UseManagedCollation &&
-#if NET_2_0
-                               ((CompareOptions.Ordinal & opt) == 0 &&
-                               (CompareOptions.OrdinalIgnoreCase & opt) == 0) ?
-#else
-                               (CompareOptions.Ordinal & opt) == 0 ?
-#endif
+                       // - forward IndexOf() icall is much faster than
+                       //   manged version, so always use icall. However,
+                       //   it does not work for OrdinalIgnoreCase, so
+                       //   do not avoid managed collator for that option.
+                       return UseManagedCollation && ! (first && opt == CompareOptions.Ordinal) ?
                                internal_index_managed (s, sindex, count, c, opt, first) :
                                internal_index (s, sindex, count, c, opt, first);
                }
 
-               [MonoTODO("Does not support CompareOptions.OrdinalIgnoreCase")]
                public virtual int IndexOf (string source, char value,
                                            int startIndex, int count,
                                            CompareOptions options)
@@ -533,18 +539,15 @@ namespace System.Globalization
                        int count, string s2, CompareOptions opt,
                        bool first)
                {
-                       return UseManagedCollation &&
-#if NET_2_0
-                               ((CompareOptions.Ordinal & opt) == 0 ||
-                               (CompareOptions.OrdinalIgnoreCase & opt) == 0) ?
-#else
-                               (CompareOptions.Ordinal & opt) == 0 ?
-#endif
+                       // - forward IndexOf() icall is much faster than
+                       //   manged version, so always use icall. However,
+                       //   it does not work for OrdinalIgnoreCase, so
+                       //   do not avoid managed collator for that option.
+                       return UseManagedCollation && ! (first && opt == CompareOptions.Ordinal) ?
                                internal_index_managed (s1, sindex, count, s2, opt, first) :
                                internal_index (s1, sindex, count, s2, opt, first);
                }
 
-               [MonoTODO("Does not support CompareOptions.OrdinalIgnoreCase")]
                public virtual int IndexOf (string source, string value,
                                            int startIndex, int count,
                                            CompareOptions options)
@@ -698,7 +701,6 @@ namespace System.Globalization
                                            CompareOptions.None));
                }
 
-               [MonoTODO("Does not support CompareOptions.OrdinalIgnoreCase")]
                public virtual int LastIndexOf(string source, char value,
                                               int startIndex, int count,
                                               CompareOptions options)