This commit was manufactured by cvs2svn to create branch 'mono-1-0'.
[mono.git] / mcs / class / corlib / System.Collections / CaseInsensitiveHashCodeProvider.cs
1 //
2 // System.Collections.CaseInsensitiveHashCodeProvider.cs
3 //
4 // Authors:
5 //   Sergey Chaban (serge@wildwestsoftware.com)
6 //   Andreas Nahr (ClassDevelopment@A-SoftTech.com)
7 //
8
9 //
10 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
11 //
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
19 // 
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
22 // 
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 //
31
32 using System.Globalization;
33
34 namespace System.Collections
35 {
36         [Serializable]
37         [MonoTODO ("Fix serialization compatibility with MS.NET")]
38         public class CaseInsensitiveHashCodeProvider : IHashCodeProvider
39         {
40                 static readonly CaseInsensitiveHashCodeProvider singleton = new CaseInsensitiveHashCodeProvider ();
41                 static readonly CaseInsensitiveHashCodeProvider singletonInvariant = new CaseInsensitiveHashCodeProvider (true);
42
43                 CultureInfo culture;
44
45                 // Public instance constructor
46                 public CaseInsensitiveHashCodeProvider ()
47                 {
48                         culture = CultureInfo.CurrentCulture;
49                 }
50
51                 private CaseInsensitiveHashCodeProvider (bool invariant)
52                 {
53                         // leave culture == null
54                 }
55
56                 public CaseInsensitiveHashCodeProvider (CultureInfo culture)
57                 {
58                         if (culture == null)
59                                 throw new ArgumentNullException ("culture");
60                         if (culture.LCID != CultureInfo.InvariantCulture.LCID)
61                                 this.culture = culture;
62                         // else leave culture == null
63                 }
64
65                 //
66                 // Public static properties
67                 //
68
69                 public static CaseInsensitiveHashCodeProvider Default {
70                         get {
71                                 return singleton;
72                         }
73                 }
74
75 #if NET_1_1
76                 public
77 #else
78                 internal
79 #endif
80                 static CaseInsensitiveHashCodeProvider DefaultInvariant {
81                         get {
82                                 return singletonInvariant;
83                         }
84                 }
85
86                 //
87                 // IHashCodeProvider
88                 //
89
90                 public int GetHashCode (object obj)
91                 {
92                         if (obj == null)
93                                 throw new ArgumentNullException ("obj");
94
95                         string str = obj as string;
96
97                         if (str == null)
98                                 return obj.GetHashCode ();
99
100                         int h = 0;
101                         char c;
102
103                         if (culture != null) {
104                                 for (int i = 0; i < str.Length; i++) {
105                                         c = Char.ToLower (str [i], culture);
106                                         h = h * 31 + c;
107                                 }
108                         }
109                         else {
110                                 for (int i = 0; i < str.Length; i++) {
111                                         c = Char.ToLowerInvariant (str [i]);
112                                         h = h * 31 + c;
113                                 }
114                         }
115                         return h;
116                 }
117         }
118 }