2005-01-10 Sebastien Pouliot <sebastien@ximian.com>
[mono.git] / mcs / class / corlib / System.Collections.Generic / Comparer.cs
1 //
2 // Comparer
3 //
4 // Authors:
5 //      Ben Maurer (bmaurer@ximian.com)
6 //
7 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28
29 #if NET_2_0
30 using System;
31 using System.Runtime.InteropServices;
32
33 namespace System.Collections.Generic {
34         [CLSCompliant(false)]
35         public abstract class Comparer<T> : IComparer<T>, System.Collections.IKeyComparer,
36                 System.Collections.IComparer, System.Collections.IHashCodeProvider {
37         
38                 public Comparer () {} /* workaround 60438 by not having a protected ctor */
39                 public abstract int Compare (T x, T y);
40                 public virtual bool Equals (T x, T y)
41                 {
42                         return Compare (x, y) == 0;
43                 }
44                 public virtual int GetHashCode (T obj)
45                 {
46                         if (obj == null)
47                                 throw new ArgumentNullException ();
48                         return obj.GetHashCode ();
49                 }
50         
51                 static DefaultComparer <T> _default;
52                 
53                 [MonoTODO ("This is going to make a really slow comparer. We need to speed this up if T : ICompareable<T> create a class with a where clause of T : ICompareable <T>")]
54                 public static Comparer<T> Default {
55                         get {
56                                 if (_default != null)
57                                         return _default;
58                                 return _default = new DefaultComparer<T> ();
59                         }
60                 }
61         
62                 int System.Collections.IComparer.Compare (object x, object y)
63                 {
64                         
65                         if (x == null)
66                                 return y == null ? 0 : -1;
67                         if (y == null)
68                                 return 1;
69                         
70                         if (x is T && y is T)
71                                 return Compare ((T) x, (T) y);
72                         
73                         throw new ArgumentException ();
74                 }
75         
76                 bool System.Collections.IKeyComparer.Equals (object x, object y)
77                 {
78                         if (x == y)
79                                 return true;
80                         
81                         if (x == null || y == null)
82                                 return false;
83                         
84                         if (x is T && y is T)
85                                 return Equals ((T) x, (T) y);
86                         
87                         throw new ArgumentException ();
88                 }
89         
90                 int System.Collections.IHashCodeProvider.GetHashCode (object obj)
91                 {
92                         if (obj == null)
93                                 throw new ArgumentNullException ();
94                         if (obj is T)
95                                 return GetHashCode ((T) obj);
96                         
97                         throw new ArgumentException ();
98                 }
99         
100                 class DefaultComparer<T> : Comparer<T> {
101         
102                         public override int Compare (T x, T y)
103                         {
104                                 // `null' is less than any other ref type
105                                 if (x == null)
106                                         return y == null ? 0 : -1;
107                                 else if (y == null)
108                                         return 1;
109         
110                                 if (x is IComparable<T>)
111                                         return ((IComparable<T>) x).CompareTo (y);
112                                 else if (x is IComparable)
113                                         return ((IComparable) x).CompareTo (y);
114                                 else
115                                         throw new ArgumentException ("does not implement right interface");
116                         }
117         
118                         public override bool Equals (T x, T y)
119                         {
120                                 return Object.Equals (x, y);
121                         }
122                 }
123         }
124
125 }
126 #endif